ENCRYPT - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
encrypt, setkey, encrypt_r, setkey_r-加密64位消息
语法
#define _XOPEN_SOURCE /* See feature_test_macros(7) */ #include <unistd.h> void encrypt(char block[64], int edflag); #define _XOPEN_SOURCE /* See feature_test_macros(7) */ #include <stdlib.h> void setkey(const char *key); #define _GNU_SOURCE /* See 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()函数设置crypto()使用的密钥。此处使用的key参数是一个64个字节的数组,每个数组的数字值为1或0。忽略其中key = n = 8 * i-1的字节key [n],因此有效密钥长度为56位。
crypto()函数修改所传递的缓冲区,如果edflag为0,则编码,如果传递1,则解码。与key参数一样,block也是编码后的实际值的位向量表示。结果以相同的向量返回。
这两个函数不可重入,即关键数据保存在静态存储中。函数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 int current_saltbits;
int direction;
int initialized;
};
在调用setkey_r()之前,将data-> initialized设置为零。
返回值
这些函数不返回任何值。
错误说明
在调用上述函数之前,将errno设置为零。成功的话,它不变。
- ENOSYS
- 未提供该功能。 (例如,由于以前的美国出口限制。)
版本
由于它们使用了不再被认为是安全的DES分组密码,因此在glibc 2.28中删除了crypt(),crypt_r(),setkey()和setkey_r()。应用程序应切换到现代加密库,例如libgcrypt。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
| Interface | Attribute | Value |
| encrypt(),setkey() | Thread safety | MT-Unsafe race:crypt |
| encrypt_r(),setkey_r() | Thread safety | MT-Safe |
遵循规范
crypto(),setkey():POSIX.1-2001,POSIX.1-2008,SUS,SVr4。
函数crypto_r()和setkey_r()是GNU扩展。
示例
#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];
int i, j;
for (i = 0; i < 64; i++) {
key[i] = rand() & 1;
}
for (i = 0; i < 8; i++) {
for (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 (i = 0; i < 8; i++) {
for (j = 0, txt[i] = aq##代码##aq; j < 8; j++) {
txt[i] |= buf[i * 8 + j] << j;
}
txt[8] = aq##代码##aq;
}
printf("After encrypting: %s\n", txt);
encrypt(buf, 1);
for (i = 0; i < 8; i++) {
for (j = 0, txt[i] = aq##代码##aq; j < 8; j++) {
txt[i] |= buf[i * 8 + j] << j;
}
txt[8] = aq##代码##aq;
}
printf("After decrypting: %s\n", txt);
exit(EXIT_SUCCESS);
}
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。

