【问题标题】:RSA Signature is different generated from rsa module and m2cryptoRSA 签名与 rsa 模块和 m2crypto 生成的不同
【发布时间】:2017-07-26 07:19:25
【问题描述】:

我正在将一项服务从 Python 2.7 迁移到 Python 3.5,该服务使用 RSA 加密/解密与另一个服务进行通信。


Python(v2.7) m2crypto(0.25.1)

key = M2Crypto.RSA.load_key(private_key)
digest = hashlib.sha1(bytes(cipher_text, encoding="UTF-8")).hexdigest()
signature = hexlify(key.private_encrypt(digest, M2Crypto.RSA.pkcs1_padding))

Python(v3.5) rsa(v3.4.2)

pri_key = rsa.PrivateKey.load_pkcs1(private_key)
signature = hexlify(rsa.sign(cipher_text.encode(), pri_key, "SHA-1"))

上述代码产生的签名不同。这些包有什么区别?

【问题讨论】:

    标签: python-2.7 python-3.x rsa digital-signature m2crypto


    【解决方案1】:

    您正在执行不同的加密操作。 用私钥加密!= 数字签名

    signature = hexlify(key.private_encrypt(digest, M2Crypto.RSA.pkcs1_padding))
    

    signature = hexlify(rsa.sign(cipher_text.encode(), pri_key, "SHA-1"))
    

    带有 PCKS#1 v1.5 的数字签名对摘要算法标识符和以 ASN.1 编码的消息摘要进行 RSA 加密

    signature = 
        RSA_Encryption( 
          ASN.1(DigestAlgorithmIdentifier  + SHA1(message) )) 
    

    虽然加密不包括摘要算法标识符

    似乎 Python key.private_encrypt 是 openssl RSA_private_encrypt 的包装器,请查看有关您正在使用的pkcs1_padding 的警告

    RSA_PKCS1_PADDING

    PKCS #1 v1.5 填充。此函数不处理 PKCS #1 中指定的 algorithmIdentifier。生成或验证 PKCS #1 签名时,应使用RSA_sign(3)RSA_verify(3)

    您应该使用sign 而不是private_encrypt 进行数字签名。但是如果你想加密来隐藏消息的内容,你应该使用公钥加密,而不是私钥。

    【讨论】:

    • 但是如果第二个服务接受了从 m2crypto 代码生成的签名,我该怎么办?
    • 如果您拥有此服务,建议您进行相应修改。如果不可能,我想你别无选择,只能继续使用private_encrypt
    • 替代选项是帮助我完成gitlab.com/m2crypto/m2crypto/merge_requests/65 并且您不必移植出 M2Crypto ;)。但是,我现在正在支持 OpenSSL 1.1.0,因此该分支的主要变基是可以预料的。
    • @infiQuanta 我的回答可以接受,您需要进一步澄清吗?
    猜你喜欢
    • 1970-01-01
    • 2023-02-16
    • 2017-06-22
    • 2018-06-14
    • 2019-03-17
    • 2020-09-08
    • 2012-02-18
    • 2012-11-05
    相关资源
    最近更新 更多