2012-03-28 2 views
1

OpenSSL 라이브러리로 작업 중이며 AES 암호화/해독과 매우 이상하게 작동합니다. 암호화 된 메시지의 일부 바이트를 변경하고 해독하면 원래 메시지의 일부가 표시됩니다. 그럴 줄 알았어. 이것은 소스 코드입니다 :OpenSSL and 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

단일 바이트가 변경 되었기 때문에 전체 메시지를 읽을 수 없게되는 것이 좋습니다.

메시지의 어느 부분을 읽을 수 없게되는지는 선택한 암호화 모드에 따라 다릅니다. 당신은 CFB를 사용하고 있습니다. 즉, 암호문에서 단일 바이트를 변경하면 해당 바이트와 그 이후의 블록이 손상되고 나중에 암호에서 암호가 복구됩니다.

PCBC 오류 발생 후 모든 출력이 손상됩니다. 하지만 여전히 오류를 감지하지 못합니다.

인증 (MAC 또는 AES-GCM과 같은 통합 인증 모드)을 추가하는 것이 좋습니다.

+0

파크 시티 침례 교회? –

+0

아, 사용 모드를 본 적이 없어요 :) –

+0

@owlstead me no. 그것은 매우 유용하게 들리지 않습니다. 인증을 추가하면 오류 동작은 더 이상 중요하지 않습니다. – CodesInChaos

2

정확히 무엇입니까?

지나치게 단순화하면 메시지가 왼쪽에서 오른쪽으로 암호화되고 암호가 해독됩니다. 해독 루틴이 변경된 바이트가 바뀔 때까지 해독 된 텍스트는 원래 메시지와 일치해야합니다. 변경된 바이트가 암호 모드에 종속 된 후에는 어떤 일이 발생하지만이 변경으로 인해 텍스트 왼쪽 부분의 암호 해독이 영향을받지 않습니다.