我正在尝试将以下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,但perl Crypt :: RSA API似乎没有办法明确设置。
答案 0 :(得分:5)
在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
模块能够接受它作为密钥。