從我所看到的,缺少這個工作,是某種形式的「三通」過濾器。 ... 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==
來源
2013-10-04 05:01:31
jww
這聽起來非常類似於'filter.cpp'中實現的'SignerFilter'。 –
感謝您的提示。但是,AFAICT,它不支持生成簽名,並且將數據流向前傳送,是嗎? – Rawler
我相信當你將構造函數的最後一個參數設置爲「true」時,它會執行。同樣,我認爲'SignatureVerificationFilter',如果在其標誌中給出'PUT_MESSAGE',除了更新它的哈希以外,在像NextPutMultiple'這樣的函數中,將把消息轉發到一些進一步的過濾器。但是我沒有編寫任何代碼來測試它。 –