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/。