gpt4 book ai didi

C Libmcrypt 无法加密/解密成功

转载 作者:太空宇宙 更新时间:2023-11-04 04:04:31 25 4
gpt4 key购买 nike

我正在使用 c 语言的 libmcrypt 并尝试使用 rijndael-256 作为所选算法来实现简单的加密和解密测试。我已经将这个测试实现非常接近于使用 rijndael 的手册页示例,而不是他们选择的算法。当使用字符串 gcc -o encryption_test main.c -lmcrypt 编译时,以下源代码产生类似于以下的输出:加密消息缓冲区包含 j��A��8 ��qj��%`��jh����=ZЁ��j原始字符串为��m"��C��D������Y��G��v6��s��zh��

显然,解密部分失败了,但由于它只是一个函数调用,这让我相信加密方案的行为也不正确。如果您能指出正确的方向,我有几个问题要问 libmcrypt 专家。

首先,是什么导致这段代码产生这个错误的输出?

其次,在处理强制固定大小(例如 key 大小和 block 大小)时,例如 256 位 key ,该函数是否期望 32 字节的 key + 尾随的空字节,31 字节的 key +尾随的空字节,或 32 字节的 key 与第 33 个字节无关?同样的问题也适用于 block 大小。

最后,我提到的其中一个示例使用 mhash 生成 key 文本的散列以提供给加密调用,这当然更可取,但它被注释掉并且 mhash 中的链接似乎失败了。使用 libmcrypt 时,可接受的处理此类 key 转换的方法是什么?我选择将任何此类复杂性排除在外,以防止进一步复杂化已经损坏的代码,但我想将其纳入最终设计。以下是有问题的源代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <mcrypt.h>

int main(int argc, char *argv[])
{
MCRYPT mfd;
char *key;
char *plaintext;
char *IV;
unsigned char *message, *buffered_message, *ptr;
int i, blocks, key_size = 32, block_size = 32;

message = "Test Message";

/** Buffer message for encryption */
blocks = (int) (strlen(message) / block_size) + 1;
buffered_message = calloc(1, (blocks * block_size));

key = calloc(1, key_size);
strcpy(key, "&*GHLKPK7G1SD4CF%6HJ0(IV#X6f0(PK");

mfd = mcrypt_module_open(MCRYPT_RIJNDAEL_256, NULL, "cbc", NULL);

if(mfd == MCRYPT_FAILED)
{
printf("Mcrypt module open failed.\n");
return 1;
}

/** Generate random IV */
srand(time(0));
IV = malloc(mcrypt_enc_get_iv_size(mfd));
for(i = 0; i < mcrypt_enc_get_iv_size(mfd); i++)
{
IV[i] = rand();
}

/** Initialize cipher with key and IV */
i = mcrypt_generic_init(mfd, key, key_size, IV);
if(i < 0)
{
mcrypt_perror(i);
return 1;
}

strncpy(buffered_message, message, strlen(message));
mcrypt_generic(mfd, buffered_message, block_size);
printf("The encrypted message buffer contains %s\n", buffered_message);
mdecrypt_generic(mfd, buffered_message, block_size);
printf("The original string was %s\n", buffered_message);
mcrypt_generic_deinit(mfd);
mcrypt_module_close(mfd);
return 0;
}

最佳答案

解密需要重新初始化描述符mfd,加密和解密不能使用同一个描述符。

关于C Libmcrypt 无法加密/解密成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7809566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com