virtual void ProcessData(byte *outString, const byte *inString, size_t length);
看起來像的最後一個參數是所述輸入數據的大小。什麼是不明確的就是該方法不返回我的加密數據的大小...
ProcessData
是所有分組密碼的主力(但不是Stream對象的密碼或其他類型)。另請參閱Crypto ++手冊和cryptlib.h File Reference。 cryptlib.h
被描述爲「爲該庫提供統一接口的抽象基類」。
ProcessData
以塊大小的數據長度進行操作。所以INSIZE
等於OUTSIZE
等於BLOCKSIZE
。請注意,沒有INSIZE
或OUTSIZE
- 我使用它們進行討論。每個分組密碼將爲BLOCKSIZE
提供一個常數。會有一個AES::BLOCKSIZE
,DES_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_mode
和StreamTransformationFilter
一起工作,給你想要的結果。 CBC_mode
調用ProcessData
並處理密碼鏈接細節。 StreamTransformationFilter
以其首選大小提供純文本。如果沒有足夠的純文本,則StreamTransformationFilter
在輸入時對其進行緩衝。如果沒有輸出緩衝區,則StreamTransformationFilter
也會緩衝密文。
StreamTransformationFilter
也將根據需要應用填充。有一個默認的填充,但你可以覆蓋它。 StreamTransformationFilter
知道要應用哪個填充,因爲它詢問模式(CBC_mode
)是否需要填充以及填充應該是什麼。
...是否假定輸出數據塊的大小與輸入數據塊的長度完全相同?即使輸入數據的大小隻是一個字節,這是否有效?
這就是StreamTransformationFilter
適合等式的地方。
請務必在維基上查看Init-Update-Final。如果您習慣於Java或OpenSSL編程,它應該爲您提供膠水。它應該幫助你「點擊它」。
來源
2016-06-07 21:02:33
jww
謝謝你的幫助。爲什麼要投票?這不是一個合法的問題嗎? – Peter