2015-04-07 49 views
0

因此,我在C++中使用以下代碼與Openssl。 我從另一個SO線程得到了這個。AES_cfb128_encrypt不解密加密文件中的所有字節

int bytes_read, bytes_written; 


unsigned char indata[AES_BLOCK_SIZE]; 
    unsigned char outdata[AES_BLOCK_SIZE]; 

    /* ckey and ivec are the two 128-bits keys necesary to 
    en- and recrypt your data. Note that ckey can be 
    192 or 256 bits as well */ 
    unsigned char ckey[] = "thiskeyisverybad"; 
    unsigned char ivec[] = "dontusethisinput"; 

    /* data structure that contains the key itself */ 
    AES_KEY key; 

    /* set the encryption key */ 
    AES_set_encrypt_key(ckey, 128, &key); 

    /* set where on the 128 bit encrypted block to begin encryption*/ 
    int num = 0; 

    FILE *ifp = fopen("out.txt", "r"); 
    FILE *ofp = fopen("orig.txt", "w"); 

    while (true) { 
    bytes_read = fread(indata, 1, AES_BLOCK_SIZE, ifp); 

    AES_cfb128_encrypt(indata, outdata, bytes_read, &key, ivec, &num, 
     AES_DECRYPT); //or AES_DECRYPT 

    bytes_written = fwrite(outdata, 1, bytes_read, ofp); 
    if (bytes_read < AES_BLOCK_SIZE) { 
     std::cout << bytes_read << std::endl; 
     break; 
    } 
    } 

    fclose(ifp); 
    fclose(ofp); 

什麼我做的是通過傳遞加密文件「的test.txt」 AES_ENCRYPTAES_set_encrypt_key,然後再試圖解密相同的文件。加密文件存儲爲out.txt。

我使用上面的代碼進行解密。我的問題是,解密文件似乎只解密454字節的數據。它正確地解密了數據,但不是全部。我嘗試了一個測試文件< 454字節,它工作正常,但使用8kb文件,14kb文件等總是導致只有454字節被解密。但是,加密文件的大小是正確的(即對於14kb測試文件,大約14kb加密文件)。

使'ivec'爲空字符串可以讓我解密545字節的加密文本。

我在做什麼錯?

回答

1

好吧我在通過一些開源實現進行了一些研究之後,設法找到了解決方案。

問題是我正在使用fopen讀/寫爲文本而不是讀/寫爲二進制文件。

的修復:

FILE *ifp = fopen("out.txt", "rb"); 
    FILE *ofp = fopen("orig.txt", "wb");