Perl中的RSA密钥

10

我有一个简单的RSA编码/解码脚本,例如:

use Crypt::RSA;

my $rsa = new Crypt::RSA;
my($public, $private) = $rsa->keygen( Size => 2048 )
                        or die $rsa->errstr();

my $email = '...';

my $em = $rsa->encrypt( Message => $email, Key => $public  );
my $dm = $rsa->decrypt( Ciphertext => $em, Key => $private );

print "$dm\n";

但我想修改这个脚本,使用RSA密钥作为 edn 值,例如:

e => 10001
d => 135b03530e94874283f0f0000ffff0001
n => 24000c6c9620886831124848640044901

我如何将这三个参数转换为Crypt::RSA::Key对象,反之亦然?

或者,我如何在使用Crypt::RSA进行加密和解密时使用这三个参数?

1个回答

7
我建议您查看这个模块:Crypt::OpenSSL::RSACrypt::OpenSSL::Bignum,或者查看我在github上一个仓库中如何使用它:Perl backend for Jcryption 通过参数 n、e、d 创建 RSA
use strict;

use Crypt::OpenSSL::Bignum;
use Crypt::OpenSSL::Random;
use Crypt::OpenSSL::RSA;

my $param_ref = {
    n => 'C8F19E3A7C18A5FE6D1DE07926F4E6403EA6558EE4892D29155F2C52678E210FE5D61DBC9EC77F2DD39FC8D9F2717F23629B7E18BDB38AADF9FC5BF1CA968C67F4BF0F2D6657E1374A845048B6CDCB2B8B2B3F31BF7F134A11B9A063EB7C326B27C0027955637E6089293F5F4CD40F5B91142BBA61B8E473A8D14B447896B5FD',
    e => '010001',
    d => '574C612997703DED630A6FD3329182D6B6611D1A8F3EE957C7E9292043CD03A01C82013948E1F2E6BDE1D5289AA3A450832E7A81D528833F4233D8DE1ADD7CF1878CBACDE64DE4364F8B73093753D6E322732EAEC942281CE4AF55D212E77EC4A108708864D3F86A67C63FBE8206A543A42ABF45E56C1E41A2F2BA0CCC1C8001',
};

my $n = Crypt::OpenSSL::Bignum->new_from_hex($param_ref->{n});
my $e = Crypt::OpenSSL::Bignum->new_from_hex($param_ref->{e});
my $d = Crypt::OpenSSL::Bignum->new_from_hex($param_ref->{d});

my $rsa = Crypt::OpenSSL::RSA->new_key_from_parameters($n, $e, $d);

printf "private key is: %s\n", $rsa->get_private_key_string();
printf "public key (in PKCS1 format) is: %s\n", $rsa->get_public_key_string();

从RSA对象中获取关键参数。
use strict;

use Crypt::OpenSSL::Bignum;
use Crypt::OpenSSL::Random;
use Crypt::OpenSSL::RSA;

my $rsa = Crypt::OpenSSL::RSA->generate_key(2048);
my ($n, $e, $d, $p, $q) = $rsa->get_key_parameters();

printf "private key is: %s\n", $rsa->get_private_key_string();
printf "public key (in PKCS1 format) is: %s\n", $rsa->get_public_key_string();

谢谢!可以使用Crypt::OpenSSL::RSA库通过n+ed+e值对消息进行加密和解密吗?我需要允许公众解密消息,而加密会使私钥变为公钥,所以我无法分发$rsa->get_private_key_string的私钥。请给出建议。 - Ωmega
使用公钥加密消息只需要(n+e),使用私钥解密只需要(n+e+d) p+q - 可以帮助快速计算。 - Pavel Vlasov
请再读一遍我的评论——反过来:我需要使用公钥进行解密,私钥进行加密... 可以吗? - Ωmega
@в„ҰmegaпјҢжҳҜзҡ„пјҢдҪ еҸҜд»ҘдҪҝз”ЁCrypt::OpenSSL::RSAдёӯжҒ°еҪ“е‘ҪеҗҚзҡ„private_encryptж–№жі•жқҘдҪҝз”Ёз§Ғй’ҘиҝӣиЎҢеҠ еҜҶгҖӮ - Lucas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接