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
による拡張である。
crypt(3) を参照。
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/
に書かれている。