建议和反馈

请填写你的反馈内容

问答 > 密码学 > 问答详情
已解决

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

我正在使用此处的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;
}

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

如果它之前的字符串被加密就像cat dog cow一样,解密就行了。

但如果它像bat dog cow一样,解密就会在EVP_DecryptFinal_ex()函数中失败。

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

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


2019-12-05
0
请先登陆或注册

没那么难2019-12-05

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

投一票
评论(0)
赞赏(0)

求助中

解决了这个问题,预计可以帮助到

  • 0
  • 2
  • 9
  • 3
  • 7
邀请

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励