के साथ एन्क्रिप्शन से पहले डेटा पैड कैसे करें मैं सीबीसी मोड के साथ एईएस एल्गोरिदम के साथ अपना डेटा एन्क्रिप्ट करने की कोशिश कर रहा हूं। इस कारण से मैं नेट लाइब्रेरी 'बाउंसी कैसल' का उपयोग करता हूं। मेरे पास क्रिप्टो में पृष्ठभूमि नहीं है, इसलिए मैं इसे सीधे तरीके से उपयोग करने की कोशिश कर रहा हूं। जब मैं एक इनपुट कि 16 के एक गुणा नहीं है की कोशिश, मैं एक अपवाद मिल यहाँ मेरी एन्क्रिप्ट कोडbouncyCastle
public byte[] encrypt(byte[] key, byte[] iv,byte[] data)
{
IBlockCipher engine=new AesFastEngine();
KeyParameter keyParam = new KeyParameter(key);
CbcBlockCipher cipher = new CbcBlockCipher(engine);
ICipherParameters parameters = new ParametersWithIV(keyParam, iv);
byte[] output=new byte[16+data.Length];
cipher.Init(true, parameters);
cipher.ProcessBlock(data, 0, output, data.Length);
//process output
byte[] cipherArray = new byte[data.Length];
/*
int k=0;
for (int i = 0; i < output.Length; i++)
{
if (output[i]!= 0)
{
cipherArray[k++] = output[i];
}
}
*/
return cipherArray;
}
है। जब मैं दाईं ओर शून्य के साथ सरणी को दाएं (16-लंबाई% 16) के साथ पैड करता हूं, तो मुझे परिणाम मिल सकता है। लेकिन परिणाम भी मेरे लिए एक समस्या है। यह मुझे इस तरह का परिणाम देता है:
[0][0][0][0[111][22][33][44][66][77][33][12][32][23][0][0][0][0][0]
दोनों बाईं ओर दाईं ओर शून्य।
मैंने सोचा कि यह ProcessBlock(data, 0, output, data.Length)
फ़ंक्शन के उपयोग के बारे में हो सकता है। मैं इस धारणा के साथ इसका उपयोग करता हूं कि आउटपुट मेरा सिफर टेक्स्ट होगा, लेकिन ऐसा लगता है कि आउटपुट इनपुट लंबाई से अधिक लंबा होना चाहिए। चूंकि मेरे पास इस फ़ंक्शन के बारे में कोई प्रलेखन नहीं है, इसलिए मैं इसे गलत तरीके से उपयोग कर रहा हूं। कोई मदद ऐप
में एईएस सीबीसी प्रयोग करने के लिए सेटअप है धन्यवाद jbtule, लेकिन जब मैं paddedCipher.DoFinal (आउटपुट, लेन) का उपयोग करने की कोशिश करता हूं, तो मुझे इस पटर के साथ समस्या है; यह "अपवाद में अंतिम ब्लॉक अपूर्ण" अपवाद फेंकता है, प्रक्रिया बाइट्स विधि एक मान देता है जो 16 गुणा है जो डेटा लंबाई से छोटा है, क्या आप जानते हैं कि इस समस्या का कारण क्या है? धन्यवाद – ikbal
@paskalnikov मैंने उपयोग करने के तरीके को दिखाने के लिए और कोड जोड़ा।'प्रोसेसबेट्स' प्रत्येक पूर्ण ब्लॉक के लिए आउटपुट बाइट्स पर जा रहा है और शेष बफर्ड रखता है (आप इसे प्रोसेसबाइट्स को कई बार कॉल कर सकते हैं क्योंकि आप इसे एक समय में डेटा का एक हिस्सा देना चाहते हैं), यह नहीं माना जा रहा है कि आप समाप्त हो गए हैं जब तक आप 'DoFinal' को कॉल नहीं करते हैं, और फिर' DoFinal' अंतिम बाइट्स (पैडिंग के साथ) लिखेंगे, इसलिए यदि आपके पास अपने अंतिम आउटपुट सरणी में 'DoFinal' लिखना है तो आपको इसे उस इंडेक्स को देना होगा जहां इसे लिखना चाहिए सरणी – jbtule