使用 AES-128/CBC 时 EVP_DecryptFinal_ex 中的分段错误

Segmentation fault in EVP_DecryptFinal_ex when using AES-128/CBC

这是我之前问题的延续:

我正在尝试使用 C OpenSSL EVP 库进行加密和解密。在收到上述问题的答案后,我相应地更新了我的代码:

这个变量:

int len = outlen1 + outlen2;

存储加密函数中加密的字节数。然后我将该变量传递给解密函数(下面的代码中没有显示传递),然后使用据推测的实际字节数。

然而,在某些输入字符串上,我在 EVP_DecryptFinal_ex() 函数中遇到分段错误。

字节数encrypted/decrypted或填充明显有问题。我只是不知道那是什么。

 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;
    }

注意:

我能够解决我之前遇到的 decrypt final 无法解密某些字符串的问题。现在可以很好地解密这些字符串。然而,其他一些字符串也面临同样的问题,但这次我遇到了段错误。

不能对二进制数据使用字符串函数。如果二进制数据与随机数据无法区分,情况尤其如此。随机二进制数据可能在任何地方包含空字符,或者根本不包含空字符。 strdup 在内部使用 strcpy,这依赖于 null 字符的存在。