2012-09-21 4 views
0

나는 AES 암호화 문자열OpenSSL을 해독 텍스트 길이

unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len) 
{ 
    int p_len = *len, f_len = 0; 
    unsigned char *plaintext = (unsigned char*)malloc(p_len + 128); 
    memset(plaintext,0,p_len); 
    EVP_DecryptInit_ex(e, NULL, NULL, NULL, NULL); 
    EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len); 
    EVP_DecryptFinal_ex(e, plaintext+p_len, &f_len); 

    *len = p_len + f_len; 
    return plaintext; 
} 

문제를 해독이 간단한 기능을 사용하고 렌 전체 디코딩 문자열과 일치하지 않는 값을 반환한다는 것입니다. 무엇이 문제 일 수 있습니까?

답변

2

"문자열"이라고 말하면 제로 종료 텍스트 문자열을 의미한다고 가정합니다. 암호화 프로세스는 암호 블록 크기 및 종종 패딩에 따라 다릅니다. 실제로 인코딩되고 디코딩되는 것은 응용 프로그램에 달려 있습니다 ... 모든 암호는 이진 데이터입니다. 텍스트 문자열이 해독 프로세스에서 반환되는 문자열보다 작 ​​으면 응용 프로그램이 유용한 부분을 결정해야합니다. 예를 들어, 결과 내에서 문자열이 0으로 끝나는 것을 안다면 간단한 strlen을하는 길이를 얻을 수 있습니다. 입력을 보장 할 수 없다면 물론 위험합니다 ... 아마도 해독 된 길이까지 null에 대한 결과를 검색하는 것이 더 좋습니다 ...

+0

+1 잘 설명 됨 –

1

ECB, CBC 또는 다른 체인 모드에서 암호를 사용하는 경우 평문을 암호 블록 길이의 배수 인 길이에 채워야합니다. 예를 들어 PKCS # 5 표준을 볼 수 있습니다. OpenSSL과 같은 고급 함수는 프로그래머에게 투명하게 패딩을 수행 할 수 있습니다. 따라서 암호화 된 텍스트는 일반 텍스트보다 최대 암호화 블록 크기까지 커질 수 있습니다.