Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是尊重;RSA/ECB/OAEPHA256和MGF1padding“;及;RSA/ECB/OAEPHA-256和MGF1填充;_Java_Encryption_Bouncycastle_Pkcs#11 - Fatal编程技术网

Java 什么是尊重;RSA/ECB/OAEPHA256和MGF1padding“;及;RSA/ECB/OAEPHA-256和MGF1填充;

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

据我所知,两者都是相同的,但其中一个在一台电脑上工作,而相同的代码表示:

javax.crypto.NoSuchPaddingException:OAEPWITHSHA-256和MGF1Padding在另一台计算机上不适用于RSA

当我从名称(
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)

请给出一些代码。。。