社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

panda_inline4 • 5 年前 • 610 次点击  

我试图围绕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
 
610 次点击  
文章 [ 1 ]  |  最新文章 5 年前