Perl Crypt-Eksblowfish Cypher加密字符串,必须在python中解密

时间:2015-01-17 14:04:55

标签: python perl encryption bcrypt blowfish

Perl脚本使用此模块加密字符串 http://search.cpan.org/~zefram/Crypt-Eksblowfish-0.009/lib/Crypt/Eksblowfish.pm

我需要在python中编写解密函数。我知道钥匙和盐。 我试图使用py-bcrypt,但似乎是两个等效函数

$ ciphertext = $ cipher-> encrypt($ plaintext); $ plaintext = $ cipher-> decrypt($ ciphertext);

未实施。

我该怎么办?在任何地方都有一个python模块可以帮助我解密我的字符串吗?

1 个答案:

答案 0 :(得分:0)

更新:完整的答案是Perl代码:

my $cipher = Crypt::EksBlowFish->new($cost, $salt, $key);

等同于这个Python代码:

bf = Eksblowfish()
bf.expandkey(salt, key)
for i in xrange(cost << 1):
  bf.expandkey(0, key)
  bf.expandkey(0, salt)

请参阅此repo,例如代码:https://github.com/erantapaa/python-bcrypt-tests

原始答案:

部分答案......

我假设您正在调用此Perl代码:

use Crypt::EksBlowfish;

my $cipher = Crypt::EksBlowFish->new($cost, $salt, $key);
$encoded = $cipher->encrypt("some plaintext");

new方法由lib / Crypt / EksBlowfish.xs中的C函数setup_eksblowfish_ks()实现。这看起来与Python代码(link)

中的expandKey方法相同

主要区别在于$cost参数,它在Python方法中不存在。在Perl代码中,$cost参数控制在设置密钥计划后执行此循环的次数:

    for(count = 1U << cost; count--; ) {
            for(j = 0; j != 2; j++) {
                    merge_key(j == 0 ? expanded_key : expanded_salt, ks);
                    munge_subkeys(ks);
            }
    }

Perl ->encrypt()方法对64位字进行加密。等效的Python代码是:

bf.cipher(xl, xr, bf.ENCRYPT)

其中xl和xr是分别代表左32位和右32位的整数。

所以食谱应该是这样的:

  1. 创建Python对象:bf = EksBlowfish()
  2. 初始化密钥计划:bf.expandkey(salt, key)
  3. 使用成本参数(TBD)进一步挖掘关键时间表
  4. 使用bf.cipher(xl, xr, bf.ENCRYPT)
  5. 进行加密