如何从p,q和d解密RSA文本('数据大于mod len'错误)

时间:2013-03-23 11:09:24

标签: perl rsa

我正在尝试使用p,q和amp解密一些文本。 d RSA参数。这是我的代码:

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('161793529444258956657578160951133315733795687396943555542529109270426552912409876020630999202216058708771830991232800413521618941159308875874915491167328976063871230426911602170436153334762815254160844789590951618176633523800724364347786188020741173210831867848084340389279221308498668063580976312456313708227'),
  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 = 161793529444258956657578160951133315733795687396943555542529109270426552912409876020630999202216058708771830991232800413521618941159308875874915491167328976063871230426911602170436153334762815254160844789590951618176633523800724364347786188020741173210831867848084340389279221308498668063580976312456313708227
d = 4726230781685159301129128926091597612191418774972180765730674153946543720175721375641429858288249804644693058129864174539693448753576337835228363947222471089804797108134073771268482070990981157234925023770851307423738245681533737104667110764794379344770670194385194083716134044195705274587539907463141446593440244816853972305589231700346121402158165643863387848676660192091263041614047764528653983145902131144938355047165291147495652786645127063867131916536922764685613090037417336307735248968661966233168304037079723873034096551522712515691482108402916631034263410195810822874808411813091006049133015592459279891521
n = p * q
cypher_text = 21822641296030233094227313655848509440605583067924377543599838215888039562622129112129822895080408267928468534668157995224253484645729278749085139763130764635317451011719149549123004731102607506049461610797920861018820451965633121194245016524243388070479379308761222809258576639629711274935572812821629596774863705897518352434753834386314245125246066390859225185066330366811073476496684635339997048026729834327425483254569562337608819782060439696539771993138092386150797070320410153423661265108318321693803297014167486821806691214248145774922909225478697375135263295662839076540338821496045675607198591575588621659609

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

1 个答案:

答案 0 :(得分: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行的未知填充类型

我不确定这一点,但无论如何我必须带孩子出去:)