Я не могу проверить подпись PSS-подпись в Perl с использованием Crypt :: RSA и Crypt :: RSA: : SS :: PSS.Устранение неполадок RSA PSS-подпись в Perl с Crypt :: RSA и Crypt :: RSA :: SS :: PSS
Вот ситуация:
У меня есть устройство, которое имеет 1024-битный RSA ключ, и данные знаки с помощью PSS, SHA1 и AES-128.
извлечь открытый ключ устройства успешно, сохраните его в файле с PEM_write_RSA_PUBKEY()
Я утра в состоянии проверить это в C/C++ с использованием RSA_verify_PKCS1_PSS(), а также с использованием OpenSSL в командной строке , как это:
echo -n hello |
openssl dgst -verify pubkey.pem -signature hello.sig -sha1 \
-sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:20
Где:
- строка "привет" является буфером, который был подписан устройством.
- «pubkey.pem» является открытым ключом RSA устройства, экспортированным с устройства с PEM_write_RSA_PUBKEY().
- «hello.sig» содержит двоичную (необработанную) подпись, сгенерированную устройством. (Это 128 байт из-за заполнения.)
Я пытаюсь сделать это на Perl, используя Crypt :: RSA и Crypt :: RSA :: SS :: PSS, и не могу получить это работать.
Я проверил эти два модуль, и я я, способные генерировать и проверять подпись PSS в Perl при создании моего собственного ключа, как это:
use Crypt::RSA;
use Crypt::RSA::SS::PSS;
my ($message, $rsa, $pss, $signature, $verify);
my ($public, $private);
# The message to be encrypted
#
$message = "hello";
# Generate RSA key
#
$rsa = new Crypt::RSA;
($public, $private) = $rsa->keygen(Size => 1024, Filename => "key");
# Generate PSS signature
#
$pss = new Crypt::RSA::SS::PSS;
$signature = $pss->sign (Message => $message, Key => $private) || die $pss->errstr;
$verify = $pss->verify (Message => $message, Key => $public, Signature => $signature) || die $pss->errstr;
# $verify returns true, it worked.
Таким образом, вместо того, чтобы создать свой собственный RSA ключ я прочитал в публичном ключе, используя что-то вроде этого:
$publicKey = new Crypt::RSA::Key::Public (Filename => "key.public" );
...
# I pack the 256 character (128 byte) hex string of the signature
# that's generated by the device.
$signature = pack ("H*", '03808458…..73E92');
Где «key.public» содержит открытый ключ устройства, преобразуется в десятичную строку, вставленную в «п» поле переменной, которая читается/написан Crypt :: RSA :: Key :: Общественные.
Но я не могу получить его, чтобы проверить :-(
Methinks я должен быть в состоянии указать, что следует использовать SHA1 и AES-128 (в отличие, скажем, Blowfish).
Am Я ложному дерево?
Спасибо ....
Спасибо, Франциско. Запуск «openssl» в качестве внешней программы отлично работает (поскольку я могу проверить подпись из командной строки с помощью «openssl dgst»). Тем временем я обнаружил, что в одном из модулей есть какая-то ошибка: Math :: Pari или Crypt :: RSA, потому что когда я запускаю свой скрипт (как указано выше), иногда я получаю следующее ошибка: PARI: *** запрещенное разделение t_INT% t_REAL. на /usr/local/share/perl/5.14.2/Crypt/RSA/Key/Private.pm line 127. Так что мне придется продолжать искать. – user2228297