2016-06-07 101 views
0

我試圖使用AES加密從加密++ libary:加密++輸出數據長度

CBC_Mode<AES>::Encryption e; 

我有需要加密的二進制數據塊。類似乎提供了用於此目的的所謂ProcessData方法:

virtual void ProcessData(byte *outString, const byte *inString, size_t length); 

貌似最後一個參數是輸入數據的大小。不清楚的是爲什麼該方法不會返回加密數據的大小。是否假定輸出數據塊的大小與輸入數據塊的長度完全相同?即使輸入數據的大小隻是一個字節,這是否有效?問候。

+0

謝謝你的幫助。爲什麼要投票?這不是一個合法的問題嗎? – Peter

回答

1
virtual void ProcessData(byte *outString, const byte *inString, size_t length); 

看起來像的最後一個參數是所述輸入數據的大小。什麼是不明確的就是該方法不返回我的加密數據的大小...

ProcessData是所有分組密碼的主力(但不是Stream對象的密碼或其他類型)。另請參閱Crypto ++手冊和cryptlib.h File Referencecryptlib.h被描述爲「爲該庫提供統一接口的抽象基類」

ProcessData以塊大小的數據長度進行操作。所以INSIZE等於OUTSIZE等於BLOCKSIZE。請注意,沒有INSIZEOUTSIZE - 我使用它們進行討論。每個分組密碼將爲BLOCKSIZE提供一個常數。會有一個AES::BLOCKSIZEDES_EDE::BLOCKSIZE

通常你直接做不使用ProcessData。您可以直接使用它,但您將負責所有相關的詳細信息(更多詳情請見下文)。

通常你使用StreamTransformationFilter,但它不明顯的原因。 StreamTransformationFilter根據需要提供輸入緩衝,輸出緩衝和填充。其簡要討論在維基上的Init-Update-Final

這裏是它的外觀在實踐中從CBC mode例如在加密+維基:

try 
{ 
    cout << "plain text: " << plain << endl; 

    CBC_Mode<AES>::Encryption e; 
    e.SetKeyWithIV(key, key.size(), iv); 

    // The StreamTransformationFilter adds padding 
    // as required. ECB and CBC Mode must be padded 
    // to the block size of the cipher. 
    StringSource ss(plain, true, 
     new StreamTransformationFilter(e, 
      new StringSink(cipher) 
     ) // StreamTransformationFilter  
    ); // StringSource 
} 
catch(const CryptoPP::Exception& e) 
{ 
    cerr << e.what() << endl; 
    exit(1); 
} 

在上面,CBC_modeStreamTransformationFilter一起工作,給你想要的結果。 CBC_mode調用ProcessData並處理密碼鏈接細節。 StreamTransformationFilter以其首選大小提供純文本。如果沒有足夠的純文本,則StreamTransformationFilter在輸入時對其進行緩衝。如果沒有輸出緩衝區,則StreamTransformationFilter也會緩衝密文。

StreamTransformationFilter也將根據需要應用填充。有一個默認的填充,但你可以覆蓋它。 StreamTransformationFilter知道要應用哪個填充,因爲它詢問模式(CBC_mode)是否需要填充以及填充應該是什麼。


...是否假定輸出數據塊的大小與輸入數據塊的長度完全相同?即使輸入數據的大小隻是一個字節,這是否有效?

這就是StreamTransformationFilter適合等式的地方。

請務必在維基上查看Init-Update-Final。如果您習慣於Java或OpenSSL編程,它應該爲您提供膠水。它應該幫助你「點擊它」。