2013-06-14 17 views
8

Sto implementando il codice di crittografia in Java/Android per abbinare la crittografia iOS. In iOS ci sono crittografia con RSA utilizzando il seguente schema di riempimento: PKCS1-OAEPIl padding RSA PKCS1-OAEP è supportato in bouncycastle?

Tuttavia quando provo a creare Cipher con PKCS1-OAEP.

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

riportano di seguito le 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) 

Forse questo RSA/None/PKCS1-OAEP sono errate? ma non è possibile trovare una risposta definitiva per dire che PKCS1-OAEP non è supportato o il modo corretto per definirlo.

Sto usando la libreria spongycastle quindi ho piena implementazione di bouncycastle.

+0

Senza ulteriori dettagli è difficile da dire, ma potrebbe essere qualcosa del tipo 'RSA/nessuno/OAEPWithSHA1AndMGF1Padding', per esempio. – vcsjones

+0

@vcsjones vedo ciò che è stato notato nelle seguenti http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions ma mentre questo supera la NoSuchPaddingException non ha lo stesso riempimento di 'PKCS1- OAEP'. Quali ulteriori dettagli potrebbero aiutare? – scottyab

+0

OAEP utilizza * qualche * tipo di funzione di hashing, sia che si tratti di SHA1 o qualcos'altro dipende dall'implementazione. Abbiamo bisogno di sapere di più sulla tua implementazione iOS. Ad esempio, se hai usato 'RSA_PKCS1_OAEP_PADDING' nella tua funzione RSA_public_encrypt, questo è SHA1 con MGF1. http://developer.apple.com/library/ios/#documentation/System/Conceptual/ManPages_iPhoneOS/man3/RSA_public_encrypt.3ssl.html. Come si presenta il tuo codice iOS? – vcsjones

risposta

5

Il seguente codice funziona, se qualcun altro è bloccato con crittografia simili problemi di codifica/padding

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

Il codice nella prima risposta funziona, ma non è consigliabile in quanto utilizza le classi interne BouncyCastle, invece di Interfacce generiche JCA, rendendo specifico il codice BouncyCastle. Ad esempio, renderà difficile passare al provider SunJCE.

Castello gonfiabile dalla versione 1.50 supporta i seguenti nomi di padding OAEP.

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

Poi adeguati inizializzazioni cifratura RSA-OAEP sarebbe simile

Cipher c = Cipher.getInstance("RSA/NONE/OAEPWithSHA1AndMGF1Padding", "BC"); 
Problemi correlati