我正在尝试围绕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
答案 0 :(得分:1)
问题似乎已解决:)
对于面临类似问题的任何人,用于RSASSA-PSS的pycrypto或OPENSSL中MGF1函数的默认哈希算法为SHA256,并且salt_length等于数据的摘要长度。
因此将MGF1算法更改为hash.SHA256()并将salt_length更改为32可解决此问题。