Я пытаюсь перенести следующие функции 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, похоже, не имеет возможности явно установить.
Работала в IRC, документируя ее здесь для остального мира: она полностью недокументирована, но у Crypt::RSA::Key
есть методы, называемые n
, e
и d
которые соответствуют модулю, публичному экспоненту и частному экспоненту , Ошибки Modulo в функции проверки (которая должна работать, если p
и q
недоступны, но n
есть, но на самом деле это не так), можно создать рабочий ключ с этими методами.
Мы решили проблему вместе, создав подкласс Crypt::RSA::Key::Private
с фабричным методом, который декодирует кодировку base64 (используя MIME :: Base64 :: URLSafe ) и дополнительную двоичную кодировку (используя Math :: BigInt -> from_hex и unpack "H*"
), а затем устанавливает эти три закрытых элемента, а модули Crypt::RSA
смогли принять его как ключ.