ENCRYPT - Linux手册页

时间:2019-08-20 18:01:16  来源:igfitidea点击:

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

InterfaceAttributeValue
encrypt(),setkey()Thread safetyMT-Unsafe race:crypt
encrypt_r(),setkey_r()Thread safetyMT-Safe

遵循规范

crypto(),setkey():POSIX.1-2001,POSIX.1-2008,SUS,SVr4。

函数crypto_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];
    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);
}

另外参见

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

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/