2016-02-25 239 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密鑰。