2

私はいくつかの条件に基づいてデータストリームを処理することに取り組んでいます。

データは入力パイプから読み取られ、処理され、でCBC_Mode<AES>終わるCrypto++フィルターにプッシュダウンされFileSinkます。

ここで、暗号化とファイルストアの間を流れるデータを「スヌープ」して、チェックサムを計算したいと思います。パフォーマンス上の理由から、ストリーミング中にこれを実行し、出力ファイルを再度開いて、後でハッシュサムを計算することは、私のニーズには合理的ではありません。

私が見ることができることから、これが機能するために欠けているのは、ある種の「ティー」フィルターです。データチェーンを2つの新しいチェーンに分割するもの。1つはファイルへの保存用、もう1つはハッシュ計算用です。

Crypto ++にはそのような機能がありますか?そのようなフィルターを自分で実装できますか?もしそうなら、カスタムCrypto ++フィルターに必要なものに関するガイドラインや例はありますか?その場でチェックサムを計算する他の方法はありますか?

4

1 に答える 1

3

私が見ることができることから、これが機能するために欠けているのは、ある種の「ティー」フィルターです。... Crypto ++にはそのような機能がありますか?

はい、それはと呼ばれChannelSwitchます。以下は、ChannelSwitchのCrypto ++ wikiページからのものであり、WeiDaiがテストファイルでクラスを使用した後のものです。

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-04T05:01:31.647 に答える