Почему openssl не может проверить подпись, созданную криптографической библиотекой Python?

Я создал подпись файла, используя криптографическую библиотеку Python по этой ссылке [1]. Это фрагмент, который я использую (я пропустил часть, где я сериализую подпись в файл.

>>> from cryptography.hazmat.primitives import hashes
>>> from cryptography.hazmat.primitives.asymmetric import padding
>>> message = b"A message I want to sign"
>>> signature = private_key.sign(
...     message,
...     padding.PSS(
...         mgf=padding.MGF1(hashes.SHA256()),
...         salt_length=padding.PSS.MAX_LENGTH
...     ),
...     hashes.SHA256()
... )

Проблема в том, что когда я пытаюсь проверить файл подписи с помощью openssl CLI, происходит сбой:

openssl dgst -sha256 \
> -signature sig.sha256 \
> -verify pubkey.pem \
> -sigopt rsa_padding_mode:pss \
> -sigopt rsa_pss_saltlen:-1 \
> -sigopt rsa_mgf1_md:sha256 \
> myfile
Verification Failure

Я не уверен, что еще проверить здесь. Предполагая, что все остальное я делаю правильно, единственное, в чем я не уверен на 100%, это правильность моих флагов openssl. Возможно, они не соответствуют настройкам процесса подписи в криптографии?

[1] https://cryptography.io/en/latest/hazmat/primitives/asymmetric/rsa/#signing

РЕДАКТИРОВАТЬ: Исправление состоит в том, чтобы либо полностью удалить -sigopt rsa_pss_saltlen, либо установить для него значение -sigopt rsa_pss_saltlen:-2, что устанавливает длину соли на основе структуры блока PSS (согласно https://www.openssl.org/docs/man1.0.2/man1/pkeyutl.html).


person trinth    schedule 01.10.2019    source источник
comment
Обычно проблема скорее в кодировке сообщения, т.е. знак порядка байтов, другая кодировка или окончание строки.   -  person Maarten Bodewes    schedule 02.10.2019


Ответы (1)


Я создал следующий скрипт sign.py на основе криптографической библиотеки Python, на которую вы ссылались:

#!/usr/bin/env python

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
import sys
import os

with open("./private.pem", "rb") as key_file:
    private_key = serialization.load_pem_private_key( key_file.read(),
        password=None, backend=default_backend())

with open(sys.argv[1], "r") as file_to_sign:
    message = file_to_sign.read()
    message = message.encode()

signature = private_key.sign( message, padding.PSS(
                mgf=padding.MGF1(hashes.SHA256()),
                salt_length=padding.PSS.MAX_LENGTH), hashes.SHA256())
sigfile = "%s.%s" % (os.path.splitext(sys.argv[1])[0] , "sig")
with open(sigfile, "wb") as to_sig_file:
    to_sig_file.write(signature)

Затем я создал текстовый файл message.txt с вашим сообщением и сгенерировал подпись как таковую:

./sign.py message.txt

Результатом этого скрипта является подпись в файле message.sig

Мне удалось успешно проверить ее с помощью следующей команды openssl:

openssl dgst -sha256 -verify public.pem -signature message.sig -sigopt \
rsa_padding_mode:pss  message.txt
Verified OK
person Ashaman Kingpin    schedule 02.10.2019
comment
Спасибо. Исправлено после того, как я удалил следующий флаг из команды openssl -sigopt rsa_pss_saltlen:-1. - person trinth; 02.10.2019
comment
Спасибо за этот ответ. это спасло мой день! - person samba2; 09.12.2019