2012-11-13 9 views
5

के साथ एन्क्रिप्शन से पहले डेटा पैड कैसे करें मैं सीबीसी मोड के साथ एईएस एल्गोरिदम के साथ अपना डेटा एन्क्रिप्ट करने की कोशिश कर रहा हूं। इस कारण से मैं नेट लाइब्रेरी 'बाउंसी कैसल' का उपयोग करता हूं। मेरे पास क्रिप्टो में पृष्ठभूमि नहीं है, इसलिए मैं इसे सीधे तरीके से उपयोग करने की कोशिश कर रहा हूं। जब मैं एक इनपुट कि 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) फ़ंक्शन के उपयोग के बारे में हो सकता है। मैं इस धारणा के साथ इसका उपयोग करता हूं कि आउटपुट मेरा सिफर टेक्स्ट होगा, लेकिन ऐसा लगता है कि आउटपुट इनपुट लंबाई से अधिक लंबा होना चाहिए। चूंकि मेरे पास इस फ़ंक्शन के बारे में कोई प्रलेखन नहीं है, इसलिए मैं इसे गलत तरीके से उपयोग कर रहा हूं। कोई मदद ऐप

उत्तर

4

Bouncy कैसल, आप के लिए गद्दी क्या करेंगे आप अपने cihper सेट करने की आवश्यकता के रूप में शुरू करने के लिए:

PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(engine), new Pkcs7Padding()); 

अपने कोड के बाकी cipher.GetOutputSize(data.Length)ProcessBytes उनका उपयोग करना होगा काम करने के लिए, और DoFinal तो पैडिंग सही ढंग से जोड़ा जाता है।

byte[] output = new byte[cipher.GetOutputSize(data.Length)]; 
int len = cipher.ProcessBytes(data, 0, data.Length, output, 0); 
cipher.DoFinal(output, len); 

मैं AES-GCM in Bouncy Castle on CodeReview

एईएस GCM एन्क्रिप्शन प्रमाणीकृत जोड़ता का उपयोग करने का एक सरल उदाहरण है, लेकिन एपीआई का उपयोग कर के बुनियादी सिद्धांत एक ही है।

मैं भी उच्च स्तर एन्क्रिप्शन ढांचे, Kecyzar की एक सी # बंदरगाह है, कि मैं बैकएंड के रूप में Bouncy कैसल इस्तेमाल किया है, हालांकि यह एक कठिन उदाहरण है, पृथक एन्क्रिप्शन कोड SymmetricStreamBouncyAesKey

+0

में एईएस सीबीसी प्रयोग करने के लिए सेटअप है धन्यवाद jbtule, लेकिन जब मैं paddedCipher.DoFinal (आउटपुट, लेन) का उपयोग करने की कोशिश करता हूं, तो मुझे इस पटर के साथ समस्या है; यह "अपवाद में अंतिम ब्लॉक अपूर्ण" अपवाद फेंकता है, प्रक्रिया बाइट्स विधि एक मान देता है जो 16 गुणा है जो डेटा लंबाई से छोटा है, क्या आप जानते हैं कि इस समस्या का कारण क्या है? धन्यवाद – ikbal

+0

@paskalnikov मैंने उपयोग करने के तरीके को दिखाने के लिए और कोड जोड़ा।'प्रोसेसबेट्स' प्रत्येक पूर्ण ब्लॉक के लिए आउटपुट बाइट्स पर जा रहा है और शेष बफर्ड रखता है (आप इसे प्रोसेसबाइट्स को कई बार कॉल कर सकते हैं क्योंकि आप इसे एक समय में डेटा का एक हिस्सा देना चाहते हैं), यह नहीं माना जा रहा है कि आप समाप्त हो गए हैं जब तक आप 'DoFinal' को कॉल नहीं करते हैं, और फिर' DoFinal' अंतिम बाइट्स (पैडिंग के साथ) लिखेंगे, इसलिए यदि आपके पास अपने अंतिम आउटपुट सरणी में 'DoFinal' लिखना है तो आपको इसे उस इंडेक्स को देना होगा जहां इसे लिखना चाहिए सरणी – jbtule

2

आमतौर पर एक मानक पैडिंग एल्गोरिदम का उपयोग करेगा ताकि यह सुनिश्चित किया जा सके कि सादे टेक्स्ट डेटा को साइफर के लिए ब्लॉक आकार के साथ गठबंधन किया गया हो।

वर्तमान में आप zero padding हैंड कोडिंग कर रहे हैं। यह एक अच्छा विकल्प नहीं है क्योंकि यह शून्य बाइट में समाप्त होने वाले मूल डेटा को रोकता है - आप पैडिंग से इसे कैसे अलग कर सकते हैं?

मैं आपको मानक पैडिंग का उपयोग करने की सलाह दूंगा, जैसे PKCS #7 padding। ध्यान दें कि इसे अक्सर "पीकेसीएस # 5 पैडिंग" के रूप में जाना जाता है, क्योंकि वे बहुत समान हैं।

मानक पैडिंग का उपयोग करने के उदाहरण के लिए आप इस अन्य SO प्रश्न - Encrypt/Decrypt using Bouncy Castle in C# का उल्लेख कर सकते हैं।

संबंधित मुद्दे