python - 使用 PyCrypto 解密 Perl 加密密码

标签 python encryption pycrypto

我正在尝试解密存储在文件中的密码短语。加密是使用 Perl::CBC 模块完成的,但我需要为 Python 脚本解密它。坦率地说,我对加密算法了解不多(或真正了解)。

密码短语的加密方式如下:

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 脚本中使用它(使用 Python 2.7)。天真地,我希望这会起作用:

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)

但这似乎只会产生一堆无法打印的垃圾。我玩了一下没有成功。我不太确定在这里需要做什么才能成功解密此密码。

最佳答案

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

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";

-

$ perl perl_crypt_cbc.pl
781e5e245d69b566979b86e28d23f2c78e938564cd1410f0ec1c1781466a6738bab0a6ed984c75ab34c68bbf7558077714043c5bdb959e46

-

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)

-

python python_crypt_cbc.py 
You have decrypted the passphrase.

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

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)]

关于python - 使用 PyCrypto 解密 Perl 加密密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14859006/

相关文章:

python - 使用 python 下载大 zip 文件

JAVA - 解密 "DES"加密随机数

ios - AirPrint:限制用户只能打印到支持 TLS 的打印机

python - GAE Python - PyCrypto - 没有名为 winrandom 的模块

python - openssl 和 hashlib/pycrypto 之间的 SHA1 哈希不同

google-app-engine - 本地 mac AppEngine 上没有名为 Crypto.Cipher 的模块

python - 单个图上的多个条形 (Python)

python - 在 Django 中建模用户设置

python - Django 休息框架 : Embed Viewset Inside Viewset

java - Java 中 AES 加解密的首选方法