gpt4 book ai didi

python - 将 Python PyCrypto 与 Perl Crypt::CBC 结合使用

转载 作者:行者123 更新时间:2023-12-01 04:20:52 26 4
gpt4 key购买 nike

一方面,我有一个用 Perl 加密/解密的文本 Crypt::CBC

my $key = 'key to the gates'; 
my $cipher = Crypt::CBC->new(
-key => $key,
-cipher => 'Blowfish',
-salt => '12341234'
);

另一边我有Python的PyCrypto我需要从 Perl 解码数据,但还需要发送 Perl 密码可以在加密情况下读取的文本。

我有来自 Perl 程序的 key ,以及从 Perl 发送到 Python 系统的 encrypt_hex:ed 密码。

但是 Python 似乎绝对希望让 IV 来完成它的工作

cipher = Blowfish.new( self.key, Blowfish.MODE_CBC, self.iv )
return hexlify(cipher.encrypt(raw))

但是,Crypt::CBC 文档似乎表明 IV 已经存在

"salt" -- Combine the passphrase with an 8-byte random value to generate both the block cipher key and the IV from the provided passphrase. The salt will be appended to the beginning of the data stream allowing decryption to regenerate both the key and IV given the correct passphrase.

有没有办法通过 PyCrypto 从 key /密码中提取 IV?或者 IV 是否必须以某种方式单独发送?

这可能是一个天真的问题,但我并不是每天都在处理这个问题。

我知道我可以从 Perl 端获取 IV,但如果可能的话,我真的想在 Python 端提取它。

最佳答案

Crypt::CBC 声称兼容 OpenSSL。这意味着它执行 OpenSSL 特定的基于密码的 key 派生函数 (PBKDF)。在此推导过程中,还会计算 IV。因此,您为 Crypt::CBC 提供的 key 实际上被视为密码。

您必须查找 EVP_BytesToKey 的实现并将其集成到您的程序中。您可以从以下代码 from GitHub 开始:

def bytes_to_key(data, salt="12345678"):
# Simplified version of M2Crypto.m2.bytes_to_key(). Based on:
# https://github.com/ajmirsky/M2Crypto/blob/master/M2Crypto/EVP.py#L105
# http://stackoverflow.com/questions/8008253/c-sharp-version-of-openssl-evp-bytestokey-method
assert len(salt) == 8, len(salt)
data += salt
key = md5(data).digest()
key += md5(key + data).digest()
return key

然后取第一个字节作为 key ,接下来的 8 个字节作为 IV。但请注意 Crypt:CBC 的以下声明:

If -keysize is not specified, then Crypt::CBC will use the maximum length Blowfish key size of 56 bytes (448 bits).

因此,您可能需要更多的 key += md5(key + data).digest() 调用,因为 md5 输出只有 128 位。

关于python - 将 Python PyCrypto 与 Perl Crypt::CBC 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33710997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com