gpt4 book ai didi

c - EVP 加密核心已转储

转载 作者:行者123 更新时间:2023-11-30 20:19:31 25 4
gpt4 key购买 nike

我正在尝试解密使用 EVP 中的 AES_128_cbc() 加密的密文,该密文存在于名为 task3.bin 的文件中。我正在尝试进行模拟解密试验,这意味着解密未使用正确的 key iv,但长度有效。

这两个函数是从 EVP 的 documentation page 复制粘贴的,只不过解密方法 EVP_aes_256_cbc() 已更改为 EVP_aes_128_cbc()

void handleErrors(void) {
ERR_print_errors_fp(stderr);
abort();
}

int decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key,unsigned char *iv, unsigned char *plaintext) {
EVP_CIPHER_CTX *ctx;

int len;

int plaintext_len;

/* Create and initialise the context */
if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors();

/* Initialise the decryption operation. (changed 256 to 128 HERE!!!)*/
if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))
handleErrors();

/* Provide the message to be decrypted, and obtain the plaintext output.
* EVP_DecryptUpdate can be called multiple times if necessary
*/
if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
handleErrors();
plaintext_len = len;

/* Finalise the decryption. Further plaintext bytes may be written at
* this stage.
*/
if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) handleErrors();
plaintext_len += len;

/* Clean up */
EVP_CIPHER_CTX_free(ctx);

return plaintext_len;
}

这是我的 main 函数,它调用 decrypt

int main(void) {
FILE *f;
long lSize;
char *buffer;

char *ciphertext;
unsigned char *iv;
unsigned char *key;

unsigned char decryptedtext[128];
int decryptedtext_len;

// read ciphertext
f = fopen("task3.bin", "rb");
fseek( f , 0L , SEEK_END);
lSize = ftell( f );
rewind( f );
ciphertext = calloc( 1, lSize+1 );
fread(ciphertext , lSize, 1 , f);
fclose(f);

// testing key and iv
key = (unsigned char *)"0123456789012345";
iv = (unsigned char *)"0000000000000000";

// decrypt!
decryptedtext_len = decrypt(ciphertext, strlen((char *)ciphertext), key, iv, decryptedtext);

return 0;
}

我收到错误 139864800151232:error:06065064:lib(6):func(101):reason(100):evp_enc.c:529:
中止(核心转储)
,我花了几个小时查看它,但没有取得太大成功。任何精通 OpenSSL 的人请帮忙。

<小时/>

该错误来自 EVP_DecryptFinal_ex,即 decrypt 中的最后一个 EVP 调用。我只能假设某些长度没有正确分配。

最佳答案

如果您解密使用 PKCS#7 填充(通常情况)加密的数据,则使用不正确的 key 解密大多数情况下会导致填充错误。

由于填充位于最后一个 block 中,因此会在 EVP_DecryptFinal 调用中进行检查,以便一切都有意义。

模拟解密很难甚至不可能,具体取决于加密算法、模式和填充量等其他因素。

注意:OpenSSL EVP 文档声明:“OpenSSL 默认使用 PKCS 填充”,这是一种逃避,因为它没有声明 PKCS#5 或 PKCS#7。我必须假设 AES 为 PKCS#7。

关于c - EVP 加密核心已转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49867330/

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