c - openssl解密找不到和加密前一样的值

标签 c apache encryption openssl

我正在使用 DES_ecb_encrypt 来加密 cookie,然后我正在解密相同的值,我希望找到完全相同的值。

我正在使用这些功能:

void algo_crypt(request_rec *r) {
    char cookie[] = "VAR=USER123456";
    unsigned char key_md5[16];
    int len;
    const_DES_cblock *input;
    DES_cblock *output;
    unsigned char in[BUFSIZE], out[BUFSIZE], back[BUFSIZE];
    unsigned char *e = out;
    DES_cblock key = "MyKey";
    DES_cblock seed = {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10};
    DES_key_schedule keysched;

    memset(in, 0, sizeof(in));
    memset(out, 0, sizeof(out));
    memset(back, 0, sizeof(back));

     DES_set_key((C_Block *)key, &keysched);

     strcpy(in, cookie);

     ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Plaintext: [%s]\n", in);

     DES_ecb_encrypt((C_Block *)cookie,(C_Block *)out, &keysched, DES_ENCRYPT);

     am_cookie_set(r, out);

     ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Ciphertext out: %s", out);

     while (*e)
         ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
             "algo_crypt [%02x] ", *e++);

}

这个用于解密:

void algo_decrypt(request_rec *r) {
    unsigned char key_md5[16];
    int len;
    const_DES_cblock *input;
    DES_cblock *output;
    unsigned char in[BUFSIZE], back[BUFSIZE];
    unsigned char out[] = {0xb8, 0xa8, 0xb0, 0x54, 0x40, 0x23, 0xd1, 0x25};
    unsigned char *e = out;

    DES_cblock key = "MyKey";
    DES_key_schedule keysched;

    memset(back, 0, sizeof(back));

    DES_set_key((C_Block *)key, &keysched);

    char *mycookie = am_cookie_get(r);

    DES_ecb_encrypt((C_Block *)mycookie, (C_Block *)back, &keysched, DES_DECRYPT);

    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Decrypted Text: [%s]\n", back);
}

但是打印返回这个:

Decrypted Text: [VAR=USER]\n

我做错了什么?

我正在使用 openssl、C,我正在使用 ubuntu 在 Apache 上工作

最佳答案

我看到两个未使用的 key_md5 变量。您可能需要对“ key ”输入执行 MD5 哈希,这实际上是密码,而不是 key 。

现在的问题是 DES 需要一个 56 位 key ,以 8 字节编码(每字节 1 位奇偶校验)。但是,您的“ key ”由 5 个字符/字节组成。所以三个字节是未知的。如您所见,C 函数不包含长度参数,并且它不知道数组的大小(因为它只是一个指针)。

所以它需要 5 个字符和紧跟在它们后面的 3 个字节。由于这些可能具有任何值(value),因此您将得到不确定的结果。当然,由于分组密码的输出看起来是随机的,因此不可能检测到这一点;然而,它仍然会在解密时失败,除非你非常“幸运”并且在 "MyKey" 字符串后面具有相同的值用于加密和解密。

关于c - openssl解密找不到和加密前一样的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46281254/

相关文章:

linux - 减少日志文件搜索的重复输出的问题

c - evp_crypt 在 c 中的 for 循环中不起作用

php - 如何加密存储在 MySQL 中的 API token 并根据请求反转它们?

c - 在 ubuntu 中执行程序时出现 C 段错误

php - 用于 PHP 开发的有用 Apache 模块列表

Git 克隆在受证书保护的 apache 后面通过 gitlab 故障转移 https

java - 仿射密码解密过程错误结果

c - 如何在该程序中利用缓冲区溢出并将参数传递给 system() 函数?

c - 使用 C 从数组中提取特定数字

我可以从指针地址(在 Linux 上的 C 中)获取 NUMA 节点吗?