2013-03-31 2 views
1

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을 사용해야 함을 표시 할 수 있어야한다 나는

...이라고 생각되다 :-(확인받을 수 없습니다 (반대로 말하자면, 복어에).
암 내가

답변

0

디버그하기 위해 파일과 코드를 사용하여 테스트를 할 수없이 그와 함께 당신을 도울 방법 확실하지. ...?

감사를 잘못 짚었. 그러나, 아니 최고의 솔루션 있지만, Perl에서 시스템 호출을 사용하는 것이 좋습니다. 명령 프롬프트에서이를 확인할 수 있다면, 그 방법을 확인하는 옵션. 첫 번째는 system입니다 :

my $return_code = system("some command"); 
# or... 
my $return_code = system("command", "some", "args"); 

당신이 그렇게

, 당신은 $return_code에 반환 된 종료 코드를받을 수 있습니다. 명령 프롬프트에서 확인을 위해 무엇을 하든지 확인 실패시 오류 코드와 함께 종료하면 모든 것이 잘되었을 때 0을 받고 잘못된 경우 다른 번호를 받게됩니다.

당신이 실제 대답을 읽으려면, ID를 사용하여 역 따옴표 시스템 호출의 응답을 분석하는

다른 방법 :, 당신은에 의해 STDOUT로 전송됩니다 어떤 캡처거야 그렇게함으로써

my $answer = `some system call`; 
# or... 
my $answer = qx[some system call]; 

을 시스템 호출. STDERR도 캡처하려면 2>&1 또는 그와 비슷한 전화를 사용하여 리디렉션 할 수 있습니다. 이 경우 반환 된 종료 코드를 얻지 못합니다.

당신이 사용 된 방법에 따라 다음과 같이 대답과 함께 작업 할 수 있습니다

if ($return_code == 0) { 
    print "Verified!"; 
} 
# or... 
if ($answer =~ /OpenSSL.*?Verification sucess.*?Signature code:(\d+)/) { 
    # I'm just making up stuff here, I don't know the answer of your command! 
    print "Verification succesful. Signature code was $1"; 
} 

도움이 되었기를 바랍니다. 나는 당신에게 실제 스크립트와 파일을 테스트 할 수 있었으면 좋겠다. 그리고 나는 당신에게 순수한 Perl 답을 줄 수 있었지만, 적어도이 순간 당신이 앞으로 나아갈 수 있도록 도와 주어야한다.

시스코

+0

감사합니다. 외부 프로그램으로 "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