Как я могу создать объект 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, похоже, не имеет способа явно установить.
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
смогли принять его в качестве ключа.