2013-06-14 6 views
8

मैं आईओएस एन्क्रिप्शन से मेल खाने के लिए जावा/एंड्रॉइड में एन्क्रिप्शन कोड लागू कर रहा हूं। आईओएस में निम्नलिखित पैडिंग योजना का उपयोग कर आरएसए के साथ एन्क्रिप्ट कर रहे हैं: पीकेसीएस 1-ओएईपीक्या आरएसए पीकेसीएस 1-ओएईपी पैडिंग बाउंसीकैसल में समर्थित है?

हालांकि जब मैं पीकेसीएस 1-ओएईपी के साथ सिफर बनाने की कोशिश करता हूं।

Cipher c = Cipher.getInstance("RSA/None/PKCS1-OAEP", "BC"); 

नीचे स्टैकट्रेस

javax.crypto.NoSuchPaddingException: PKCS1-OAEP unavailable with RSA. 
    at com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineSetPadding(CipherSpi.java:240) 
    at javax.crypto.Cipher.getCipher(Cipher.java:324) 
    at javax.crypto.Cipher.getInstance(Cipher.java:237) 

हो सकता है कि यह सही नहीं है RSA/None/PKCS1-OAEP है? लेकिन यह कहने का कोई निश्चित जवाब नहीं मिल सकता है कि पीकेसीएस 1-ओएईपी असमर्थित है या इसे परिभाषित करने का सही तरीका है।

मैं स्पॉन्गकासल लाइब्रेरी का उपयोग कर रहा हूं इसलिए पूर्ण बाउंसीकैसल कार्यान्वयन है।

+0

लगेगा यह कहना मुश्किल है, लेकिन यह 'आरएसए/कोई नहीं/OAEPWithSHA1AndMGF1Padding' की तरह कुछ, उदाहरण के लिए हो सकता है। – vcsjones

+0

@vcsjones मैं देखता हूं कि निम्नलिखित http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions पर ध्यान दिया गया है, लेकिन जब यह NoSuchPaddingException से पहले मिलता है, यह एक ही पैडिंग नहीं है 'PKCS1- OAEP '। क्या अतिरिक्त जानकारी मदद मिलेगी? – scottyab

+0

ओएईपी * कुछ * प्रकार के हैशिंग फ़ंक्शन का उपयोग करता है, चाहे वह SHA1 हो या कुछ और कार्यान्वयन पर निर्भर करता हो। हमें आपके आईओएस कार्यान्वयन के बारे में अधिक जानने की जरूरत है। उदाहरण के लिए, यदि आपने अपने RSA_public_encrypt फ़ंक्शन में 'RSA_PKCS1_OAEP_PADDING' का उपयोग किया है, तो वह एमजीएफ 1 के साथ SHA1 है। http://developer.apple.com/library/ios/#documentation/System/Conceptual/ManPages_iPhoneOS/man3/RSA_public_encrypt.3ssl.html। आपका आईओएस कोड कैसा दिखता है? – vcsjones

उत्तर

5

निम्नलिखित कोड, काम करता है अगर किसी और को समान एन्क्रिप्शन एन्कोडिंग/गद्दी मुद्दों के साथ अटक गई है

SubjectPublicKeyInfo publicKeyInfo = new SubjectPublicKeyInfo(
      ASN1Sequence.getInstance(rsaPublicKey.getEncoded())); 

    AsymmetricKeyParameter param = PublicKeyFactory 
      .createKey(publicKeyInfo); 
    AsymmetricBlockCipher cipher = new OAEPEncoding(new RSAEngine(), 
      new SHA1Digest()); 
    cipher.init(true, param); 

    return cipher.processBlock(stuffIWantEncrypted, 0, 32); 
13

पहले उत्तर में कोड काम करता है, लेकिन यह सिफारिश नहीं कर रहा है के रूप में यह BouncyCastle आंतरिक कक्षाओं का उपयोग करता है, के बजाय जेसीए जेनेरिक इंटरफेस, कोड BouncyCastle विशिष्ट बनाते हैं। उदाहरण के लिए, यह SunJCE प्रदाता पर स्विच करना मुश्किल हो जाएगा।

संस्करण 1.50 के रूप में बाउंसी कैसल ओएईपी पैडिंग नामों का पालन करता है।

  • आरएसए/कोई नहीं/OAEPWithMD5AndMGF1Padding
  • आरएसए/कोई नहीं/OAEPWithSHA1AndMGF1Padding
  • आरएसए/कोई नहीं/OAEPWithSHA224AndMGF1Padding
  • आरएसए/कोई नहीं/OAEPWithSHA256AndMGF1Padding
  • आरएसए/कोई नहीं/OAEPWithSHA384AndMGF1Padding
  • आरएसए/कोई नहीं/OAEPWithSHA512AndMGF1 पैडिंग

तो उचित RSA-OAEP सिफर initializations और अधिक विस्तार के बिना की तरह

Cipher c = Cipher.getInstance("RSA/NONE/OAEPWithSHA1AndMGF1Padding", "BC"); 
संबंधित मुद्दे