Как я могу создать объект Crypt :: RSA из модуля, экспоненты и частного экспонента? - PullRequest
6 голосов
/ 30 июля 2010

Я пытаюсь перенести следующие функции 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, похоже, не имеет возможности явно установить.

1 Ответ

5 голосов
/ 30 июля 2010

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

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

...