Py学习  »  Python

当使用pycrypto api检查时,python cryptography rsassa pss signature返回无效

panda_inline4 • 4 年前 • 405 次点击  

我试图围绕python的密码模块构建一个包装程序,用于测试和生成硬件实现的测试向量。在硬件上,使用具有sha256数据哈希和mgf1 sha1标识符的rsassa_pss。

我从pycrypto生成的签名中得到一个有效的签名响应,而在加密模块中,签名似乎无效。

下面的实现是针对pycrpto的:

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))

下面的实现是针对cryptogrpahy模块的:

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.asymmetric import utils
from cryptography.hazmat.primitives import hashes
import binascii

digestAlg_obj = hashes.SHA256()
digest_obj = hashes.Hash(self.digestAlg_obj, backend = default_backend())
digest_obj.update(bytes.fromhex('ABCD'))
digest_bytv = digest_obj.finalize()
print(binascii.hexlify(sha256_data))

with open(RSATest_private.pem, "rb") as key_file:
    self.prvKey_obj = serialization.load_pem_private_key(key_file.read(),password=None,backend=default_backend())
signature_bytv = self.prvKey_obj.sign(digest_bytv,padding.PSS(mgf = padding.MGF1(hashes.SHA1()),salt_length=padding.PSS.MAX_LENGTH),utils.Prehashed(hashes.SHA256()))
print(binascii.hexlify(signature_bytv))

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

SHA256中的哈希值与两个模块中的数据匹配,但在加密模块的情况下,在硬件上检查时生成的签名返回无效。

γ

密码模块的参数用法有问题吗?

从pycrypto模块的文档中,我看到sha1用于mgf1,salt长度也等于hash算法的最大长度。

所以在密码模块中使用相同的值应该能提供一个有效的签名。

同时验证由加密api生成的签名在使用与pycryptoapi对应的公钥进行检查时返回sign invalid。

我试图用mgf1生成hash alg为sha256的签名,只是为了检查最新的主要嵌入式硬件实现,但在这方面没有进展。

使用python3.6、pycrypto v2.6.1和cryptography v2.2.2

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40260
 
405 次点击  
文章 [ 1 ]  |  最新文章 4 年前
panda_inline4
Reply   •   1 楼
panda_inline4    5 年前

问题似乎解决了:)

对于面临类似问题的任何人,pycrypto或openssl for rsassa-pss中mgf1函数的默认哈希alg是sha256,salt_长度等于数据的摘要长度。

因此,将mgf1算法更改为hashes.sha256()并将salt_length更改为32就解决了这个问题。