Crypto ++ Filtru de tip "Tee"

Lucrez la prelucrarea unui flux de date pe baza unor condiții.

Data is read from an input pipe, processed, and pushed down a Crypto++ CBC_Mode filter ending in a FileSink.

Acum, aș vrea să "văd" datele care circulă între criptare și depozitul de fișiere, calculând o sumă de control. Din motive de performanță, vreau să fac acest lucru în timp ce streaming, redeschiderea fișierului de ieșire și calcularea unei sume după hash nu este rezonabilă pentru nevoia mea.

Din ceea ce văd, ceea ce lipsește pentru ca aceasta să funcționeze, este o formă de filtru "tee". Ceva care împarte lanțul de date în două noi lanțuri, unul pentru stocarea în fișier și unul pentru calcularea hash-ului.

Există astfel de funcționalități în Crypto ++? Pot implementa un filtru propriu-zis și, dacă da, există câteva linii directoare sau exemple despre ceea ce este necesar pentru un filtru Crypto ++ personalizat? Există altă modalitate de a calcula suma de control în zbor?

0
Multumesc pentru sfat. Cu toate acestea, AFAICT, nu suportă atât generarea unei semnături, cât și transmiterea datelor înainte, nu-i așa?
adăugat autor Rawler, sursa
Suna foarte asemanator cu SignerFilter , implementat in filter.cpp .
adăugat autor Christopher Creutzig, sursa
Cred că se întâmplă când setați ultimul parametru al constructorului la true . În felul în care cred că SignatureVerificationFilter , în cazul în care este PUT_MESSAGE , în funcții precum NextPutMultiple în plus față de actualizarea hash-ului său. Dar nu am scris nici un cod pentru a testa asta.
adăugat autor Christopher Creutzig, sursa

1 răspunsuri

Din ceea ce văd, ceea ce lipsește pentru ca aceasta să funcționeze, este o formă de filtru "tee".   ...   Există astfel de funcționalități în Crypto ++?

Da, se numește ChannelSwitch . Următoarele sunt de pe pagina wiki Crypto ++ de pe ChannelSwitch și rezultă utilizarea lui Wei Dai a clasei fișierele sale de testare.

MD5 hashMD5;
HashFilter filterMD5(hashMD5);

SHA1 hashSHA1;
HashFilter filterSHA1(hashSHA1);

std::auto_ptr 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();

Iată exemplul exemplului de mai sus:

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

Iată un alt exemplu care utilizează chiuvete distincte și poate fi mai ușor de urmat:

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;

Iată exemplul exemplului:

$ ./cryptopp-test.exe
0102030405060708090A
AEBAGBAFA2DSSCIK
AQIDBAUGBwgJCg==
0
adăugat