2012-01-06 2 views
6

이것은 내 첫 번째 질문이므로 제게 뭔가 잘못했는지 말해주십시오 :).EVP_DecryptFinal에서 8 바이트가 누락되었습니다.

내 문제는 내가 바이너리 파일의 암호를 해독

EVP_DecryptInit(&ctx1, EVP_des_ecb(), tmpkey, NULL); 
EVP_DecryptUpdate(&ctx1, keysigout, &outlu ,keysigin, keysigfilelength); 
EVP_DecryptFinal(&ctx1, keysigout, &outlf); 
printf("DECLEN:%i",outlu + outlf); 

를 사용합니다. 파일은 248 바이트이지만 printf는 EVP가 240 바이트를 암호 해독했다는 사실만을 알려줍니다. keysigfilelength는 248이며 248 바이트를 암호 해독해야한다는 업데이트를 알려야합니다.

나는이 일이 왜 효과가 없는지 이해하지 못하고 나를 계몽 할 수 있다면 행복 할 것이다.

편집 : 난 그냥 명령

openssl enc -e -des-ecb -in test.txt -out test.bin -K 00a82b209cbeaf00 

수동으로 파일을 암호화은 8 바이트 성장 : O를. 나는 그들이 어디에서 왔는지 아직도 모르지만 나는 내 프로그램에서 가지고있는 일반적인 오류가 이것에 의해 발생했다고 생각하지 않는다.

이 모든 문제의 맥락은 우리 대학의 정보 보안 과정입니다. 우리는 다른 알고리즘으로 비슷한 작업을했지만, 심지어 프로그램을 성공적으로 마친 사람조차도 프로그램의 문제가 어디인지 파악할 수 없었습니다.

전체 프로그램을 게시해도 괜찮습니까?

+0

Windows에서 텍스트 모드로 파일을 열어 '\ r'이 제거 된 것과 같은 것이 아닌지 확인하십시오. –

+0

http://pastebin.com/H3riQhm7 여기에 파일의 hexdump -C가 있습니다. 모든 일은 리눅스에서 행해졌습니다 – outsmartin

+0

나는 그렇게 생각하지 않을 것이지만 확신하는 것이 더 낫다고 생각했습니다. –

답변

2

을 나는 내 자신의 질문에 대답하기 위해 벌금을 희망한다. 문제는 outlu 실종됐다

EVP_DecryptUpdate(&ctx1, keysigout, &outlu ,keysigin, keysigfilelength); 
EVP_DecryptFinal(&ctx1, keysigout + outlu, &outlf); 

, DecryptFinal 시도 전체 블록을 다시 암호 해독합니다. 내가 outlf에서 7 바이트있어 utlu 및 그것을 효과. 나중에 참조 할 수 있도록 아래에 전체 함수를 추가하십시오. 키와 iv가 하나의 데이터 블록이 될 것으로 기대합니다.

int decrypt(const EVP_CIPHER *cipher,unsigned char *key, unsigned char *encryptedData, int encryptedLength,unsigned int * length, unsigned char ** decryptedData) 
{ 
    int decryptedLength = 0, lastDecryptLength = 0, ret; 
    unsigned char * iv = NULL; 
    EVP_CIPHER_CTX *cryptCtx = EVP_CIPHER_CTX_new(); 
    EVP_CIPHER_CTX_init(cryptCtx); 
    *decryptedData = malloc (encryptedLength * sizeof(char)); 

    if(cipher->iv_len != 0) iv = key + cipher->key_len; 

    EVP_DecryptInit_ex(cryptCtx, cipher, NULL, key, iv); 
    EVP_DecryptUpdate(cryptCtx, *decryptedData, &decryptedLength, encryptedData, encryptedLength); 
    ret = EVP_DecryptFinal_ex(cryptCtx, *decryptedData + decryptedLength, &lastDecryptLength); 

    *length = decryptedLength + lastDecryptLength; 

    EVP_CIPHER_CTX_free(cryptCtx); 
    EVP_cleanup(); 
    return ret; 
} 
0

블록 암호는 실제로 블록 크기의 배수 인 입력에 대해서만 작업하기를 원하기 때문에 일반적으로이 요구 사항을 충족시키기 위해 입력이 채워집니다. openssl enc 등 많은 프로그램 (기본값은 일반 텍스트가 다음 패딩 바이트가 추가 8 바이트의 배수가 아닌 경우가되도록이 8 바이트의 배수가 이미의 다음 8 바이트 인 경우. PKCS #5 padding

을 사용하는 것입니다 패딩은 암호화 된 데이터가 더 이상 일반 텍스트보다하는 따라서 완전히 정상입니다. 추가됩니다.

+0

내 평문은 248 바이트 였고 그는 여전히 8 바이트를 더했습니다 – outsmartin

+0

평문이 248 바이트이면 8 바이트가 추가됩니다 - 내 말씨가 분명하지 않았습니다. –

관련 문제