有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java bouncycastle是否支持RSA PKCS1OAEP填充?

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

然而,当我尝试用PKCS1-OAEP创建密码时

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

下面是stacktrace

javax.crypto.NoSuchPaddingException: PKCS1-OAEP unavailable with RSA.
    at com.安卓.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) 个答案

  1. # 1 楼答案

    第一个答案中的代码确实有效,但不推荐使用,因为它使用BouncyCastle内部类,而不是JCA通用接口,使代码特定于BouncyCastle。例如,这将使切换到SunJCE提供商变得困难

    从1.50版开始,Bouncy Castle支持以下OAEP填充名称

    • RSA/NONE/OAEPWithMD5和MGF1填充
    • RSA/NONE/OAEPwithsha1和mgf1填充
    • RSA/NONE/OAEPwith SHA224和MGF1填充
    • RSA/NONE/OAEPha256和mgf1填充
    • RSA/NONE/OAEPha384和mgf1填充
    • RSA/NONE/OAEPHA512和MGF1填充

    然后正确的RSA-OAEP密码初始化如下

    Cipher c = Cipher.getInstance("RSA/NONE/OAEPWithSHA1AndMGF1Padding", "BC");
    
  2. # 2 楼答案

    如果其他人遇到类似的加密/填充问题,下面的代码可以工作

        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);