如何从模数、指数和私有指数创建 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,但 perl Crypt::RSA API 似乎没有办法显式设置。
I'm trying to port the following php functionality over to 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...
}
I need to convert a string in the form ("RSA.$mod.$exp.$private_exp"):
RSA.mVgY8RN6URBTstndvmUUPb4UZTdwvwmddSKE5z_jvKUEK6yk1u3rrC9yN8k6FilGj9K0eeUPe2hf4Pj-5CmHww==.AQAB.Lgy_yL3hsLBngkFdDw1Jy9TmSRMiH6yihYetQ8jy-jZXdsZXd8V5ub3kuBHHk4M39i3TduIkcrjcsiWQb77D8Q==
...to a Crypt::RSA object. I've split out the components so I have $mod, $exp, and $private_exp, but the perl Crypt::RSA API doesn't seem to have a way to explicitly set.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在 IRC 上完成,为世界其他地方记录它:它完全没有记录,但是
Crypt::RSA::Key
确实 有名为n、
e
和d
分别对应模数、公共指数和私有指数。检查函数中的模错误(如果p
和q
不可用但n
可用,则应该起作用,但实际上没有),可以使用这些方法创建工作密钥。我们通过使用解码 Base64 编码的工厂方法创建
Crypt::RSA::Key::Private
的子类(使用 MIME::Base64::URLSafe)和附加的二进制编码(使用 Math::BigInt->from_hex 和解压“H*”
),然后设置这三个私有成员,并且Crypt::RSA
模块能够接受它作为密钥。Worked out on IRC, documenting it here for the rest of the world: it's completely undocumented but
Crypt::RSA::Key
does have methods calledn
,e
, andd
that correspond to the modulus, the public exponent, and the private exponent. Modulo bugs in the check function (which is supposed to work ifp
andq
are unavailable butn
is, but actually doesn't), it's possible to create a working key with those methods.We solved the problem together by creating a subclass of
Crypt::RSA::Key::Private
with a factory method that decodes the base64 encoding (using MIME::Base64::URLSafe) and the additional binary encoding (using Math::BigInt->from_hex andunpack "H*"
) and then sets those three private members, and theCrypt::RSA
modules were able to accept it as a Key.