【问题标题】:what is deference between "RSA/ECB/OAEPWITHSHA256ANDMGF1PADDING" and "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING"“RSA/ECB/OAEPWITHSHA256ANDMGF1PADDING”和“RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING”之间有什么区别
【发布时间】:2015-03-27 06:29:44
【问题描述】:

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

}

【问题讨论】:

  • 请给出一些代码...

标签: java encryption bouncycastle pkcs#11


【解决方案1】:

RSA/ECB/OAEPWITHSHA256ANDMGF1PADDINGRSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING 是不同的别名,但都指的是相同的算法,所以从这个意义上说根本没有区别。

问题是您正在使用PKCS#11(加密令牌接口)来加密您的数据。根据javaPKCS#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 .

希望这会有所帮助,

【讨论】:

    【解决方案2】:

    这两种算法都由不同的安全提供商提供。

    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)
    

    【讨论】:

      【解决方案3】:

      情况比较复杂。 RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING 名义上由 SunJCE 提供。 RSA/NONE/OAEPWITHSHA256ANDMGF1PADDING 由 BC 提供。

      但是,如果 BC 是在 SunJCE 提供者之前安装的(使用 Security.installProviderAt),那么 BC 能够接管并充当 RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING 的提供者。不幸的是,BC 并没有像 SunJCE 那样参数化这个算法。因此,该算法的 BC 实现与 SunJCE 提供的不同(!),后者将成为填充错误的来源。

      SunJCE RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING 将 SHA-1 用于 MGF1 函数,将 SHA-256 用于标签哈希(几乎总是一个空字节数组,因此是一个静态值)。

      BC RSA/NONE/OAEPWITHSHA256ANDMGF1PADDING 将 SHA-256 用于 MGF1 函数,将 SHA-256 用于标签哈希。如果要求 BC 提供 RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING,它也将使用相同的参数。

      建议:始终明确指定安全提供程序以确保使用正确的提供程序。或者,明确指定 OAEP 参数并且不要依赖默认值(推荐)。

      我已经向 BC 报告了这个问题,所以也许它会得到解决。

      【讨论】:

        猜你喜欢
        • 2015-11-16
        • 2020-03-17
        • 1970-01-01
        • 2019-05-27
        • 2021-11-16
        • 2015-08-31
        • 1970-01-01
        • 1970-01-01
        • 2014-07-13
        相关资源
        最近更新 更多