ENCRYPT(3)

НАЗВАНИЕ
encrypt, setkey, encrypt_r, setkey_r - 64-битное кодирование сообщений

СИНТАКСИС
#define _XOPEN_SOURCE
#include <unistd.h>

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

#define _XOPEN_SOURCE
#include <stdlib.h>

void setkey(const char *key);

#define _GNU_SOURCE
#include <crypt.h>

void setkey_r (const char *key, struct crypt_data *data);
void encrypt_r (char *block, int edflag, struct crypt_data *data);

Все это требует привязки к -lcrypt.

ОПИСАНИЕ
Эти функции кодируют и декодируют 64-битные сообщения. Функция setkey() устанавливает ключ, используемый encrypt(). Параметр key является массивом из 64 байтов, каждый из которых имеет значение 1 или 0. Все байты key[n], где n=8*i-1 - игнорируются, так что действительная длина ключа равна 56 битам.

Функция encrypt() модифицирует переданный буфер, и если edflag равно 0, то кодирует его, а если равно 1 - то декодирует.

Как и параметр key, block также является представлением битового вектора действительного кодируемого значения. Результат возвращается в этом же векторе.

Эти две функции не являются повторно используемыми, то есть данные ключа key хранятся в статическом хранилище. Функции setkey_r() и encrypt_r() являются повторно используемыми. они используют следующую структуру для хранения данных key:
    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 int current_saltbits;
          int  direction, initialized;
    };

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
Эти функции ничего не возвращают.

НАЙДЕННЫЕ ОШИБКИ
Установите переменную errno в ноль перед вызовом этих функций. При нормальном завершении работы ее значение не изменится.

ENOSYS
    Функция не предусмотрена. (Например, из-за старых запретов США на экспорт.)

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ
Необходимо привязаться к libcrypt для сборки этого примера с glibc2.2. Для правильной работы массивы key[] и txt[] должны быть заполнены полезными значениями. Заметим, что заголовок <crypt.h> безоговорочно дает прототипы для setkey() и encrypt().

#include <crypt.h>

main() {
  char key[64];      /* битовый шаблон для ключа key */
  char txt[64];      /* битовый шаблон для сообщений */
  setkey(key);
  encrypt(txt, 0);   /* кодирование */
  encrypt(txt, 1);   /* декодирование */
}

ЗАМЕЧАНИЯ
В glibc2.2 эти функции используют алгоритм DES.

СООТВЕТСТВИЕ СТАНДАРТАМ
Функции encrypt() и setkey() соответствуют SVID, SUSv2, and POSIX 1003.1-2001. Функции encrypt_r() и setkey_r() являются расширениями GNU.

СМ. ТАКЖЕ
cbc_crypt(3), crypt(3), ecb_crypt(3), fcrypt(3)