bouncycastle支持RSA PKCS1-OAEP填充吗?

时间:2013-06-14 13:56:37

标签: java android security bouncycastle

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

然而,当我尝试使用PKCS1-OAEP创建Cipher时。

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实现。

2 个答案:

答案 0 :(得分: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");

答案 1 :(得分: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);