gpt4 book ai didi

c - 使用 AES-128/CBC 时 EVP_DecryptFinal_ex 间歇性解密失败

转载 作者:行者123 更新时间:2023-11-30 15:14:22 29 4
gpt4 key购买 nike

我正在使用此处找到的 EVP 库:https://www.openssl.org/docs/manmaster/crypto/EVP_EncryptInit.html

这是我的两个加密和解密函数:

我正在尝试使用 AES 128 CBC 加密字符串。

字符串通常采用以下格式:word1 word2 word3

char* encrypt(char *s, char *key) {
unsigned char iv[16] = {[0 ... 15 ] = 0};
unsigned char outbuf[1024] = {[0 ... 1023] = 0};
int outlen1, outlen2;

EVP_CIPHER_CTX ctx;

EVP_CIPHER_CTX_init(&ctx);
EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv);
if (EVP_EncryptUpdate(&ctx, outbuf, &outlen1, s, strlen(s)) == 1) {
if (EVP_EncryptFinal_ex(&ctx, outbuf + outlen1, &outlen2) == 1) {
EVP_CIPHER_CTX_cleanup(&ctx);
return strdup(outbuf);
}
}
EVP_CIPHER_CTX_cleanup(&ctx);
return NULL;
}

char* decrypt(char *s, char *key) {
unsigned char iv[16] = {[0 ... 15 ] = 0};
unsigned char outbuf[1024] = {[0 ... 1023] = 0};
int outlen1, outlen2;

EVP_CIPHER_CTX ctx;

EVP_CIPHER_CTX_init(&ctx);
EVP_DecryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv);
if (EVP_DecryptUpdate(&ctx, outbuf, &outlen1, s, strlen(s)) == 1) {
printf("After decrypt update\n");
if (EVP_DecryptFinal_ex(&ctx, outbuf + outlen1, &outlen2) == 1) {
printf("After decrypt final\n");
EVP_CIPHER_CTX_cleanup(&ctx);
return strdup(outbuf);
}
}
EVP_CIPHER_CTX_cleanup(&ctx);
return NULL;
}

问题是解密最终函数适用于某些字符串,但不适用于其他字符串。

如果加密前的字符串类似于catdogcow,则解密有效。

但是如果它像batdogcow,解密会失败,特别是在EVP_DecryptFinal_ex()函数处。

对于某些字符串,在 EVP_DecryptFinal_ex() 函数处解密总是失败。它不会返回 1。

知道问题出在哪里吗?也许是填充?我只是似乎无法弄清楚。

最佳答案

您可能错过了加密字符串可能包含零字节,因此 DecryptUpdate 中的 strlen 值太低。您必须在加密时记住加密数据的长度,并使用该值进行解密。

关于c - 使用 AES-128/CBC 时 EVP_DecryptFinal_ex 间歇性解密失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34096894/

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