Я пытаюсь использовать Crypt::OpenSSL::RSA для шифрования файла с помощью открытого ключа, а затем расшифровать его с помощью соответствующего закрытого ключа (который в настоящее время я ввожу в командной строке). Моя программа шифрования работает нормально; но я получаю непонятную ошибку, когда пытаюсь расшифровать. Может ли кто-нибудь помочь мне диагностировать это и понять, что я делаю неправильно? Документация немного отрывочна, и единственный пример, который я нашел в Интернете, не работает совершенно по-другому.
Вот тестовая программа ("pub_decrypt")
#! /usr/bin/perl
use strict;
use warnings;
use 5.026;
use Crypt::OpenSSL::RSA;
my $private_key_file = 'private.pem';
my $input_file = shift or exit;
die "Input file '$input_file' not found\n" unless -e $input_file;
print "Enter passphrase for '$private_key_file': ";
my $passphrase = <>;
chomp $passphrase;
exit unless $passphrase;
my $priv_key = Crypt::OpenSSL::RSA->new_private_key( $private_key_file, $passphrase )
or die "Failed to get private key";
my $decrypted = $priv_key->decrypt( $input_file )
or die "Decryption failed";
print "Decrypted text:\n$decrypted\n";
Когда я запускаю его, происходит следующее:
./pub_decrypt encrypted_text
Enter passphrase for 'private.pem': blahblah
Usage: Crypt::OpenSSL::RSA::new_private_key(proto, key_string_SV) at ./pub_decrypt line 18, <> line 1.
Мне нравится, когда библиотека сообщает вам, что вы сделали неправильно при ее вызове, но в этом случае предлагаемое использование не похоже на документацию модуля. Что такое «прото» и какой формат ключевой строки «_SV» предлагает мне использовать?
Ты прав; Я пропустил это. Поэтому я импортировал File::Slurp, прочитал файл закрытого ключа и передал его текст методу new_private_key (остальная часть кода осталась, как показано). Ошибка та же самая. Это говорит о том, что ошибка находится в «прото», каким бы оно ни было. Но я все еще озадачен.
SV
— внутренний тип скаляра. Переменная обязательно имеет имя key_string_SV
, чтобы предупредить читателя о том, что переменная имеет тип SV *
, а не char *
.
Вероятно, это сообщение от базовой библиотеки; в программе Perl я передаю скалярную текстовую строку (а не ссылку).
@Henry Law Re: «Предположительно, это сообщение из базовой библиотеки». Оно из (компонента C) дистрибутива/библиотеки Crypt::OpenSSL::RSA. Это не та библиотека, которую я бы назвал libopenssl.
Обновите Crypt::OpenSSL::RSA. Ваша версия не принимает парольную фразу.
0.33 (2022 г., последняя версия CPAN на данный момент):
SV*
new_private_key(proto, key_string_SV, passphase_SV=&PL_sv_undef)
SV* proto;
SV* key_string_SV;
SV* passphase_SV;
CODE:
RETVAL = make_rsa_obj(
proto, _load_rsa_key(key_string_SV, PEM_read_bio_RSAPrivateKey, passphase_SV));
OUTPUT:
RETVAL
0,28 (2011 г., вторая последняя версия на CPAN на данный момент):
SV*
new_private_key(proto, key_string_SV)
SV* proto;
SV* key_string_SV;
CODE:
RETVAL = make_rsa_obj(
proto, _load_rsa_key(key_string_SV, PEM_read_bio_RSAPrivateKey));
OUTPUT:
RETVAL
Сообщение об использовании автоматически генерируется из прототипа программой, которая генерирует C из этого кода XS. Я считаю, что для функций, имеющих только SV*
параметры, таких как эти, это просто проверка количества аргументов.
Это решило мою проблему; Спасибо. Я никогда не думал о том, что мой код устарел, хотя мне следовало бы это сделать, потому что он поставляется с моим дистрибутивом, который всегда немного отстает.
В документации четко сказано, что аргументом должен быть закрытый ключ в виде строки (в формате PEM), а не имя файла, которое вы используете.