2009-05-19 11 views
24

तो CodingHorror's fun with encryption और ताड़ना टिप्पणियों के बाद, हम अपने एन्क्रिप्शन कर पर पुनर्विचार कर रहे हैं।मैं कैसे BouncyCastle का उपयोग कर शुरू करूँ?

इस मामले में, हमें किसी ऐसी जानकारी को पास करने की आवश्यकता है जो उपयोगकर्ता को किसी तृतीय पक्ष सेवा की पहचान करे जो फिर हमारी वेबसाइट पर एक सेवा के साथ एक हैश के साथ एक सेवा पर वापस कॉल करेगा।

दूसरी सेवा उस उपयोगकर्ता की जानकारी देखती है और फिर इसे तीसरे पक्ष की सेवा में भेज देती है।

हम इस उपयोगकर्ता की जानकारी को तृतीय पक्ष सेवा में जाकर एन्क्रिप्ट करना चाहते हैं और इसे बाहर आने के बाद इसे डिक्रिप्ट करना चाहते हैं। तो यह एक लंबे समय तक रहने वाला एन्क्रिप्शन नहीं है।

कोडिंग डरावनी आलेख पर, कोडा हेल ने बाउंसीकास्टल और लाइब्रेरी में एक उच्च स्तर के अमूर्तता की सिफारिश की ताकि किसी विशेष आवश्यकता के लिए विशिष्ट एन्क्रिप्शन किया जा सके।

मेरी समस्या यह है कि बाउंसीकास्टल नामस्थान विशाल हैं और दस्तावेज़ीकरण मौजूद नहीं है। क्या कोई मुझे इस उच्च स्तरीय अमूर्त पुस्तकालय में इंगित कर सकता है? (या BouncyCastle के अलावा एक और विकल्प?)

+5

पर पुनर्विचार कर अपनी खुद की एन्क्रिप्शन lib लेखन? अच्छा विकल्प! – Cheeso

+0

हालांकि बाउंसीकास्टल के साथ बहुत सारे दस्तावेज नहीं हैं, लेकिन मुझे उनकी मेलिंग सूची बहुत मददगार मिलती है http://www.bouncycastle.org/csharpdevmailarchive/index.html। आप प्रश्न पूछने के लिए भी सदस्यता ले सकते हैं। आपको उन स्रोतों और परीक्षणों के साथ स्रोत भी मिलना चाहिए, जो अधिकांश उपयोग मामलों को कवर करते हैं। – Emmanuel

+0

आप जो वर्णन कर रहे हैं वह ओएथ के लिए एक सामान्य उपयोग-मामले की तरह लगता है - क्या आपने इसका उपयोग करने पर विचार किया है? –

उत्तर

10

उच्च स्तरीय abstraction? मैं Bouncy कैसल पुस्तकालय में उच्चतम स्तर कपोल-कल्पना लगता है शामिल होंगे:

(ब्लॉक सिफर और असममित ब्लॉक सिफर आरंभ के लिए)

मैं ज्यादातर पुस्तकालय के जावा संस्करण से परिचित हूँ। शायद इस कोड स्निपेट आप अपने उद्देश्यों के लिए एक पर्याप्त उच्च अमूर्त की पेशकश करेगा (उदाहरण के एईएस 256 एन्क्रिप्शन का उपयोग किया जाता है):

public byte[] encryptAES256(byte[] input, byte[] key) throws InvalidCipherTextException { 
    assert key.length == 32; // 32 bytes == 256 bits 
    CipherParameters cipherParameters = new KeyParameter(key); 

    /* 
    * A full list of BlockCiphers can be found at http://www.bouncycastle.org/docs/docs1.6/org/bouncycastle/crypto/BlockCipher.html 
    */ 
    BlockCipher blockCipher = new AESEngine(); 

    /* 
    * Paddings available (http://www.bouncycastle.org/docs/docs1.6/org/bouncycastle/crypto/paddings/BlockCipherPadding.html): 
    * - ISO10126d2Padding 
    * - ISO7816d4Padding 
    * - PKCS7Padding 
    * - TBCPadding 
    * - X923Padding 
    * - ZeroBytePadding 
    */ 
    BlockCipherPadding blockCipherPadding = new ZeroBytePadding(); 

    BufferedBlockCipher bufferedBlockCipher = new PaddedBufferedBlockCipher(blockCipher, blockCipherPadding); 

    return encrypt(input, bufferedBlockCipher, cipherParameters); 
} 

public byte[] encrypt(byte[] input, BufferedBlockCipher bufferedBlockCipher, CipherParameters cipherParameters) throws InvalidCipherTextException { 
    boolean forEncryption = true; 
    return process(input, bufferedBlockCipher, cipherParameters, forEncryption); 
} 

public byte[] decrypt(byte[] input, BufferedBlockCipher bufferedBlockCipher, CipherParameters cipherParameters) throws InvalidCipherTextException { 
    boolean forEncryption = false; 
    return process(input, bufferedBlockCipher, cipherParameters, forEncryption); 
} 

public byte[] process(byte[] input, BufferedBlockCipher bufferedBlockCipher, CipherParameters cipherParameters, boolean forEncryption) throws InvalidCipherTextException { 
    bufferedBlockCipher.init(forEncryption, cipherParameters); 

    int inputOffset = 0; 
    int inputLength = input.length; 

    int maximumOutputLength = bufferedBlockCipher.getOutputSize(inputLength); 
    byte[] output = new byte[maximumOutputLength]; 
    int outputOffset = 0; 
    int outputLength = 0; 

    int bytesProcessed; 

    bytesProcessed = bufferedBlockCipher.processBytes(
      input, inputOffset, inputLength, 
      output, outputOffset 
     ); 
    outputOffset += bytesProcessed; 
    outputLength += bytesProcessed; 

    bytesProcessed = bufferedBlockCipher.doFinal(output, outputOffset); 
    outputOffset += bytesProcessed; 
    outputLength += bytesProcessed; 

    if (outputLength == output.length) { 
     return output; 
    } else { 
     byte[] truncatedOutput = new byte[outputLength]; 
     System.arraycopy(
       output, 0, 
       truncatedOutput, 0, 
       outputLength 
      ); 
     return truncatedOutput; 
    } 
} 

संपादित: ओह, मैं तो बस लेख से लिंक पढ़ें। ऐसा लगता है की तुलना में मैंने सोचा था कि (जैसे, "एक गोपनीय संदेश भेजने") की तरह वह भी उच्च स्तर कपोल-कल्पना के बारे में बात कर रहा है। मुझे डर है कि मुझे समझ में नहीं आता कि वह क्या प्राप्त कर रहा है।

+0

धन्यवाद लेख बाहर की जाँच के लिए ... यह क्या वह एन्क्रिप्शन के लिए उपयोग करता है के रूप में वर्णन है की तरह एक पुस्तकालय में कई हैं और दुरुपयोग भी कर रहे हैं के लिए अच्छा होगा अधिक से अधिक। प्रयास के लिए –

+0

+1 लेकिन वास्तव में एक उत्तर मैं उपयोग नहीं कर सकता। –

+0

एडम पेन्टर ने भी मेरे प्रश्न पर एक नज़र डाली है। मैं बस chcacha20 का उपयोग कर पाठ एन्क्रिप्ट करना चाहता हूँ। http://stackoverflow.com/questions/38050559/illegalargumentexception-chacha20-requires-128-bit-or-256-bit-key – Nepster

3

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

0

जेसीई मेरे लिए काम नहीं करेगा क्योंकि हम 256 बिट ताकत चाहते हैं और इसे अनुमति देने के लिए सिस्टम पर जावा कॉन्फ़िगरेशन नहीं बदल सकते हैं। बहुत बुरा बाउंसी कैसल में एपीआई नहीं है जो जेसीई के रूप में उच्च स्तर के रूप में है।

"हालांकि ध्यान दें कि बाउंसीकैसल में दो पुस्तकालय, हल्के क्रिप्टो लाइब्रेरी और जेसीई प्रदाता इंटरफ़ेस लाइब्रेरी शामिल हैं। चाबीज प्रतिबंध जेसीई परत द्वारा लागू किए जाते हैं, लेकिन आपको इस परत का उपयोग करने की आवश्यकता नहीं है।तुम सिर्फ हल्के क्रिप्टो एपीआई का उपयोग करते हैं सीधे आप किसी भी प्रतिबंध कोई बात नहीं कर रहे हैं या स्थापित नहीं हैं क्या नीति फ़ाइलें नहीं है,। " http://www.coderanch.com/t/420255/Security/AES-cryptoPerms-Unlimited-Cryptography

+0

मैं उच्च स्तर के इंटरफ़ेस का उपयोग करने की संभावना से 256-बिट आवश्यकता को छोड़ दूंगा और प्रदाताओं को आसानी से स्विच करने की संभावना। मैं उछाल वाली लाइब्रेरी का प्रशंसक नहीं हूं, क्योंकि इसमें मेरे स्वाद के लिए बहुत सारी त्रुटियां हैं। इसलिए यदि मैं विकास के दौरान बाउंसीकैसल का उपयोग करता हूं तो भी मैं कोड को उत्पादन में जाने के बाद इसे बेहतर तरीके से स्विच करने में सक्षम होना चाहता हूं। एक क्रिप्टो आवेदन डिजाइन करते समय बहुमुखी प्रतिभा एक महत्वपूर्ण पहलू है। प्रदाता या क्रिप्टो प्राइमेटिव्स के सेट पर लॉक करना आपको बहुत नुकसान पहुंचा सकता है। – Accipitridae

0

पुस्तक Beginning Cryptography with Java बहुत उपयोगी उदाहरण और स्पष्टीकरण bouncycastle पुस्तकालय

के आधार पर होता है
1

मैं वास्तव में पाया है कि यह नमूना डिफ़ॉल्ट 128 बिट एन्क्रिप्शन का उपयोग करता है 256 बिट के बजाय मैं बनाया है एक छोटे से परिवर्तन:।

BlockCipher blockCipher = new AESEngine(); 

अब हो जाता है:

BlockCipher blockCipher = new RijndaelEngine(256); 

और यह मेरे क्लाइंट अनुप्रयोग सी ++ AES256 एन्क्रिप्शन एक उच्च (ईआर) की

2

एक उदाहरण स्तर एपीआई BouncyCastle में सीएमएस (Cryptographic Message Syntax) पैकेज होगा साथ मिलकर काम करता है। यह जहाज प्रदाता से अलग जार (बीसीमेल) में है, और जेसीई को लिखा गया है (सी # संस्करण हालांकि हल्के एपीआई के खिलाफ लिखा गया है)।

"गोपनीय संदेश भेजें" लागू किया गया है, मोटे तौर पर सीएमएसई डेवलपेटडेटा जेनरेटर वर्ग द्वारा, और आपको वास्तव में ऐसा करने की ज़रूरत है, इसे एक संदेश दें, एक एन्क्रिप्शन एल्गोरिदम चुनें (सभी विवरण आंतरिक रूप से संभाले गए हैं), और फिर एक निर्दिष्ट करें या अधिक प्राप्तकर्ता जो प्राप्तकर्ता संदेश को पढ़ने में सक्षम होंगे: यह सार्वजनिक कुंजी/प्रमाणपत्र, साझा साझा रहस्य, पासवर्ड या यहां तक ​​कि एक महत्वपूर्ण अनुबंध प्रोटोकॉल पर आधारित हो सकता है। आपके पास एक संदेश पर एक से अधिक प्राप्तकर्ता हो सकते हैं, और आप प्राप्तकर्ता के प्रकारों को मिलाकर मिलान कर सकते हैं।

आप सीएमएसएसignedडेटा जेनरेटर का उपयोग एक सत्यापन योग्य संदेश भेजने के लिए कर सकते हैं। यदि आप साइन इन करना और एन्क्रिप्ट करना चाहते हैं, तो सीएमएस संरचनाएं घोंसले/संगत हैं (लेकिन ऑर्डर महत्वपूर्ण हो सकता है)। CMSCompressedDataGenerator भी है और हाल ही में CMSAuthenticatedData जोड़ा गया है।

1

आप उपयोग कर सकते हैं:

byte[] process(bool encrypt, byte[] input, byte[] key) 
{ 
    var cipher = CipherUtilities.GetCipher("Blowfish"); 
    cipher.Init(false, new KeyParameter(key)); 
    return cipher.DoFinal(input); 
} 

// Encrypt: 
byte[] encrypted = process(true, clear, key); 

// Decrypt: 
byte[] decrypted = process(false, encrypted, key); 

देखें: https://github.com/wernight/decrypt-toolbox/blob/master/dtDecrypt/Program.cs

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