【问题标题】:RSA decryption using the *public* key in Perl在 Perl 中使用 *public* 密钥进行 RSA 解密
【发布时间】:2012-10-06 04:56:55
【问题描述】:

我正在尝试使用 public 密钥解密 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);

结果:Public keys cannot decrypt at test.pl line 19.

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

【问题讨论】:

    标签: perl encryption openssl rsa


    【解决方案1】:

    您是否意识到Crypt::OpenSSL::RSA 中有一个public_decrypt 方法?

    【讨论】:

      【解决方案2】:
      #!/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;
      

      【讨论】:

        【解决方案3】:

        您应该使用私钥解密或使用公钥验证签名,然后 使用适当的方法这样做。从您的问题中不清楚您是进行加密还是签名。

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

        【讨论】:

        • 我同意你的观点,但在某些时候它变成了对术语的争论。该 API 提供了低级的 private_encrypt 和 public_decrypt` 方法,以及更常用和稍高级的 signverify 方法。
        • @GregS 我当然知道 private_encrypt。但是你注意到代码 sn-p 中的 print 语句了吗? OP 很有可能不想验证签名。因此,首先要做的是明确应用程序的目标。推荐一个相当低级的函数对我来说似乎是错误的。
        猜你喜欢
        • 2012-05-07
        • 2012-07-13
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-13
        相关资源
        最近更新 更多