Crypt :: RSA 및 Crypt :: RSA를 사용하여 Perl에서 PSS 서명 된 서명을 확인할 수 없습니다. : SS :: PSS. 나는 1024 비트 RSA 키를 가진 장치가Crypt :: RSA 및 Crypt :: RSA :: SS :: PSS를 사용하여 Perl에서 RSA PSS 서명을 확인하는 중 문제가 발생했습니다.
, 및 징후 데이터는 PSS, SHA1 및 AES-128을 사용하여 :
여기 상황이다.
나는 PEM_write_RSA_PUBKEY()으로 파일에 저장, 성공적으로 장치의 공개 키를 추출
I 명령 줄에서의 openssl을 사용하여도 RSA_verify_PKCS1_PSS()를 사용하고, C/C++에서이를 확인 할 수 오전 이 같은 :
- 문자열이 "안녕하세요"장치에 의해 서명되어있어 버퍼입니다 :
echo -n hello | openssl dgst -verify pubkey.pem -signature hello.sig -sha1 \ -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:20
.
- "pubkey.pem"은 PEM_write_RSA_PUBKEY()를 사용하여 장치에서 내 보낸 장치의 RSA 공개 키입니다.
- "hello.sig"는 장치에서 생성 된 이진 (원시) 서명을 포함합니다. (패딩 때문에 128 바이트입니다.)
나는 Crypt :: RSA와 Crypt :: RSA :: SS :: PSS를 사용하여 Perl에서 위의 작업을 시도하고 있습니다. 그것은 작동합니다.
나는 그 두 개의 모듈을 테스트 한 나는이 같은, 내 자신의 키를 생성 할 때 생성하고 펄에 PSS 서명을 검증 할 수입니다 :
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를 만드는을, "key.public는"장치의 공개 키를 포함
$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');
가, 진수 문자열로 변환, 읽기 변수의 "N"필드에 삽입 : 키 나는 이런 식으로 뭔가를 사용하여 공개 키에 읽기/작성자 : Crypt :: RSA :: Key ::공공의.
하지만 그것은 SHA1 및 AES-128을 사용해야 함을 표시 할 수 있어야한다 나는
...이라고 생각되다 :-(확인받을 수 없습니다 (반대로 말하자면, 복어에).
암 내가
감사합니다. 외부 프로그램으로 "openssl"을 실행하면 ("openssl dgst"를 사용하여 명령 줄에서 서명을 확인할 수 있으므로) 제대로 작동합니다. 그동안 나는 모듈 (Pari 또는 Crypt :: RSA) 중 하나에 버그가 있음을 발견했습니다. 왜냐하면 위의 스크립트를 실행할 때 가끔 다음과 같은 오류가 발생하기 때문입니다 오류 : PARI : *** 금단부 t_INT % t_REAL. /usr/local/share/perl/5.14.2/Crypt/RSA/Key/Private.pm 줄 127. 그래서 계속 살펴 봐야 할 것입니다. – user2228297