10

我正在 Java/Android 中实现加密代码以匹配 iOS 加密。在 iOS 中,使用以下填充方案使用 RSA 进行加密:PKCS1-OAEP

但是,当我尝试使用 PKCS1-OAEP 创建密码时。

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

第一个答案中的代码确实有效,但不推荐使用,因为它使用 BouncyCastle 内部类,而不是 JCA 通用接口,使代码 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 回答