2016-02-25 235 views
1

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

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}我得到了一个错误信息说

遇到的对象 '地穴:: RSA ::主要:: =公共HASH(0x3117128)'但既不 allow_blessed,convert_blessed也不allow_tags设置 启用(或TO_JSON/FREEZE方法缺失)在 /home/alex/perl5/lib/perl5/JSON.pm线154

这是什么意思,为什么这条线修复它?

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

另外,有没有更好的方式做我在这里尝试的?

回答

1

将RSA公钥表示为文本的最常见方式是PEM编码。不幸的是,Crypt::RSA没有提供任何方式来转换或从这种格式,或确实任何其他标准格式。不要使用它!我建议你使用Crypt::OpenSSL::RSA。生成私钥和打印其公共形式与此模块很简单:

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----- 
0

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