2013-06-14 2 views
8

Ich implementiere Verschlüsselungscode in Java/Android, um iOS-Verschlüsselung zu entsprechen. In iOS gibt es Verschlüsselung mit RSA mit dem folgenden Padding-Schema: PKCS1-OAEPWird RSA PKCS1-OAEP-Padding in Bouncycastle unterstützt?

Allerdings, wenn ich versuche, Cipher mit PKCS1-OAEP zu erstellen.

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

Unten ist die stacktrace

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) 

Vielleicht RSA/None/PKCS1-OAEP ist falsch? Sie können jedoch keine definitive Antwort finden, um zu sagen, dass entweder PKCS1-OAEP nicht unterstützt wird oder die richtige Art, es zu definieren.

Ich benutze die Spongycastle-Bibliothek, also habe volle Bouncycastle-Implementierung.

+0

Ohne genauer ist es schwer zu sagen, aber es könnte so etwas wie 'RSA/Kein/OAEPWithSHA1AndMGF1Padding', zum Beispiel. – vcsjones

+0

@vcsjones Ich sehe, dass auf der folgenden http://www.bouncycastle.org/wiki/display/JA1/FrequentlyAssled+Questions notiert, aber während dies über die NoSuchPaddingException hinausgeht, ist es nicht die gleiche Auffüllung wie 'PKCS1- OAEP ". Welches zusätzliche Detail würde helfen? – scottyab

+0

OAEP verwendet * irgendeine * Art von Hash-Funktion, ob es sich um SHA1 oder etwas anderes handelt, hängt von der Implementierung ab. Wir müssen mehr über Ihre iOS-Implementierung wissen. Wenn Sie beispielsweise 'RSA_PKCS1_OAEP_PADDING' in Ihrer RSA_public_encrypt-Funktion verwendet haben, ist dies SHA1 mit MGF1. http://developer.apple.com/library/ios/#documentation/System/Conceptual/ManPages_iPhoneOS/man3/RSA_public_encrypt.3ssl.html. Wie sieht dein iOS-Code aus? – vcsjones

Antwort

5

Der folgende Code funktioniert, wenn jemand anderes mit ähnlicher Verschlüsselungscodierung/padding Problemen steckt

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

Der Code in der ersten Antwort funktioniert, aber es wird nicht empfohlen, da es BouncyCastle interne Klassen verwendet, statt JCA generische Schnittstellen, die den Code BouncyCastle spezifisch machen. Zum Beispiel wird es schwierig, zum SunJCE-Anbieter zu wechseln.

Hüpfburg ab Version 1.50 unterstützt folgende OAEP-Padding-Namen.

  • RSA/NONE/OAEPWithMD5AndMGF1Padding
  • RSA/NONE/OAEPWithSHA1AndMGF1Padding
  • RSA/NONE/OAEPWithSHA224AndMGF1Padding
  • RSA/NONE/OAEPWithSHA256AndMGF1Padding
  • RSA/NONE/OAEPWithSHA384AndMGF1Padding
  • RSA/NONE/OAEPWithSHA512AndMGF1Padding

Dann richtiges RSA-OAEP Chiffre Initialisierungen würde aussehen wie

Cipher c = Cipher.getInstance("RSA/NONE/OAEPWithSHA1AndMGF1Padding", "BC"); 
Verwandte Themen