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

以下の実装は 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 からの HASH 値は両方のモジュールで一致しますが、暗号化モジュールの場合、ハードウェアでチェックしたときに生成された署名は無効を返します。

 

暗号化モジュールの場合、パラメーターの使用法に問題はありますか?

pycrypto モジュールのドキュメントから、SHA1 が mgf1 に使用され、ソルトの長さもハッシュ アルゴリズムの最大長に等しいことがわかります。

したがって、暗号化モジュールで同じ値を使用すると、有効な署名が得られます。

また、暗号化 API によって生成された署名を検証すると、pycrypto API で対応する公開鍵を使用してチェックすると、無効な署名が返されます。

最新の主要な組み込みハードウェア実装を確認するためだけに、sha256 のハッシュ Alg を使用して mgf1 で署名を生成しようとしましたが、ここでも進歩はありませんでした。

python3.6、pycrypto v2.6.1、および暗号化 v2.2.2 を使用

4

1 に答える 1