2012-05-24 19 views
2

我正在根據一些條件處理數據流。Crypto ++「Tee」式篩選器

從輸入管道讀取數據,處理並按下以FileSink結尾的Crypto ++ CBC_Mode<AES>過濾器。

現在,我想對加密和文件存儲之間的數據進行「窺探」,計算校驗和。出於性能方面的原因,我想在流式傳輸,重新打開輸出文件和計算散列總和之後做到這一點,這對於我的需要並不合理。

從我所看到的,缺少這個工作的是某種形式的「三通」過濾器。將數據鏈分成兩個新鏈,一個用於存儲到文件,另一個用於散列計算。

Crypto ++中是否有這樣的功能?我是否可以自己實現這樣的過濾器,如果有的話,是否有一些關於自定義Crypto ++過濾器需要的指南或示例?有沒有其他方法可以即時計算校驗和?

+0

這聽起來非常類似於'filter.cpp'中實現的'SignerFilter'。 –

+0

感謝您的提示。但是,AFAICT,它不支持生成簽名,並且將數據流向前傳送,是嗎? – Rawler

+0

我相信當你將構造函數的最後一個參數設置爲「true」時,它會執行。同樣,我認爲'SignatureVerificationFilter',如果在其標誌中給出'PUT_MESSAGE',除了更新它的哈希以外,在像NextPutMultiple'這樣的函數中,將把消息轉發到一些進一步的過濾器。但是我沒有編寫任何代碼來測試它。 –

回答

2

從我所看到的,缺少這個工作,是某種形式的「三通」過濾器。 ... Crypto ++中是否有這樣的功能?

是的,它叫做ChannelSwitch。以下內容來自Crypto++ wiki page on ChannelSwitch,它跟隨偉戴在他的測試文件中使用這個類。

MD5 hashMD5; 
HashFilter filterMD5(hashMD5); 

SHA1 hashSHA1; 
HashFilter filterSHA1(hashSHA1); 

std::auto_ptr<ChannelSwitch> channel(new ChannelSwitch); 

channel->AddDefaultRoute(filterMD5); 
channel->AddDefaultRoute(filterSHA1); 

StringSource ss("abcdefghijklmnopqrstuvwxyz", true, channel.release()); 

string digest; 
HexEncoder encoder(new StringSink(digest), true /* uppercase */); 

filterMD5.TransferTo(encoder); 
cout << filterMD5.AlgorithmName() << ": " << digest << endl; 
digest.erase(); 

filterSHA1.TransferTo(encoder); 
cout << filterSHA1.AlgorithmName() << ": " << digest << endl; 
digest.erase(); 

這裏是上面的例子中的輸出:

$ ./cryptopp-test.exe 
MD5: C3FCD3D76192E4007DFB496CCA67E13B 
SHA-1: 32D10C7B8CF96570CA04CE37F2A19D84240D3A89 

下面是一個使用不同的水槽和可能更容易遵循另外一個例子:

byte data[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
string e1, e2, e3; 

HexEncoder r1(new StringSink(e1)); 
Base32Encoder r2(new StringSink(e2)); 
Base64Encoder r3(new StringSink(e3)); 

ChannelSwitch chsw; 
chsw.AddDefaultRoute(r1); 
chsw.AddDefaultRoute(r2); 
chsw.AddDefaultRoute(r3); 

chsw.Put(data, sizeof(data)); 
chsw.MessageEnd(); 

cout << e1 << endl; 
cout << e2 << endl; 
cout << e3 << endl; 

這裏的輸出示例:

$ ./cryptopp-test.exe 
0102030405060708090A 
AEBAGBAFA2DSSCIK 
AQIDBAUGBwgJCg==