根据我的知识,两者都是相同的,但是一个人在一台PC上工作,而相同的代码说:
javax.crypto.NoSuchPaddingException:另一台计算机上的RSA 无法使用OAEPWITHSHA-256ANDMGF1PADDING。
当我从名称(-
)中删除破折号OAEPWITHSHA256ANDMGF1PADDING
时,它开始在另一台计算机上运行,但导致错误导致其他一些行填充异常。
可能是什么原因?
提示的示例代码
我正在使用jdk1.7.0_71 32bit
:
private byte[] decryptSecretKeyData(byte[] encryptedSecretKey, byte[] iv, PrivateKey privateKey) throws Exception
{
try {
Provider provider= new sun.security.pkcs11.SunPKCS11(keyStoreFile1);
Security.addProvider(provider);
LOG.info("**************Inside decryptSecretKeyData***********************");
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING", provider);
// decrypting the session key with rsa no padding.
rsaCipher.init(Cipher.DECRYPT_MODE, privateKey);
/* The reason is RSA OAEP SHA256 is not supported in HSM. */
byte[] decKey = rsaCipher.doFinal(encryptedSecretKey);
OAEPEncoding encode = new OAEPEncoding(new RSAEngine(), new SHA256Digest(), iv);
LOG.info("******************RSAPublicKey rsaPublickey = (*****************************");
java.security.interfaces.RSAPublicKey rsaPublickey = (java.security.interfaces.RSAPublicKey) publicKeyFile;
RSAKeyParameters keyParams = new RSAKeyParameters(false, rsaPublickey.getModulus(), EXPONENT);
encode.init(false, keyParams);
LOG.info("******************encode.processBlock(decKey, 0, decKey.length);************************");
byte decryptedSecKey[] = encode.processBlock(decKey, 0, decKey.length);
return decryptedSecKey;
} catch (InvalidCipherTextException e) {
LOG.info("*******************Failed to decrypt AES secret key using RSA :**********************");
throw new Exception("Failed to decrypt AES secret key using RSA :" + e.toString());
}
}
答案 0 :(得分:2)
RSA/ECB/OAEPWITHSHA256ANDMGF1PADDING
和RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING
是不同的别名,但两者都指的是相同的算法,所以从这个意义上来说根本没有区别。
问题在于您使用PKCS#11
(加密令牌界面)来加密数据。根据java PKCS#11
reference:
Sun PKCS#11提供商与大多数其他提供商相比,本身并未实施加密算法。 相反,它充当Java JCA和JCE API之间的桥梁 原生PKCS#11加密API,翻译和调用 两者之间的约定。这意味着Java应用程序调用 标准的JCA和JCE API可以不加修改地利用 底层PKCS#11实现提供的算法,例如 例如,
加密智能卡,硬件加密加速器和 高性能软件实现。 请注意,仅限Java SE 有助于访问本机PKCS#11实现,但它没有 本身包括原生PKCS#11实施。但是,加密 智能卡和硬件加速器等设备经常随附 包含PKCS#11实现的软件,您需要这样做 根据制造商的说明进行安装和配置。
总结一下,如果您使用PKCS#11
,算法的使用取决于供应商本机实现(Windows上为.dll
,Linux上为.so
...)有时在特定的程序连接器上:检查两台PC中是否使用相同的驱动程序/程序版本作为PKCS#11
令牌并且两者都已正确安装,因为其中一个可能存在错误这不允许您正确使用RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING
。
希望这有帮助,
答案 1 :(得分:1)
两种算法均由不同的安全提供程序提供。
RSA / ECB / OAEPWITHSHA256ANDMGF1PADDING
由Bouncy Castle提供商提供
RSA / ECB / OAEPWITHSHA-256ANDMGF1PADDING
由SUN JCE提供商提供。在我们的例子中,我们能够成功使用Bouncy Castle提供程序算法,但如果我用SUN JCE算法替换它,那么它会出现以下错误:
Exception in thread "main" javax.crypto.BadPaddingException: lHash mismatch
at sun.security.rsa.RSAPadding.unpadOAEP(RSAPadding.java:425)
at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:274)
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:356)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:382)