2012-08-27 10 views
5

के पर्ल कार्यान्वयन मैं JSON वेब टोकन हस्ताक्षर (जो केवल 'RSASSA-PKCS1-V1_5-SIGN with the SHA-256 hash function' हस्ताक्षर स्वीकार करता है) शिल्प के लिए सक्षम होने की जरूरत है, लेकिन इस कार्य (Crypt::RSA) के लिए स्पष्ट CPAN दावेदार केवल MD2, MD5 or SHA1 का उपयोग कर हस्ताक्षर उत्पन्न होगा है।वहाँ SHA256withRSA

क्या कोई अन्य लाइब्रेरी है जो मुझे चाहिए जो मैं चाहूंगा? यदि आवश्यक हो तो मुझे वहां जाने के लिए कुछ हैकिंग करने में सक्षम होना चाहिए, लेकिन यह बहुत सुंदर नहीं होगा।

+2

['Digest :: SHA'?] (Http://search.cpan.org/perldoc?Digest::SHA) – mob

+0

@mob लेकिन इसके साथ क्रिप्ट :: आरएसए को कैसे कॉन्फ़िगर करें? –

उत्तर

2

मैं एक मॉड्यूल किया मैं चाहता था पता लगाने के लिए कर रहा था: यह इतना मुश्किल नहीं है, तो आप इस समझौता संस्करण की कोशिश कर सकते Crypt::OpenSSL::RSA

my $rsa = Crypt::OpenSSL::RSA->new_private_key($key); 
$rsa->use_sha256_hash; 
my $signature = $rsa->sign($message); 

इतना क्रिप्ट विस्तार की तुलना में आसान :: आरएसए , लेकिन यह खोजने के लिए अजीब तरह का मुश्किल था।

2

ऐसा लगता है कि आपको SHA256 समर्थन जोड़ने के लिए 'Crypt :: RSA :: SS :: PKCS1v15.pm' को संशोधित करना था।

#!/usr/bin/perl -sw 
## 
## Crypt::RSA::SS:PKCS1v15 
## 
## Copyright (c) 2001, Vipul Ved Prakash. All rights reserved. 
## This code is free software; you can redistribute it and/or modify 
## it under the same terms as Perl itself. 
## 
## $Id: PKCS1v15.pm,v 1.6 2001/06/22 23:27:38 vipul Exp $ 

package Crypt::RSA::SS::PKCS1v15; 
use strict; 
use base 'Crypt::RSA::Errorhandler'; 
use Crypt::RSA::DataFormat qw(octet_len os2ip i2osp h2osp); 
use Crypt::RSA::Primitives; 
use Crypt::RSA::Debug qw(debug); 
use Digest::SHA qw(sha1 sha256); 
use Digest::MD5 qw(md5); 
use Digest::MD2 qw(md2); 
use Math::Pari qw(floor); 

$Crypt::RSA::SS::PKCS1v15::VERSION = '1.99.1'; 

sub new { 

    my ($class, %params) = @_; 
    my $self = bless { 
         primitives => new Crypt::RSA::Primitives, 
         digest  => $params{Digest} || 'SHA1', 
         encoding => { 
             MD2 => "0x 30 20 30 0C 06 08 2A 86 48 
                86 F7 0D 02 02 05 00 04 10", 
             MD5 => "0x 30 20 30 0C 06 08 2A 86 48 
                86 F7 0D 02 05 05 00 04 10", 
             SHA1 => "0x 30 21 30 09 06 05 2B 0E 03 
                02 1A 05 00 04 14", 
             SHA256 => "0x 30 31 30 0d 06 09 60 86 
                48 01 65 03 04 02 01 05 
                00 04 20", 
            }, 
         VERSION => $Crypt::RSA::SS::PKCS1v15::VERSION, 
        }, $class;   
    if ($params{Version}) { 
     # do versioning here 
    } 
    return $self; 

} 


sub sign { 

    my ($self, %params) = @_; 
    my $key = $params{Key}; my $M = $params{Message} || $params{Plaintext}; 
    return $self->error ("No Message or Plaintext parameter", \$key, \%params) unless $M; 
    return $self->error ("No Key parameter", \$M, \%params) unless $key; 
    my $k = octet_len ($key->n); 

    my $em; 
    unless ($em = $self->encode ($M, $k-1)) { 
     return $self->error ($self->errstr, \$key, \%params, \$M) 
      if $self->errstr eq "Message too long."; 
     return $self->error ("Modulus too short.", \$key, \%params, \$M) 
      if $self->errstr eq "Intended encoded message length too short"; 
    } 

    my $m = os2ip ($em); 
    my $sig = $self->{primitives}->core_sign (Key => $key, Message => $m); 
    return i2osp ($sig, $k); 

}  


sub verify { 

    my ($self, %params) = @_; 
    my $key = $params{Key}; my $M = $params{Message} || $params{Plaintext}; 
    my $S = $params{Signature}; 
    return $self->error ("No Message or Plaintext parameter", \$key, \%params) unless $M; 
    return $self->error ("No Key parameter", \$M, \$S, \%params) unless $key; 
    return $self->error ("No Signature parameter", \$key, \$M, \%params) unless $S; 
    my $k = octet_len ($key->n); 
    return $self->error ("Invalid signature.", \$key, \$M, \%params) if length($S) != $k; 
    my $s = os2ip ($S); 
    my $m = $self->{primitives}->core_verify (Key => $key, Signature => $s) || 
     $self->error ("Invalid signature.", \$M, $key, \%params); 
    my $em = i2osp ($m, $k-1) || 
     return $self->error ("Invalid signature.", \$M, \$S, $key, \%params); 
    my $em1; 
    unless ($em1 = $self->encode ($M, $k-1)) { 
     return $self->error ($self->errstr, \$key, \%params, \$M) 
      if $self->errstr eq "Message too long."; 
     return $self->error ("Modulus too short.", \$key, \%params, \$M) 
      if $self->errstr eq "Intended encoded message length too short."; 
    } 

    debug ("em: $em"); debug ("em1: $em1"); 

    return 1 if $em eq $em1; 
    return $self->error ("Invalid signature.", \$M, \$key, \%params); 

} 


sub encode { 

    my ($self, $M, $emlen) = @_; 

    my $H; 
    if ($self->{digest} eq "SHA1") { $H = sha1 ($M) } 
    elsif ($self->{digest} eq "SHA256") { $H = sha256 ($M) } 
    elsif ($self->{digest} eq "MD5") { $H = md5 ($M) } 
    elsif ($self->{digest} eq "MD2") { $H = md2 ($M) } 

    my $alg = h2osp($self->{encoding}->{$self->{digest}}); 
    my $T = $alg . $H; 
    $self->error ("Intended encoded message length too short.", \$M) if $emlen < length($T) + 10; 
    my $pslen = $emlen - length($T) - 2; 
    my $PS = chr(0xff) x $pslen; 
    my $em = chr(1) . $PS . chr(0) . $T; 
    return $em; 

} 


sub version { 
    my $self = shift; 
    return $self->{VERSION}; 
} 


sub signblock { 
    return -1; 
} 


sub verifyblock { 
    my ($self, %params) = @_; 
    return octet_len($params{Key}->n); 
} 


1; 
+0

हाँ, ऐसा लगता है कि मुझे यह बहुत बढ़िया तरीका है। मैं इसे एक नए मॉड्यूल के रूप में करूंगा (क्रिप्ट :: आरएसए :: एसएस :: पीकेसीएस 1 वी 15 :: SHA256 जैसे कुछ) हालांकि इसे स्थानीय रूप से पैच करने के बजाए। चीयर्स। – Cebjyre

+0

@Cebjyre मैं आपसे सहमत हूं। इसके लिए एक नया मॉड्यूल अधिक उचित दिखता है। ;) –

+0

मैं नया मॉड्यूल बनाने में फंस गया, फिर मुझे एहसास हुआ कि 'क्रिप्ट :: आरएसए' अपने स्वयं के निराला कुंजी फ़ाइल प्रारूप का उपयोग करता है, इसलिए मैं एक और शिकार के लिए गया और 'क्रिप्ट :: ओपनएसएसएल :: आरएसए' पाया। एक सभ्य मौका है कि मैं अभी भी पूरी जेडब्ल्यूटी प्रक्रिया को संभालने के लिए एक मॉड्यूल करूँगा, लेकिन सौभाग्य से मुझे अब इस विशेष घटक के बारे में चिंता करने की ज़रूरत नहीं है। – Cebjyre