2013-06-14 3 views
8

Я использую код шифрования в Java/Android для соответствия шифрованию iOS. В iOS есть шифрование с помощью RSA с использованием следующей схемы заполнения: PKCS1-OAEPПоддерживается ли поддержка RSA PKCS1-OAEP в bouncycastle?

Однако, когда я пытаюсь создать Cipher с PKCS1-OAEP.

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

Ниже 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) 

Может быть, это RSA/None/PKCS1-OAEP неверен? но не может найти окончательного ответа, чтобы сказать, что PKCS1-OAEP не поддерживается или правильный способ его определения.

Я использую библиотеку spongycastle так, чтобы иметь полную реализацию bouncycastle.

+0

Без более подробно, что трудно сказать, но это может быть что-то вроде 'RSA/None/OAEPWithSHA1AndMGF1Padding', например. – vcsjones

+0

@vcsjones Я вижу это на следующем http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions, но в то время как это прошло мимо исключения NoSuchPaddingExN, это то же дополнение, что и PKCS1- OAEP. Какие дополнительные детали помогут? – scottyab

+0

OAEP использует * некоторую * функцию хэширования, будь то SHA1 или что-то еще, зависит от реализации. Нам нужно больше узнать о вашей реализации iOS. Например, если вы использовали 'RSA_PKCS1_OAEP_PADDING' в вашей функции RSA_public_encrypt, то есть SHA1 с MGF1. http://developer.apple.com/library/ios/#documentation/System/Conceptual/ManPages_iPhoneOS/man3/RSA_public_encrypt.3ssl.html. Как выглядит ваш код iOS? – 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 внутренних классы, вместо JCA, что делает код BouncyCastle специфичным. Например, это затруднит переход к поставщику SunJCE.

Bouncy Castle начиная с версии 1.50 поддерживает следующие названия дополнений OAEP.

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

Тогда собственно RSA-OAEP шифров инициализацию будет выглядеть

Cipher c = Cipher.getInstance("RSA/NONE/OAEPWithSHA1AndMGF1Padding", "BC"); 
Смежные вопросы