0

我正在尝试围绕 python 的 Crypto 模块构建一个包装程序,用于测试和生成用于硬件实现的测试向量。在硬件上使用带有 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))

下面的实现是针对加密模块的:

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 的 HASH 值用于两个模块中的数据匹配,但在硬件检查时生成的签名在加密模块的情况下返回无效。

 

在密码学模块的情况下参数使用有问题吗?

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

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

当使用 pycrypto API 使用相应的公钥进行检查时,验证密码 API 生成的签名也会返回符号无效。

我尝试使用带有 sha256 哈希算法的 mgf1 生成签名,只是为了检查最新的主要嵌入式硬件实现,但这里也没有任何进展。

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

4

1 回答 1

1

问题似乎解决了:)

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

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

于 2018-12-04T08:02:17.213 回答