2012-03-28 7 views
1

私はOpenSSLのlibと一緒に働いていて、AESの暗号化/復号化で非常に奇妙な効果を得ています。暗号化されたメッセージの一部のバイトを変更して解読すると、そう思う。これはソースコードですOpenSSLとAES

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

何が間違っている可能性がありますか?

答えて

6

1バイトが変更されたため、メッセージ全体が読み取れなくなることが予想されます。

メッセージのどの部分が読めなくなるかは、選択した暗号化モードによって異なります。あなたはCFBを使っています。つまり、暗号文の1バイトを変更すると、対応するバイトとそれ以降のブロックが破損し、その後のエラーから暗号が回復します。

PCBCは、エラー後にすべての出力を破損します。しかし、それでもエラーは検出されません。

認証を追加することをお勧めします(MAC、またはAES-GCMなどの統合認証モード)。

+0

パーク都市バプテスト教会? –

+0

ああ、使用中のモードを見たことはありません:) –

+0

@wlstead私も。とても役に立ちません。認証を追加すると、エラーの動作はそれ以上重要ではありません。 – CodesInChaos

2

これは正確に想定されているものです。

大幅に単純化すると、メッセージは暗号化され、左から右に復号化されます。復号ルーチンが変更されたバイトに達するまで、復号されたテキストは元のメッセージと一致しなければならない。変更されたバイトが暗号モードに依存した後に何が起こるかは、この変更によってテキストの左部分の復号が影響を受けることはありません。

関連する問題