Вы используете ключи неправильно. В криптографии с открытым ключом шифрование использует открытый ключ:
openssl rsautl -in txt.txt -out txt2.txt -inkey public.pem -pubin -encrypt
А для расшифровки используется закрытый ключ, связанный с открытым ключом:
openssl rsautl -in txt2.txt inkey private.pem -decrypt
Закрытый ключ ( без -pubin
) можно использовать для шифрования, поскольку он фактически содержит открытый показатель. Обратите внимание, что RSA обычно не следует использовать для непосредственного шифрования данных, а только для «инкапсуляции» (RSA-KEM) или «обертывания» ключей, используемых для симметричного шифрования.
Но вы упоминаете, что действительно хотитеизучить подпись. Хотя исторически подпись RSA иногда описывалась как «шифрование с помощью закрытого ключа», это описание вводит в заблуждение и фактически реализует то, что оказалось небезопасным. Подписывать и проверять фактически разные операции, отличные от шифрования и дешифрования, и rsautl
выполняет только часть из них. Например, вы можете сделать:
# hash the data and encode the result in ASN.1
openssl rsautl -sign -in hashenc.dat -out sig.dat -inkey private.pem
...
# on the recipient (with signature and purportedly correct data)
openssl rsautl -verify -in sig.dat -out hashenc.dat -inkey public.pem -pubin
# or often more appropriate use a certificate for the public key
openssl rsautl -verify -in sig.dat -out hashenc.dat -inkey cert.pem -certin
# now either decode hashenc.dat and compare the hash
# to a new hash of the data (which should be the same)
# or compare all of hashenc.dat to an encoding of a new hash
Вместо этого лучше использовать openssl dgst
, который выполняет всю подпись и проверку последовательность , как указано в PKCS1 например, rfc8017 . Например, для подписи RSASSA-PKCS1v1_5 с SHA256 :
openssl dgst -sha256 -sign private.pem -in data.txt -out sig.dat
# or can be abbreviated
openssl sha256 -sign private.pem -in data.txt -out sig.dat
# hashes the data, encodes the hash, does type 1 padding and modexp d
...
openssl dgst -sha256 -verify public.pem -in data.txt -signature sig.dat
# or abbreviated
openssl sha256 -verify public.pem -in data.txt -signature sig.dat
# does modexp e and type 1 unpadding, and compares the result to a hash of the data
# notice you don't specify which key is public or private
# because this command knows what to expect
# however it does not accept the public key from a certificate,
# you must extract the public key from the cert first
Эта форма (но не rsautl
) также поддерживает более новый и технически лучший, но не так широко используемый, заполнение PSS,Об этом упоминается только на справочной странице dgst
, и в основном документируется на справочной странице pkeyutl
, что не совсем очевидно.
В других стеках, где это более актуально, см., Например:https://security.stackexchange.com/questions/93603/understanding-digitial-certifications
https://security.stackexchange.com/questions/87325/if-the-public-key-cant-be-used-for-decrypting
https://security.stackexchange.com/questions/11879/is-encrypting-data-with-a-private-key-dangerous
https://security.stackexchange.com/questions/68822/trying-to-understand-rsa-and-its-terminology
https://crypto.stackexchange.com/questions/2123/rsa-encryption-with-private-key-and-decryption-with-a-public-key
https://crypto.stackexchange.com/questions/15997/is-rsa-encryption-the-same-as-signature-generation
https://crypto.stackexchange.com/questions/15295/why-the-need-to-hash-before-signing-small-data