这是我上一个问题的延续:Intermittent decryption failures in EVP_DecryptFinal_ex when using AES-128/CBC。
我正在尝试使用C OpenSSL EVP库加密和解密。在我收到上述问题的答案后,我相应地更新了我的代码:
这个变量:
int len = outlen1 + outlen2;
存储加密函数中加密的字节数。然后我将该变量传递给decrypt函数(传递未在下面的代码中显示),然后使用所谓的实际字节数。
但是在某些输入字符串上,我在EVP_DecryptFinal_ex()
函数处得到了分段错误。
加密/解密或填充的字节数明显错误。我只是不知道那是什么。
char* encrypt(char *key, char *s) {
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);
len = outlen1 + outlen2;
return strdup(outbuf);
}
}
EVP_CIPHER_CTX_cleanup(&ctx);
return NULL;
}
char* decrypt(char *key, char *s, int len) {
unsigned char iv[16] = {[0 ... 15 ] = 0};
unsigned char outbuf[1024] = {[0 ... 1023] = 0};
int outlen1, outlen2;
printf("len: %d\n", len);
printf("strlen(s): %d\n", strlen(s));
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, len) == 1) {
printf("After update\n");
if (EVP_DecryptFinal_ex(&ctx, outbuf + outlen1, &outlen2) == 1) {
printf("After final\n");
EVP_CIPHER_CTX_cleanup(&ctx);
return strdup(outbuf);
}
}
EVP_CIPHER_CTX_cleanup(&ctx);
return NULL;
}
注意:
我能够解决我之前遇到的问题,即解密最终将无法解密某些字符串。这些字符串现在可以解密。但是,其他一些字符串也遇到了同样的问题,但这次我遇到了seg错误。
答案 0 :(得分:2)
您不能在二进制数据上使用字符串函数。如果二进制数据与随机数据无法区分,则情况尤其如此。随机二进制数据可以在任何地方包含空字符,或者根本不包含。 strdup
在内部使用strcpy
,这取决于null
字符的存在。