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

时间:2015-12-04 20:29:43

标签: c encryption openssl cryptography evp-cipher

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

以下是我的两个加密和解密功能:

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

字符串的格式通常为loop .. recur

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; } ,则解密有效。

但如果它像cat dog cow那样,则解密特别在bat dog cow函数处失败。

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

知道问题可能是什么?填充可能吗?我似乎无法弄明白。

1 个答案:

答案 0 :(得分:1)

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