在Perl中使用*公钥*进行RSA解密

在Perl中使用*公钥*进行RSA解密,perl,encryption,openssl,rsa,Perl,Encryption,Openssl,Rsa,我正在尝试使用公钥解密RSA加密的消息 使用Crypt::OpenSSL::RSA,我可以使用任一密钥进行加密,但只能使用私钥进行解密。正在尝试使用公钥解密: use Crypt::OpenSSL::RSA; use MIME::Base64; use File::Slurp; my $public_key = 'rsa.pub.pem'; #my $private_key = 'rsa.priv.pem'; my $rsa_public = Crypt::OpenSSL::RSA->

我正在尝试使用公钥解密RSA加密的消息

使用
Crypt::OpenSSL::RSA
,我可以使用任一密钥进行加密,但只能使用私钥进行解密。正在尝试使用公钥解密:

use Crypt::OpenSSL::RSA;
use MIME::Base64;
use File::Slurp;

my $public_key  = 'rsa.pub.pem';
#my $private_key = 'rsa.priv.pem';
my $rsa_public  = Crypt::OpenSSL::RSA->new_public_key(scalar read_file $public_key);
#my $rsa_private = Crypt::OpenSSL::RSA->new_private_key(scalar read_file $private_key);

my $ciphertext_b64 = 'cqyPNNfqYaUeIsM1yAz7IsQ760Bkd4IPaatHnMQtQAMKtYTEUqFHwnSZ4hg2
pkoJM1N5Ejlv6Eqkk/ZaMWl1nTDOxRDj0V6PARQPqz3QF1UGWkSMxMt/DlSn
AtrRXgjvrILbMX5BsV2S5mHcLoCeNVb+jdnX0x0Uu/AAFPsByPRrt1yM1ORo
KcP+0ENvcvJ8yGOxJ2jOEmTFkQM5kjNDIFmLUlt6qODdTGWvYWR2CDduLO4m
qiyAt4yK5K3vwMybAG5ceRGb/kmMSW10EnvbryIdDGVGS8Zvodu3xqtbM1Yo
tdtZRDkcUcOYlUi3VRvSTimatVkJPG8QDlZofrBA0w==';

my $ciphertext = decode_base64($ciphertext_b64);

print $rsa_public->decrypt($ciphertext);
#print $rsa_private->decrypt($ciphertext);
结果:
公钥无法在test.pl第19行解密。


顺便说一句,Ruby似乎对使用任意一个密钥进行加密和解密都没有问题(这就是我目前处于这种情况的原因).

您是否意识到?

中有一个
public\u decrypt
方法?

您是否意识到?

中有一个
public\u decrypt
方法?您应该使用私钥解密,或者使用公钥验证签名,然后 使用适当的方法进行此操作。你的问题不清楚你是加密还是签名


如果您试图“解密RSA加密的消息”,那么您想要做什么以及您正在使用的库实际上在做什么都不清楚。RSA用于加密和数字签名的填充不同。因此,如果您调用了错误的方法,那么在最好的情况下,您会收到一条错误消息,在最坏的情况下,您会得到一个不安全的方案。

您应该使用私钥解密,或者使用公钥和
#!/usr/bin/env perl
use strict;
use warnings;
use MIME::Base64;
use Data::Dumper;
use File::Slurp   qw(read_file);
use Crypt::OpenSSL::RSA;
use Convert::PEM;

my $rsa = Crypt::OpenSSL::RSA->generate_key(2048);
my $keyFile = "pri1.pem";
my $pubfile = "pub.pem";

my $string_Key = read_file($keyFile);
my $string_pub = read_file($pubfile);
my $rsa_pub = Crypt::OpenSSL::RSA->new_public_key($string_pub);
my $rsa_priv = Crypt::OpenSSL::RSA->new_private_key($string_Key);
$rsa_pub->use_pkcs1_padding();
my $plaintext = "Hello world";
my $ciphertext = $rsa_pub->encrypt($plaintext);
print encode_base64($ciphertext);

################################################


################################################################3

$rsa_priv->use_pkcs1_padding();
my $decrypttext = $rsa_priv->decrypt($ciphertext);
print "\ndecrypttext:\n", $decrypttext;
使用适当的方法进行此操作。你的问题不清楚你是加密还是签名


如果您试图“解密RSA加密的消息”,那么您想要做什么以及您正在使用的库实际上在做什么都不清楚。RSA用于加密和数字签名的填充不同。因此,如果你调用了错误的方法,那么在最好的情况下,你会收到一条错误消息,在最坏的情况下,你最终会得到一个不安全的方案。

我同意你的观点,但在某个时候,它会成为一个术语上的争论。API提供了低级的
private\u encrypt
和public\u decrypt`方法,以及更常见的、略高级的
sign
verify
方法。@GregS我当然知道private\u encrypt。但是您注意到代码片段中的print语句了吗?OP很可能不想验证签名。因此,要做的第一件事是明确应用程序的目标。在我看来,推荐一个相当低级的函数似乎是错误的。我同意你的观点,但在某个时候,它变成了一个术语上的争论。API提供了低级的
private\u encrypt
和public\u decrypt`方法,以及更常见的、略高级的
sign
verify
方法。@GregS我当然知道private\u encrypt。但是您注意到代码片段中的print语句了吗?OP很可能不想验证签名。因此,要做的第一件事是明确应用程序的目标。在我看来,推荐一个相当低级的函数是错误的。
#!/usr/bin/env perl
use strict;
use warnings;
use MIME::Base64;
use Data::Dumper;
use File::Slurp   qw(read_file);
use Crypt::OpenSSL::RSA;
use Convert::PEM;

my $rsa = Crypt::OpenSSL::RSA->generate_key(2048);
my $keyFile = "pri1.pem";
my $pubfile = "pub.pem";

my $string_Key = read_file($keyFile);
my $string_pub = read_file($pubfile);
my $rsa_pub = Crypt::OpenSSL::RSA->new_public_key($string_pub);
my $rsa_priv = Crypt::OpenSSL::RSA->new_private_key($string_Key);
$rsa_pub->use_pkcs1_padding();
my $plaintext = "Hello world";
my $ciphertext = $rsa_pub->encrypt($plaintext);
print encode_base64($ciphertext);

################################################


################################################################3

$rsa_priv->use_pkcs1_padding();
my $decrypttext = $rsa_priv->decrypt($ciphertext);
print "\ndecrypttext:\n", $decrypttext;