क्रिप्टो ++ "टी" स्टाइल फ़िल्टर

मैं कुछ स्थितियों के आधार पर डेटा स्ट्रीम को संसाधित करने पर काम कर रहा हूं।

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

अब, मैं एक चेकसम की गणना, एन्क्रिप्शन और फ़ाइल स्टोर के बीच बहने वाले डेटा पर "स्नूप" करना चाहता हूं। प्रदर्शन कारणों से, मैं स्ट्रीमिंग करते समय ऐसा करना चाहता हूं, आउटपुट फ़ाइल को फिर से खोलना और हैश-योग की गणना करना मेरी आवश्यकता के लिए उचित नहीं है।

जो मैं देख सकता हूं, उससे काम करने के लिए क्या गुम है, "टी" फ़िल्टर का कुछ रूप है। डेटा चेन को दो नई श्रृंखलाओं में विभाजित करना, एक फाइल को संग्रहीत करने के लिए, और हैश-गणना के लिए एक श्रृंखला।

क्या क्रिप्टो ++ में ऐसी कार्यक्षमता है? क्या मैं खुद को ऐसे फ़िल्टर को कार्यान्वित कर सकता हूं, और यदि ऐसा है, तो क्या कस्टम क्रिप्टो ++ फ़िल्टर के लिए आवश्यक कुछ दिशा-निर्देश या उदाहरण हैं? क्या फ्लाई पर चेकसम की गणना करने का कोई और तरीका है?

0
जोड़ा
विचारों: 2
पारितोषिक के लिए धन्यवाद। हालांकि, AFAICT, यह दोनों हस्ताक्षर उत्पन्न करने का समर्थन नहीं करता है, और डेटा को आगे स्ट्रीम करता है, है ना?
जोड़ा लेखक Rawler, स्रोत
यह SignerFilter के समान ही लगता है, filter.cpp में लागू किया गया है, करता है।
जोड़ा लेखक Christopher Creutzig, स्रोत
मेरा मानना ​​है कि यह तब होता है जब आप कन्स्ट्रक्टर का अंतिम पैरामीटर true पर सेट करते हैं। वैसे ही मुझे लगता है कि SignatureVerificationFilter , यदि दिए गए PUT_MESSAGE को इसके झंडे में, NextPutMultiple जैसे कार्यों में, संदेश को कुछ और फ़िल्टर पर अग्रेषित करें, इसके हैश को अपडेट करने के अलावा। लेकिन मैंने इसका परीक्षण करने के लिए कोई कोड नहीं लिखा था।
जोड़ा लेखक Christopher Creutzig, स्रोत

1 उत्तर

जो मैं देख सकता हूं, उससे काम करने के लिए क्या गुम है, "टी" फ़िल्टर का कुछ रूप है।   ...   क्या क्रिप्टो ++ में ऐसी कार्यक्षमता है?

हां, इसे ChannelSwitch कहा जाता है। निम्नलिखित चैनलस्विच पर क्रिप्टो ++ विकी पृष्ठ से है, और यह कक्षा के वीई दाई के उपयोग का पालन करता है उसकी टेस्ट फाइलें

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();

ऊपर दिए गए उदाहरण का आउटपुट यहां दिया गया है:

$ ./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==
0
जोड़ा