我正在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实现。
答案 0 :(得分:13)
第一个答案中的代码确实有效,但不建议这样做,因为它使用BouncyCastle内部类,而不是JCA通用接口,使代码BouncyCastle具体。例如,它将很难切换到SunJCE提供程序。
Bouncy Castle从版本1.50开始支持以下OAEP填充名称。
然后正确的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);