Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       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/ に書かれている。

                                            2020-11-01                                 ENCRYPT(3)