首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PyCrypto解密Perl加密口令

使用PyCrypto解密Perl加密口令
EN

Stack Overflow用户
提问于 2013-02-14 01:08:35
回答 1查看 2.5K关注 0票数 1

我在试着解密存储在文件中的密码短语。加密是使用Perl::CBC模块完成的,但我需要为Python脚本解密它。坦率地说,我对加密算法知之甚少。

密码短语是这样加密的:

代码语言:javascript
复制
use Crypt::CBC;

my $key = '0123456789';
my $iv  = '$KJh#(}q';

my $cipher = Crypt::CBC->new(
    -key    => $key,
    -cipher => 'Blowfish',
    -header => 'none',
    -iv     => $iv,
);

my $passphrase = 'You have decrypted the passphrase.';
my $hex_encrypted = $cipher->encrypt_hex($passphrase);

它给出了一个加密的口令: 9033c838e4418fbdc50a9fc0813745296d195d59954008f94b2b36a8e65dca959686206960a7828a

现在,我需要在Python脚本中使用它(使用Python2.7)。天真地,我希望这能行得通:

代码语言:javascript
复制
from Crypto.Cipher import Blowfish
from binascii import hexlify, unhexlify

perl_pass =  unhexlify('9033c838e4418fbdc50a9fc0813745296d195d59954008f94b2b36a8e65dca959686206960a7828a')
key = '0123456789'
iv  = '$KJh#(}q'
print Blowfish.new(key, Blowfish.MODE_CBC, iv).decrypt(perl_pass)

但这似乎只会产生一堆无法打印的垃圾。我已经尝试了几次,但没有成功。我真的不确定我需要在这里做什么才能成功解密这个密码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-14 04:32:59

您给Crypt::CBC的“键”实际上是一个密码短语,从中生成一个“文字键”;Crypto.Cipher.Blowfish需要这个文字键,而不是密码短语。您可以从Perl程序中以十六进制打印生成的密钥,然后在Python中使用它:

代码语言:javascript
复制
use Crypt::CBC;

my $key = '0123456789';
my $iv  = '$KJh#(}q';

my $cipher = Crypt::CBC->new(
    -key    => $key,
    -cipher => 'Blowfish',
    -header => 'none',
    -iv     => $iv,
);

my $passphrase = "You have decrypted the passphrase.";
my $hex_encrypted = $cipher->encrypt_hex($passphrase);

print unpack('H*', $cipher->key()), "\n";

-

代码语言:javascript
复制
$ perl perl_crypt_cbc.pl
781e5e245d69b566979b86e28d23f2c78e938564cd1410f0ec1c1781466a6738bab0a6ed984c75ab34c68bbf7558077714043c5bdb959e46

-

代码语言:javascript
复制
from Crypto.Cipher import Blowfish
from binascii import hexlify, unhexlify

perl_pass = unhexlify("9033c838e4418fbdc50a9fc0813745296d195d59954008f94b2b36a8e65dca959686206960a7828a")

key = unhexlify("781e5e245d69b566979b86e28d23f2c78e938564cd1410f0ec1c1781466a6738bab0a6ed984c75ab34c68bbf7558077714043c5bdb959e46")
iv  = '$KJh#(}q'
print Blowfish.new(key, Blowfish.MODE_CBC, iv).decrypt(perl_pass)

-

代码语言:javascript
复制
python python_crypt_cbc.py 
You have decrypted the passphrase.

注意,最后有一些无法打印的字符:Blowfish加密的字符串必须是8字节的倍数,所以Perl会静默地填充它。用来填充它的字节是填充的长度:在本例中,填充长度为6字节,因此每个字节都是0x06。您可以轻松地删除它们:

代码语言:javascript
复制
from Crypto.Cipher import Blowfish
from binascii import hexlify, unhexlify

perl_pass = unhexlify("9033c838e4418fbdc50a9fc0813745296d195d59954008f94b2b36a8e65dca959686206960a7828a")

key = unhexlify("781e5e245d69b566979b86e28d23f2c78e938564cd1410f0ec1c1781466a6738bab0a6ed984c75ab34c68bbf7558077714043c5bdb959e46")
iv  = '$KJh#(}q'
num_padding = ord(Blowfish.new(key, Blowfish.MODE_CBC, iv).decrypt(perl_pass)[-1])

print Blowfish.new(key, Blowfish.MODE_CBC, iv).decrypt(perl_pass)[:(-1*num_padding)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14859006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档