Криптография Python RSASSA PSS возвращает подпись, которая недействительна при проверке с помощью API Pycrypto - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь построить программу-оболочку вокруг модулей Python Crypto для тестирования и генерации тестовых векторов для аппаратной реализации.На аппаратном RSASSA_PSS с SHA256 используется хеш данных и идентификатор SHA1 MGF1.

Я получаю действительный ответ на подпись от подписи, сгенерированной 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.Алгоритм настройки в обоих случаях одинаков.

Значение HASH из SHA256 для данных совпадает в обоих модулях, но сигнатура, сгенерированная при проверке на оборудовании, возвращает недопустимый в случае модуля криптографии.

Что-то не так с использованием параметров в случае модуля криптографии?

Из документации модуля pycrypto я вижу, что SHA1 используется для mgf1 и длины соли такжеравно максимальной длине алгоритма хеширования.

Таким образом, использование тех же значений в модуле криптографии должно предоставить мне действительную подпись.

Также проверка подписи, сгенерированной API-интерфейсами криптографии, возвращает признак недействительности при проверке с использованиемсоответствующий открытый ключ с API-интерфейсами pycrypto.

Я также попытался сгенерировать сигнатуру с помощью mgf1 с хэш-кодом Alg sha256, чтобы просто проверить последние преобладающие реализации встроенного оборудования, но и здесь без прогресса.

Используется python3.6, pycrypдо v2.6.1 и криптография v2.2.2

1 Ответ

0 голосов
/ 04 декабря 2018

Кажется, что проблема решена:)

Для тех, кто сталкивается с подобной проблемой, хэш-алгоритм по умолчанию в функции MGF1 в pycrypto или OPENSSL для RSASSA-PSS равен SHA256, а значение salt_length равно длине дайджестаdata.

Таким образом, изменение алгоритма MGF1 на hash.SHA256 () и salt_length на 32 решило проблему.

...