encrypt(3)

NAZWA
encrypt, setkey, encrypt_r, setkey_r - szyfruje komunikaty 64-bitowe

BIBLIOTEKA
Biblioteka szyfrowania haseł (libcrypt, -lcrypt)

SKŁADNIA
#define _XOPEN_SOURCE       /* Patrz feature_test_macros(7) */
#include <unistd.h>

[[przestarzałe]] void encrypt(char block[64], int edflag);

#define _XOPEN_SOURCE       /* Patrz feature_test_macros(7) */
#include <stdlib.h>

[[przestarzałe]] void setkey(const char *key);

#define _GNU_SOURCE         /* Patrz feature_test_macros(7) */
#include <crypt.h>

[[przestarzałe]] void setkey_r(const char *key, struct crypt_data *data);
[[przestarzałe]] void encrypt_r(char *block, int edflag,
                              struct crypt_data *data);

OPIS
Funkcje te szyfrują i rozszyfrowują 64-bitowe komunikaty. Funkcja setkey() ustawia klucz używany przez encrypt(). Używany tu argument key jest tablicą 64 bajtów, z których każdy ma wartość numeryczną 1 lub 0. Bajty key[n], gdzie n=8*i-1, są ignorowane tak, że efektywna długość klucza to 56 bitów.

Funkcja encrypt() modyfikuje przekazany bufor, szyfrując go jeśli edflag wynosi 0 i rozszyfrowując, jeśli wynosi 1. Podobnie jak przy argumencie key również block jest reprezentacją wektora bitów rzeczywistej wartości, która jest szyfrowana. Wynik jest zwracany w tym samym wektorze.

Te dwie funkcje nie są wielobieżne tj. dane klucza są przechowywane statycznie. Wariantami wielobieżnymi są funkcje setkey_r() i encrypt_r(). Używają one następującej struktury do przechowywania danych klucza:

    struct crypt_data {
        char keysched[16 * 8];
        char sb0[32768];
        char sb1[32768];
        char sb2[32768];
        char sb3[32768];
        char crypt_3_buf[14];
        char current_salt[2];
        long current_saltbits;
        int  direction;
        int  initialized;
    };

Przed wywołaniem setkey_r() należy ustawić data->initialized na zero.

WARTOŚĆ ZWRACANA
Funkcje te nie zwracają żadnej wartości.

BŁĘDY
Należy ustawić errno na zero przed wywołaniem powyższych funkcji. W razie powodzenia, errno nie jest zmieniane.

ENOSYS
    Funkcja nie jest dostępna (np. ze względu na dawne ograniczenia eksportowe Stanów Zjednoczonych).

ATRYBUTY
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).
Interfejs | Atrybut | Wartość
encrypt(), setkey() | Bezpieczeństwo wątkowe | MT-niebezpieczne race:crypt
encrypt_r(), setkey_r() | Bezpieczeństwo wątkowe | MT-bezpieczne

STANDARDY

encrypt()
setkey()
    POSIX.1-2008.

encrypt_r()
setkey_r()
    Brak.

HISTORIA
Usunięte w glibc 2.28.

Ze względu na korzystanie z szyfru blokowego DES, który nie jest już uważany za bezpieczny, funkcje te usunięto z glibc. Aplikacje powinny obecnie korzystać ze współczesnej biblioteki kryptograficznej, takiej jak libgcrypt.

encrypt()
setkey()
    POSIX.1-2001, SUS, SVr4.

  Dostępność w glibc
Zobacz crypt(3).

  Funkcjonalność w glibc
W glibc 2.2, funkcje te korzystają z algorytmu DES.

PRZYKŁADY
    #define _XOPEN_SOURCE
    #include <crypt.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>

    int
    main(void)
    {
        char key[64];
        char orig[9] = "eggplant";
        char buf[64];
        char txt[9];

        for (size_t i = 0; i < 64; i++) {
            key[i] = rand() & 1;
        }

        for (size_t i = 0; i < 8; i++) {
            for (size_t j = 0; j < 8; j++) {
                buf[i * 8 + j] = orig[i] >> j & 1;
            }
            setkey(key);
        }
        printf("Przed szyfrowaniem: %s\n", orig);

        encrypt(buf, 0);
        for (size_t i = 0; i < 8; i++) {
            for (size_t j = 0, txt[i] = '\0'; j < 8; j++) {
                txt[i] |= buf[i * 8 + j] << j;
            }
            txt[8] = '\0';
        }
        printf("Po szyfrowaniu:  %s\n", txt);

        encrypt(buf, 1);
        for (size_t i = 0; i < 8; i++) {
            for (size_t j = 0, txt[i] = '\0'; j < 8; j++) {
                txt[i] |= buf[i * 8 + j] << j;
            }
            txt[8] = '\0';
        }
        printf("Po odszyfrowaniu:  %s\n", txt);
        exit(EXIT_SUCCESS);
    }

ZOBACZ TAKŻE
cbc_crypt(3), crypt(3), ecb_crypt(3)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.