【问题标题】:php openssl - RSA_padding_check_PKCS1_type_2 and RSA_EAY_PRIVATE_DECRYPT:padding check failed:rsa_eay.c:602:php openssl - RSA_padding_check_PKCS1_type_2 和 RSA_EAY_PRIVATE_DECRYPT:填充检查失败:rsa_eay.c:602:
【发布时间】:2021-04-06 07:13:12
【问题描述】:

我很难理解我的问题是什么,所以我希望有人可以帮助我。所以,我有一个 xml 文件,它是根据 W3C recomendations 而构建的,因此,有一些特定的标签是用我的公钥加密的,现在我需要使用我的私钥对它们进行解密,例如这块代码:

<AuthenticatedPrivate Id="ID_AuthenticatedPrivate">
        <enc:EncryptedKey xmlns:enc="http://www.w3.org/2001/04/xmlenc#">
            <enc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" />
            <enc:CipherData>
                <enc:CipherValue>lwYdkG5Q5wfW/S7UzZDtnJMcAng3w3ketzkh68y1BeX+okNEj48b5rSWUC/4mNhT
N2QsHxOCkvKDavIGGSAP23tdp0VtdeHTNAszcgK4Xzc8VHGUEiswONCOxTzNWuwj
....
zfHceeHN50b8vzM/Rt/jTUq54eC3nE+lP3eTXbLj/YvpPo8H45Sti9YP9WZixGHz
Uvf6Go31+3JwsXXIUl3O+w==</enc:CipherValue>
            </enc:CipherData>
        </enc:EncryptedKey>
        <enc:EncryptedKey xmlns:enc="http://www.w3.org/2001/04/xmlenc#">
            <enc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" />
            <enc:CipherData>
                <enc:CipherValue>TvC1LCspgTsXqM1b8ClPCtAkAdXXzxe+Av7LMxYtUaqUbd8HeBuaS1cx3WwoVRDr
TWcrBEnv24GbIB5ygcMFW3DlGsXfmWJGnRNx/6xT/U15RQPgoD9AP4WFEHxthzP0
....
1ajG5lDjEu4TqjdL7DPGNu9HfI9boerJ5FUFQ/fMdD4xbDHdc4DgIQdTUgLFGHJz
RwOyfOAcSNoO/fpAkMXoEw==</enc:CipherValue>
            </enc:CipherData>
        </enc:EncryptedKey>
    </AuthenticatedPrivate>

我需要解密它,所以我所做的是:

  1. 解析xml,得到我需要的标签(CipherValue)。实际上把它放在一个文件中,cypher.xml

  2. cat cypher.xml| base64 -D > 原始文件

  3. openssl rsautl -decrypt -in rawFile -out plaintext -inkey private.pem

结果是:

4476804716:error:0407109F:rsa routines:RSA_padding_check_PKCS1_type_2:pkcs decoding error:rsa_pk1.c:273:
4476804716:error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed:rsa_eay.c:602:

我在这里缺少什么?我在这方面浪费了太多时间,我看到了一些关于使用填充的东西,但我直接在我的 php 应用程序上使用:

openssl_private_decrypt($tag, $decrypted, $privkey, OPENSSL_PKCS1_PADDING);

但是没有!运气好。

感谢您的宝贵时间,问候

编辑

我正在使用的代码序列是这样的:

$xmlFile = file_get_contents(path_to_my_xml_file);
$privkey = openssl_pkey_get_private(path_to_my_private_key);
$arrCplContent =  XmlToArray::convert($xmlFile);
$tag = $arrCplContent['AuthenticatedPrivate']['enc:EncryptedKey'][0]['enc:CipherData']['enc:CipherValue'];
$b64Dec = base64_decode($tag);
$result = openssl_private_decrypt($b64Dec, $decrypted, $privkey, OPENSSL_PKCS1_OAEP_PADDING);

当我记录这个时,结果是:

error:04099079:rsa routines:RSA_padding_check_PKCS1_OAEP_mgf1:oaep decoding error

考虑到this,这是正确的做事方式吗?

【问题讨论】:

    标签: php ssl encryption openssl rsa


    【解决方案1】:

    首先,您在执行解密时似乎使用 PKCS#1 v1.5 填充而不是 OAEP 填充。你可以看到 OPENSSL_PKCS1_OAEP_PADDING listed for openssl_private_decrypt

    注意 XML 文档中包含 OAEP 填充指示的行:

    里面有两个CipherValue 元素。通常这意味着密文是使用两个不同的密钥对创建的,因此是两个单独的私钥。您可能只需要解密另一个EncryptedKey

    一般要解决这个问题:XML 加密或 XML enc 是 full standard,您需要实现标准或 - 通常推荐的 - use a library 来解密它。

    免责声明:我不隶属于所示图书馆,我对它的安全性没有任何意见。

    【讨论】:

    • 嗨,Maarten,首先感谢您的回答,我真的很坚持这个问题,我已经编辑了我的问题,您能看一下吗?问候
    • 这类问题的问题在于,它基本上是在调试,但对我们来说没有调试环境。检查您是否尝试了我指出的两个值,并在尝试解密之前进行比较。非常请在上面加糖,确保你有正确的键,否则你会得到填充错误直到时间结束。请注意,需要为 OAEP 配置一个哈希值;通常这不是问题,但如果所有其他方法都失败了,您可以检查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2018-10-12
    • 2017-09-18
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多