在Perl中将RSA密钥转换为JSON

时间:2016-02-25 20:26:52

标签: json perl cryptography rsa public-key

我需要找到一种方法将RSA公钥传输到服务器以用于我的网络通信程序。我做了一些研究,似乎最简单的方法是将公钥(存储为某种哈希引用)转换为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}之前,我收到一条错误消息

  

遇到对象'Crypt :: RSA :: Key :: Public = HASH(0x3117128)',但是   既不是allow_blessed,也不是convert_blessed,也不是allow_tags设置   启用(或TO_JSON / FREEZE方法丢失)at   /home/alex/perl5/lib/perl5/JSON.pm第154行。

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

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

或者,有没有更好的方法来做我在这里尝试的事情?

2 个答案:

答案 0 :(得分: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-----

答案 1 :(得分:0)

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