2013-03-23 36 views
0

我试图使用p,q & d RSA参数解密一些文本。这是我的代码:如何从p,q和d解密RSA文本('数据大于mod len'错误)

use Crypt::OpenSSL::RSA; 

my $cipher_text = '21822641296030233094227313655848509440605583067924377543599838215888039562622129112129822895080408267928468534668157995224253484645729278749085139763130764635317451011719149549123004731102607506049461610797920861018820451965633121194245016524243388070479379308761222809258576639629711274935572812821629596774863705897518352434753834386314245125246066390859225185066330366811073476496684635339997048026729834327425483254569562337608819782060439696539771993138092386150797070320410153423661265108318321693803297014167486821806691214248145774922909225478697375135263295662839076540338821496045675607198591575588621659609'; 
my ($p, $q, $d) = ( 
    Crypt::OpenSSL::Bignum->new_from_decimal('165531801682935357262784768224825567629908164720968584885888440012850606062817307481747891600670103793664550471500745014914678541225436018211939431390053926336912952441897829541865006123774689488999658248640982182224222754377835611000656130261325362538051966725284846900143448968656908810497538272078057741753'), 
    Crypt::OpenSSL::Bignum->new_from_decimal('831867848084340389279221308498668063580976312456313708227'), 
    Crypt::OpenSSL::Bignum->new_from_decimal('4726230781685159301129128926091597612191418774972180765730674153946543720175721375641429858288249804644693058129864174539693448753576337835228363947222471089804797108134073771268482070990981157234925023770851307423738245681533737104667110764794379344770670194385194083716134044195705274587539907463141446593440244816853972305589231700346121402158165643863387848676660192091263041614047764528653983145902131144938355047165291147495652786645127063867131916536922764685613090037417336307735248968661966233168304037079723873034096551522712515691482108402916631034263410195810822874808411813091006049133015592459279891521'), 
); 

my $n = $p->mul($q, Crypt::OpenSSL::Bignum::CTX->new()); 

# I use d as e because e is mandatory and I don't have it. Later I'll use public_decrypt instead of decrypt. 
my $rsa = Crypt::OpenSSL::RSA->new_key_from_parameters($n, $d, undef, $p, $q); 
my $text = $rsa->public_decrypt($cipher_text); 

但是,这给了我:

RSA.xs:202: OpenSSL error: data greater than mod len at test.pl line 14 

对此我真的不知道用什么方法,数据不大于d或n。

: - ?

EDITED

下面的Python代码的工作,所以我就我所知的密钥和数据都不错。

from Crypto.PublicKey import RSA 

p = 165531801682935357262784768224825567629908164720968584885888440012850606062817307481747891600670103793664550471500745014914678541225436018211939431390053926336912952441897829541865006123774689488999658248640982182224222754377835611000656130261325362538051966725284846900143448968656908810497538272078057741753 
q =831867848084340389279221308498668063580976312456313708227 
d = 4726230781685159301129128926091597612191418774972180765730674153946543720175721375641429858288249804644693058129864174539693448753576337835228363947222471089804797108134073771268482070990981157234925023770851307423738245681533737104667110764794379344770670194385194083716134044195705274587539907463141446593440244816853972305589231700346121402158165643863387848676660192091263041614047764528653983145902131144938355047165291147495652786645127063867131916536922764685613090037417336307735248968661966233168304037079723873034096551522712515691482108402916631034263410195810822874808411813091006049133015592459279891521 
n = p * q 
cypher_text = 21822641296030233094227313655848509440605583067924377543599838215888039562622129112129822895080408267928468534668157995224253484645729278749085139763130764635317451011719149549123004731102607506049461610797920861018820451965633121194245016524243388070479379308761222809258576639629711274935572812821629596774863705897518352434753834386314245125246066390859225185066330366811073476496684635339997048026729834327425483254569562337608819782060439696539771993138092386150797070320410153423661265108318321693803297014167486821806691214248145774922909225478697375135263295662839076540338821496045675607198591575588621659609 

decrypter = RSA.construct((n, 0L, d, p, q)) 
text = decrypter.key._decrypt(cypher_text) 
print(text) 
+0

如果你想解密,你需要有一个正确的值。您的评论没有意义。 – 2013-03-23 12:12:32

+0

我刚刚编辑并添加了一个正在工作的Python代码,所以文本,p,q和d必须正确。 我不知道问题的哪一部分没有意义。 – DavidEG 2013-03-23 12:55:59

+0

'#我用d作为e因为e是强制性的,我没有它。稍后我将使用public_decrypt而不是解密。“没有意义。 – 2013-03-23 13:12:56

回答

1

该错误表示密钥大小和数据之间存在不匹配。 我不是一个Python专家,但IIRC它处理核心中的大数字,并且你有cipher_text作为文本字符串。

密文的样子,我们希望作为一个二进制字符串小数,所以我想你想:

my $cipher_text = Crypt::OpenSSL::Bignum->new_from_decimal('21822....')->to_bin; 

这原来是256个字节,这听起来是正确的。

现在的错误是: RSA.xs:202:OpenSSL的错误:在rsa.pl行未知填充类型20

我不知道这一点,但我无论如何都要带着孩子出去,现在:)

+0

谢谢!您是绝对正确的。填充我刚添加'$ rsa-> use_no_padding();' – DavidEG 2013-03-25 14:05:44

相关问题