Perl - Crypt :: OpenSSL :: RSA-> new_public_key "Ошибка: неизвестный формат ключа" - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь сгенерировать токен для запроса Http-запроса на основе закрытого ключа, сгенерированного с использованием OpenSSL RSA (2048), а затем открытого ключа, который генерируется группой, имеющей API, который мы вызываем.Одна сторона строки токена зашифрована с использованием открытого ключа, а другая - с помощью закрытого ключа.Шифрование с закрытым ключом работает с кодом ниже, но вызов Crypt::OpenSSL::RSA->new_public_key(public key string) завершается неудачно с проблемой «Ошибка: формат нераспознанного ключа».Я не уверен, что не так с ключом, но, учитывая, что другой работает (и предположительно был сгенерирован с использованием того же инструмента Unix OpenSSL), это кажется странным.

Любая помощь будет принята с благодарностью.

Спасибо, Дейв

use strict;

use Time::HiRes qw( gettimeofday );
use Crypt::OpenSSL::RSA;
use Crypt::OpenSSL::X509;
use Crypt::OpenSSL::Random;
use MIME::Base64;
use DateTime;


my $sysTime=undef;
my $sTime=undef;
my $sAPIToken;

my $EDMPrivateKey=qq~
-----BEGIN PRIVATE KEY-----
<private key base 64>
-----END PRIVATE KEY-----
~;

my $DMPublicKey=qq~
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsftmdt4aAZ7B1F7wVjIz0RSO6w1bIX/4
<rest of public key>
-----END PUBLIC KEY-----
~;

sub setTime() {
    my $ms;
    my $ms2;
    my $microSec;
    my $tz;
    ($sysTime,$microSec) = gettimeofday();
#    $sysTime=gettimeofday();
    $ms=sprintf("%.*s",3,$microSec);
    $ms2=$microSec-($ms*1000);
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($sysTime);

    $sTime=sprintf("%04d-%02d-%02dT%02d:%02d:%02d.%03d-%04d",
                                   $year+1900,$mon+1,$mday,$hour,$min,$sec,$ms,$tz);
    $sysTime=$sysTime*1000+$ms;
}

sub setTimeNew() {
    my $ms;
    my $ms2;
    my $microSec;
    ($sysTime,$microSec) = gettimeofday();
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($sysTime);
    $ms=sprintf("%.*s",3,$microSec);
    $ms2=$microSec-($ms*1000);

    my $dt=DateTime->new(
      year       => $year+1900,
      month      => $mon+1,
      day        => $yday,
      hour       => $hour,
      minute     => $min,
      second     => $sec,
      nanosecond => $microSec*1000
    );
    $sysTime=$sysTime*1000+$ms;
    $sTime=$dt->strftime("%C%y-%m-%dT%H:%M:%S.%3N%z");
}


sub main() {
    my $sTokenPt1;
    my $sTokenPt2;
    my $sPubStr;

    my $rsaPublic  = Crypt::OpenSSL::RSA->new_public_key($DMPublicKey);
    $rsaPublic->use_sha1_hash();

    setTimeNew();

    $sTokenPt1 = encode_base64($rsaPrivate->encrypt($sysTime));
    $sTokenPt2 = encode_base64($rsaPublic->encrypt($sTime));

    printf "%d\n%s\n",$sysTime,$sTime;
    $sAPIToken = sprintf("%s,%s",$sTokenPt1,$sTokenPt2);
    printf "%d\n%s\nTTOKEN=%s\n",$sysTime,$sTime,$sAPIToken;


}
eval {
    main();
};

if ($@) {
    printf "Error : %s\n",$@;
}
...