什么是" RSA / ECB / OAEPWITHSHA256ANDMGF1PADDING"和" RSA / ECB / OAEPWITHSHA-256ANDMGF1PADDING"

时间:2015-01-28 11:16:29

标签: java encryption bouncycastle pkcs#11

根据我的知识,两者都是相同的,但是一个人在一台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());
    }

}

2 个答案:

答案 0 :(得分:2)

RSA/ECB/OAEPWITHSHA256ANDMGF1PADDINGRSA/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)