Как я могу создать объект Crypt::RSA из модуля, экспоненты и частного показателя?


Я пытаюсь перенести следующие функции php на perl:

public function loadKey($mod, $exp, $type = 'public')
{
    $rsa = new Crypt_RSA();
    $rsa->signatureMode = CRYPT_RSA_SIGNATURE_PKCS1;
    $rsa->setHash('sha256');
    $rsa->modulus = new Math_BigInteger(Magicsig::base64_url_decode($mod), 256);
    $rsa->k = strlen($rsa->modulus->toBytes());
    $rsa->exponent = new Math_BigInteger(Magicsig::base64_url_decode($exp), 256);

    // snip...
}

Мне нужно преобразовать строку в виде ("RSA.$mod.$exp.$private_exp"):

RSA.mVgY8RN6URBTstndvmUUPb4UZTdwvwmddSKE5z_jvKUEK6yk1u3rrC9yN8k6FilGj9K0eeUPe2hf4Pj-5CmHww==.AQAB.Lgy_yL3hsLBngkFdDw1Jy9TmSRMiH6yihYetQ8jy-jZXdsZXd8V5ub3kuBHHk4M39i3TduIkcrjcsiWQb77D8Q==

...к объекту Crypt::RSA. Я разделил компоненты, поэтому у меня есть $mod, $exp и $private_exp, но API perl Crypt::RSA, похоже, не имеет способа явно установить.

Author: Ilmari Karonen, 2010-07-30

1 answers

Разработан в IRC, документируя его здесь для остального мира: он полностью недокументирован, но Crypt::RSA::Key есть ли у методы, называемые n, e, и d, которые соответствуют модулю, публичному показателю и частному показателю. Ошибки по модулю в функции проверки (которая должна работать, если p и q недоступны, но n есть, но на самом деле нет), с помощью этих методов можно создать рабочий ключ.

Мы решили проблему вместе, создав подкласс Crypt::RSA::Key::Private с фабричным методом, который декодирует кодировку base64 (с использованием MIME::Base64::URLSAFE) и дополнительную двоичную кодировку (с использованием Math::bigint->from_hex и unpack "H*"), а затем устанавливает эти три закрытых элемента, и модули Crypt::RSA смогли принять его в качестве ключа.

 5
Author: hobbs, 2010-07-30 03:59:05