据我所知,两者是相同的,但是其中一台可以在同一台PC上工作,而相同的代码则表示:

javax.crypto.NoSuchPaddingException:OAEPWITHSHA-256ANDMGF1PADDING在另一台计算机上的RSA不可用。

当我从名称(-)中删除破折号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());
    }

}

最佳答案

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 ...),有时还要在特定的程序连接器上使用:您使用PKCS#11令牌使用相同驱动程序/程序版本的两台PC,并且两台PC均已正确安装,因为其中一台计算机可能存在错误,导致您无法正确使用RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING

希望这可以帮助,

关于java - “RSA/ECB/OAEPWITHSHA256ANDMGF1PADDING”和“RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING”之间的区别是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28190858/

10-12 00:33
查看更多