10

iOS 暗号化と一致するように、Java/Android で暗号化コードを実装しています。iOS では、次のパディング スキームを使用した RSA による暗号化があります: PKCS1-OAEP

ただし、PKCS1-OAEP で Cipher を作成しようとすると、.

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は間違っていますか?しかし、PKCS1-OAEP がサポートされていないか、それを定義する正しい方法であると言う決定的な答えを見つけることができません。

私は spongycastle ライブラリを使用しているので、完全な bouncycastle 実装があります。

4

2 に答える 2

14

最初の回答のコードは機能しますが、JCA ジェネリック インターフェイスの代わりに BouncyCastle 内部クラスを使用してコードを BouncyCastle 固有にするため、お勧めしません。たとえば、SunJCE プロバイダーへの切り替えが困難になります。

バージョン 1.50 の Bouncy Castle は、次の 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");
于 2014-05-27T11:28:40.193 に答える
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);
于 2013-06-21T09:34:32.670 に答える