Java 什么是尊重;RSA/ECB/OAEPHA256和MGF1padding“;及;RSA/ECB/OAEPHA-256和MGF1填充;
据我所知,两者都是相同的,但其中一个在一台电脑上工作,而相同的代码表示: javax.crypto.NoSuchPaddingException:OAEPWITHSHA-256和MGF1Padding在另一台计算机上不适用于RSA 当我从名称(Java 什么是尊重;RSA/ECB/OAEPHA256和MGF1padding“;及;RSA/ECB/OAEPHA-256和MGF1填充;,java,encryption,bouncycastle,pkcs#11,Java,Encryption,Bouncycastle,Pkcs#11,据我所知,两者都是相同的,但其中一个在一台电脑上工作,而相同的代码表示: javax.crypto.NoSuchPaddingException:OAEPWITHSHA-256和MGF1Padding在另一台计算机上不适用于RSA 当我从名称(oaepwithsha256和mgf1padding)中删除破折号-时,它开始在另一台机器上运行,但会导致错误,导致某些其他行错误填充异常。 原因可能是什么 提示的示例代码 我使用的是jdk1.7.07132bit: private byte[] decr
oaepwithsha256和mgf1padding
)中删除破折号-
时,它开始在另一台机器上运行,但会导致错误,导致某些其他行错误填充异常。
原因可能是什么
提示的示例代码
我使用的是jdk1.7.07132bit
:
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());
}
}
RSA/ECB/oaepwithsha256和mgf1padding
和RSA/ECB/OAEPWITHSHA-256和mgf1padding
是不同的别名,但都引用相同的算法,因此在这个意义上根本没有区别
问题是,您正在使用PKCS#11
(加密令牌接口)对数据进行加密。根据java:
与大多数其他提供商相比,Sun PKCS#11提供商本身并不实现加密算法。
相反,它充当Java JCA和JCE API与
原生PKCS#11加密API,转换调用和
两者之间的约定。这意味着Java应用程序调用
标准JCA和JCE API无需修改即可利用
底层PKCS#11实现提供的算法,例如,
比如说,
加密智能卡、硬件加密加速器和
高性能软件实现请注意,只有JavaSE
有助于访问本机PKCS#11实现,而不是
它本身包括一个本机PKCS#11实现。但是,加密
诸如智能卡和硬件加速器之类的设备通常随附
包含PKCS#11实现的软件,您需要
根据制造商的说明进行安装和配置
总之,如果您使用的是PKCS#11
,则算法的使用取决于供应商的本机实现(.dll
在windows上,在linux上,在linux上……)有时在特定的程序连接器上,因此:检查两台电脑上的PKCS#11
令牌是否使用了相同的驱动程序/程序版本,并且两个令牌都已正确安装,因为其中一个可能存在错误,不允许您正确使用RSA/ECB/oaepithsha-256和mgf1填充
希望这有帮助,这两种算法都是由不同的安全提供商提供的。
RSA/ECB/OAEPHA256和MGF1填充
由Bouncy Castle提供商在
RSA/ECB/OAEPHA-256和MGF1
由SUN JCE提供程序提供。在我们的例子中,我们能够成功地使用Bouncy Castle provider算法,但如果我将其替换为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)
请给出一些代码。。。