【问题标题】:How to set padding (OAEP) for PKCS7_decrypt function using OpenSSL如何使用 OpenSSL 为 PKCS7_decrypt 函数设置填充 (OAEP)
【发布时间】:2019-07-08 19:30:59
【问题描述】:

我正在使用 OpenSSL 加密和解密 CMS_envolped 数据的有效负载,但我想使用 AES256 密码和 OAEP 填充(而不是 PKCS 1.5 填充)。当我使用 PKCS1.5 填充进行加密时,我很好,并且可以解密,但是当我加密并使用 OAEP 填充时,我无法解密。使用 PKCS7_decrypt 解密时如何设置填充类型?

docs 只讨论一个不适用于填充的标志。我应该使用不同的 OpenSSL 解密方法来进行支持 OAEP 的解密吗?我找不到任何关于它的文档,但我承认我不是 OpenSSL 专家。

    guard PKCS7_decrypt(p7, privateKey, x509Cert, decryptedData, 0) == 1 else {
        throw OpenSSLTests.decryptException
    }

    ...

这无关紧要,但我在 iOS 客户端上的 Swift 中使用 OpenSSL。

【问题讨论】:

    标签: swift encryption openssl


    【解决方案1】:

    终于找到答案了。

    文档在任何地方都没有提到 OAEP 填充,但似乎 OpenSSL 中的 PKCS7_decrypt 函数不支持 OAEP 填充。据我所知,密码和填充都是在尝试解密时自动检测到的。

    我尝试在 OpenSSL 中使用 CMS_decrypt 函数,该函数也没有指定填充的标志,并且能够很好地解密带有 OAEP 填充的 AES256 密码。

     ... 
    
        //nil would represent failure
        guard let cms = d2i_CMS_bio(encryptedDataBIO, nil) else {
            throw OpenSSLTestErrors.failedToLoadCMS
        }
    
       //1 indicates success
        guard CMS_decrypt(cms, key, x509Cert, nil, decryptedData, 0) == 1 else {
            throw OpenSSLTestErrors.failedToDecrypt
        }
    

    CMS_decrypt 的文档位于 here

    我想请一位更精通 OpenSSL 的人来解释为什么 PKCS7_decrypt 函数不起作用,而 CMS_decrypt 对于使用 OAEP 填充加密的项目起作用。 (或者为什么 PKCS7_decrypt 函数使用 PKCS1.5 填充成功)

    我也看不到在 OpenSSL 的 CMS_encrypt 函数中可以指定填充的位置。默认情况下它使用PKCS1.5 然后我使用解码器检查加密数据。我假设还有一种方法可以设置它,因为我能够解密使用另一个允许指定填充的库加密的内容。

    【讨论】:

    • 我可以确认这一点。在 OpenSSL 用户邮件列表中查看我的 discussion。通过编写简单的 C 程序,我能够证明问题并找到一种解决方法,即在使用 CMS_decrypt() 之前将PKCS7 结构转换为CMS_ContentInfo 结构。我将打开一个关于此的问题。
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2013-04-28
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    相关资源
    最近更新 更多