2012-01-06 39 views
6

đây là câu hỏi đầu tiên của tôi vì vậy hãy cho tôi biết nếu tôi làm điều gì đó sai :).8 byte mất tích trên EVP_DecryptFinal

Vấn đề của tôi là tôi sử dụng

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

để giải mã một tập tin nhị phân. Tệp dài 248 byte nhưng printf chỉ cho tôi biết EVP đã giải mã 240 byte. keysigfilelength là 248 và nên thông báo cập nhật 248 byte cần được giải mã.

Tôi không hiểu tại sao điều này không hoạt động và sẽ rất vui nếu bạn có thể khai sáng cho tôi.

Edit: Tôi chỉ mã hóa một tập tin bằng tay với lệnh

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

và nó tăng 8 byte: O. Tôi vẫn không biết họ đến từ đâu nhưng tôi không nghĩ rằng lỗi chung tôi có trong chương trình của mình là do điều này.

Ngữ cảnh của toàn bộ vấn đề này là khóa học bảo mật thông tin tại trường đại học của tôi. Chúng tôi có các nhiệm vụ tương tự với các thuật toán khác nhau, nhưng ngay cả những người đã thực hiện chương trình của mình thành công không thể tìm ra vấn đề trong chương trình của tôi là gì.

Tôi có muốn đăng toàn bộ chương trình cho bạn không?

+0

Để đảm bảo, nó không giống như trên Windows và mở tệp ở chế độ văn bản để '\ r bị xóa? –

+0

http://pastebin.com/H3riQhm7 đây là tệp hexdump -C của tệp. tất cả các công việc được thực hiện trong linux – outsmartin

+0

Tôi nghĩ rằng nó sẽ không được rằng, nhưng tốt hơn để chắc chắn. –

Trả lời

2

tôi hy vọng tốt đẹp của nó để trả lời câu hỏi của riêng tôi.

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

vấn đề đã được các thiếu outlu, DecryptFinal thử để giải mã toàn bộ khối lần nữa. Khi tôi thêm o utlu tôi có 7 byte trong outlf, và nó hoạt động. Để tham khảo trong tương lai, tôi thêm toàn bộ chức năng dưới đây. Dự kiến ​​khóa và iv là một khối dữ liệu.

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

Vì mật mã khối chỉ thực sự muốn làm việc trên đầu vào là bội số của kích thước khối, đầu vào thường được đệm để đáp ứng yêu cầu này. Giá trị mặc định cho nhiều chương trình (bao gồm cả openssl enc là sử dụng PKCS #5 padding

Nếu bản rõ không phải là một bội số của 8 bytes sau đó đệm byte được thêm vào để nó. Nếu nó đã là một bội số của 8 bytes sau đó 8 byte đệm được thêm vào. vì vậy nó là hoàn toàn bình thường đối với các dữ liệu được mã hóa để được lâu hơn so với văn bản gốc.

+0

bản rõ của tôi là 248 byte và anh ấy vẫn thêm 8 byte – outsmartin

+0

Nếu bản rõ là 248 byte, 8 byte được thêm vào - từ ngữ của tôi không rõ ràng –

Các vấn đề liên quan