在 Perl 中将 RSA 密钥转换为 JSON

Converting RSA keys to JSON in Perl

我需要为我的网络通信程序找到一种将 RSA public 密钥传输到服务器的方法。我做了一些研究,似乎最简单的方法是将 public 密钥(存储为某种哈希引用)转换为 JSON 进行传输。但是,在我的测试代码中,我无法获得转换为 JSON 的密钥。这是我的测试程序:

use strict;
use warnings;

use Crypt::RSA;
use JSON;

my %hash = ( name => "bob",
             age  => 123,
             hates=> "Perl"
        );

    my $hash_ref = \%hash;
    my $hash_as_json = to_json($hash_ref);

    print $hash_as_json, "\n"; # Works fine for a normal hash

    my $rsa = new Crypt::RSA;

    my ($public, $private) = $rsa->keygen ( 
            Identity  => 'client',
            Size      => 512,  
            Password  => 'password', 
            Verbosity => 1,
        ) or die $rsa->errstr();

    my $key_hash_as_json = to_json($public, {allow_blessed => 1, convert_blessed => 1});
    print $key_hash_as_json, "\n";

在我找到行 {allow_blessed => 1, convert_blessed => 1} 之前,我收到一条错误消息说

encountered object 'Crypt::RSA::Key::Public=HASH(0x3117128)', but neither allow_blessed, convert_blessed nor allow_tags settings are enabled (or TO_JSON/FREEZE method missing) at /home/alex/perl5/lib/perl5/JSON.pm line 154.

这是什么意思,为什么该行修复了它?

添加代码后,当我尝试打印 JSON 时它只给出 null。为什么会发生这种情况,我该如何解决?

或者,是否有更好的方法来执行我在这里尝试的操作?

将 RSA public 密钥表示为文本的最常见方式是 PEM 编码。不幸的是,Crypt::RSA 不提供任何方法来转换为这种格式或从 任何其他标准格式 转换。不要使用它!

相反,我建议您使用 Crypt::OpenSSL::RSA。使用此模块生成私钥并打印其 public 形式很简单:

use Crypt::OpenSSL::RSA;

my $key = Crypt::OpenSSL::RSA->generate_key(512);
print $key->get_public_key_string;

这将输出如下所示的 PEM 编码:

-----BEGIN RSA PUBLIC KEY-----
MEgCQQDd/5F9Rc5vsNuKBrd4gfI4BDgre/sTBKu3yXpk+8NjByKpClsi3IQEGYeG
wmv/q/1ZjflFby1MPxMhXZo/82CbAgMBAAE=
-----END RSA PUBLIC KEY-----

除了已经提到的 PEM 之外,还有 JWK 格式(JSON Web 密钥)。查看 Crypt::PK::RSA(我的模块),它支持在 PEM 和 JWK 中生成、导入和导出 RSA 密钥。