OpenSSL и AES - PullRequest
       42

OpenSSL и AES

1 голос
/ 28 марта 2012

Я работаю с OpenSSL lib и получаю очень странный эффект с AES encrypt / decrypt: если я изменю некоторый байт в зашифрованном сообщении и расшифрую его, я увижу ту часть исходного сообщения, которая не предполагаетбыть.Это исходный код:

#include <openssl/evp.h> 
#include <string.h>

int do_crypt(void) 
{  
 int outlen, inlen;  
 FILE *in, *out;  
 in = fopen("in.txt", "r"); 
 out = fopen("out.txt", "w"); 
 unsigned char key[32];
 strcpy(key, "10000000000000000000000000000002"); 
 unsigned char iv[8];
 unsigned char inbuf[BUFSIZE], outbuf[BUFSIZE];  
 EVP_CIPHER_CTX ctx;  
 const EVP_CIPHER * cipher;    


 EVP_CIPHER_CTX_init(&ctx);   
 cipher = EVP_aes_256_cfb(); 
 EVP_EncryptInit(&ctx, cipher, key, 0); 

while(1) {                    
 inlen = fread(inbuf, 1, BUFSIZE, in);  
 if(inlen <= 0) break;  
 if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, inbuf, inlen)) return 0;  
 fwrite(outbuf, 1, outlen, out);  
 }    

if(!EVP_EncryptFinal(&ctx, outbuf, &outlen)) return 0;  
 fwrite(outbuf, 1, outlen, out);  
 EVP_CIPHER_CTX_cleanup(&ctx);  
 return 1;  
} 

int do_decrypt(char *infile) 
{  
 int outlen, inlen;  
 FILE *in, *out;  
 in = fopen("out.txt", "r"); 
 out = fopen("out2.txt", "w"); 
 unsigned char key[32];
 strcpy(key, "10000000000000000000000000000002"); 
 unsigned char iv[8];  
 unsigned char inbuf[BUFSIZE], outbuf[BUFSIZE];  
 EVP_CIPHER_CTX ctx;  

 EVP_CIPHER_CTX_init(&ctx);  
 EVP_DecryptInit(&ctx, EVP_aes_256_cfb(), key, 0);  

 while(1) {  
 inlen = fread(inbuf, 1, BUFSIZE, in);  
 if(inlen <= 0) break;  
 if(!EVP_DecryptUpdate(&ctx, outbuf, &outlen, inbuf, inlen)) return 0; 
 fwrite(outbuf, 1, outlen, out);  
 }  

 if(!EVP_DecryptFinal(&ctx, outbuf, &outlen)) return 0;  
 fwrite(outbuf, 1, outlen, out);  
 EVP_CIPHER_CTX_cleanup(&ctx);  
 return 1;  
} 

main(int argc, char **argv){ 
if(atoi(argv[1]) == 1) 
    do_crypt(0); 
if(atoi(argv[1]) == 2) 
    do_decrypt(0);    
} 

Что может быть не так?

Ответы [ 2 ]

6 голосов
/ 28 марта 2012

Неправильно, если вы ожидаете, что все сообщение станет нечитаемым из-за изменения одного байта.

Какие части сообщения станут нечитаемыми, зависит от выбранного режима шифрования.Вы используете CFB.Это означает, что если вы измените один байт в зашифрованном тексте, соответствующий байт и блок после этого будут повреждены, а шифр восстановится после ошибки.

PCBC повредит все выходные данные послеОшибка.Но он все равно не обнаруживает ошибку.

Я рекомендую добавить аутентификацию (либо MAC, либо режим с интегрированной аутентификацией, такой как AES-GCM).

2 голосов
/ 28 марта 2012

Это именно то, что и должно быть.

Очень упрощенно, сообщение шифруется и дешифруется слева направо. До тех пор, пока подпрограмма расшифровки не изменяет байт, расшифрованный текст ДОЛЖЕН совпадать с исходным сообщением. То, что происходит после изменения байта, зависит от режима шифрования, но это изменение не может повлиять на расшифровку левой части текста.

...