名前

encrypt, setkey, encrypt_r, setkey_r - 64 ビットのメッセージを暗号化する

書式

#define _XOPEN_SOURCE       /* feature_test_macros(7) 参照 */
#include <unistd.h>
void encrypt(char block[64], int edflag);
#define _XOPEN_SOURCE /* feature_test_macros(7) 参照 */ #include <stdlib.h>
void setkey(const char *key);
#define _GNU_SOURCE /* feature_test_macros(7) 参照 */ #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 である。 n=8*i-1 に対するバイト key[n] は無視されるので、 有効な暗号鍵の長さは 56 ビットになる。
encrypt() 関数は、 edflag が 0 の場合は暗号化し、1 が渡された場合は復号化するというように、 渡されたバッファーを変更する。 引数 key と同様に、 block はエンコードされた実際の値を表現するビットの配列である。 結果はこの同じ配列を使って返される。
これら 2 つの関数はリエントラント (reentrant) ではない。 つまり暗号鍵データは静的な領域に保存される。 関数 setkey_r() と encrypt_r() はリエントラントなバージョンである。 これらの関数は暗号鍵データを保持するために以下のような構造体を使う。

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;
};

setkey_r() を呼び出す前には、 data->initialized を 0 に設定すること。

返り値

これらの関数は、なにも値を返さない。

エラー

上記の関数を呼び出す前に errno を 0 に設定すること。 成功した場合、この値は変更されない。
ENOSYS
(例えば以前のアメリカ合衆国輸出規制などにより) この関数が提供されていない。

バージョン

Because they employ the DES block cipher, which is no longer considered secure, crypt(), crypt_r(), setkey(), and setkey_r() were removed in glibc 2.28. Applications should switch to a modern cryptography library, such as libgcrypt.

属性

この節で使用されている用語の説明については、 attributes(7) を参照。
インターフェース 属性
encrypt(), setkey() Thread safety MT-Unsafe race:crypt
encrypt_r(), setkey_r() Thread safety MT-Safe

準拠

encrypt(), setkey(): POSIX.1-2001, POSIX.1-2008, SUS, SVr4.
関数 encrypt_r() と setkey_r() は GNU による拡張である。

注意

Availability in glibc

crypt(3) を参照。

Features in glibc

glibc 2.2 では、これらの関数は DES アルゴリズムを使う。

#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <crypt.h>
int main(void) { char key[64]; char orig[9] = "eggplant"; char buf[64]; char txt[9];
for (int i = 0; i < 64; i++) { key[i] = rand() & 1; }
for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { buf[i * 8 + j] = orig[i] >> j & 1; } setkey(key); } printf("Before encrypting: %s\n", orig);
encrypt(buf, 0); for (int i = 0; i < 8; i++) { for (int j = 0, txt[i] = '\0'; j < 8; j++) { txt[i] |= buf[i * 8 + j] << j; } txt[8] = '\0'; } printf("After encrypting: %s\n", txt);
encrypt(buf, 1); for (int i = 0; i < 8; i++) { for (int j = 0, txt[i] = '\0'; j < 8; j++) { txt[i] |= buf[i * 8 + j] << j; } txt[8] = '\0'; } printf("After decrypting: %s\n", txt); exit(EXIT_SUCCESS); }

関連項目

cbc_crypt(3), crypt(3), ecb_crypt(3)

この文書について

この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。

Recommended readings

Pages related to setkey you should read also: