我尝试解密使用AES_128_cbc()
中的EVP
加密的密文,密文存在于名为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:
Aborted (core dumped)
并且我花了好几个小时看着它而没有太大的成功。 OpenSSL
的任何技术人员,请帮助。
错误来自EVP_DecryptFinal_ex
,即EVP
中的最后decrypt
次来电。我只能假设某些长度没有正确分配。
答案 0 :(得分:1)
如果解密使用PKCS#7填充加密的数据(通常情况下),使用错误密钥进行解密将导致大部分时间出现填充错误。
由于填充位于最后一个块中,因此会在EVP_DecryptFinal
调用中进行检查,以便一切都有意义。
根据加密算法,模式和填充量等其他因素,很难实现模拟解密。
注意:OpenSSL EVP文档声明:“ OpenSSL默认情况下使用PKCS填充”,这是一个警察,因为它不会说PKCS#5或PKCS#7。对于AES,我必须假设PKCS#7。