使用pycrypto API进行检查时,Python加密RSASSA PSS签名返回无效

时间:2018-12-03 10:04:29

标签: python-3.x pycrypto pycryptodome python-cryptography

我正在尝试围绕python的Crypto模块构建包装程序,以测试和生成用于硬件实现的测试向量。在硬件上具有SHA256数据散列和MGF1 SHA1标识符的RSASSA_PSS。

我从pycrypto生成的签名中获得了有效的签名响应,而对于加密模块而言,签名似乎无效。

以下实现适用于pycrpto:

merge

,以下实现适用于cryptogrpahy模块:

from Crypto.Hash import SHA256
from Crypto.Signature import PKCS1_PSS
import binascii

string = "ABCD"
message = bytes.fromhex(string)
digest = SHA256.new()
digest.update(message)
print(digest.hexdigest())
private_key = False

with open ("RSATest_private.pem", "rb") as myfile:
    private_key = RSA.importKey(myfile.read())

# Load private key and sign message
signer = PKCS1_PSS.new(private_key)
sig = signer.sign(digest)
print(binascii.hexlify(sig))

我了解,由于PSS算法生成过程中涉及的随机性,因此获得的签名并不相同。两种情况下的算法设置都相同。

两个模块中数据的SHA256的HASH值都匹配,但是如果使用密码模块,则在硬件上检查时生成的签名将无效。

在使用加密模块的情况下,参数用法有问题吗?

从pycrypto模块的文档中,我看到SHA1用于mgf1,盐的长度也等于哈希算法的最大长度。

因此,在密码模块中使用相同的值应为我提供有效的签名。

当通过pycrypto API使用相应的公钥进行检查时,还要验证由加密API生成的签名是否返回无效的签名。

我试图用带有sha256哈希Alg的mgf1生成签名,只是为了检查最新的主流嵌入式硬件实现,但在这里也没有进展。

使用了python3.6,pycrypto v2.6.1和加密技术v2.2.2

1 个答案:

答案 0 :(得分:1)

问题似乎已解决:)

对于面临类似问题的任何人,用于RSASSA-PSS的pycrypto或OPENSSL中MGF1函数的默认哈希算法为SHA256,并且salt_length等于数据的摘要长度。

因此将MGF1算法更改为hash.SHA256()并将salt_length更改为32可解决此问题。