一方面,我使用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程序的密钥,以及来自Perl的encrypt_hex:ed密码发送到Python系统。
但是Python似乎绝对希望让IV能够完成它的工作
cipher = Blowfish.new( self.key, Blowfish.MODE_CBC, self.iv )
return hexlify(cipher.encrypt(raw))
然而,Crypt::CBC
documnetation似乎表明IV已经存在
"盐" - 将密码短语与8字节随机值组合 从中生成块密码密钥和IV 提供了密码。盐将附加到 允许解密的数据流的开头 给出正确的重新生成密钥和IV 密码短语。
有没有办法通过PyCrypto从密钥/密码短语中提取IV?或者IV必须以某种方式单独发送吗?
这可能是一个天真的问题,但我每天都不会这样做。
我知道我可以从Perl端获得IV,但是如果可能的话我真的想在Python端提取它。
答案 0 :(得分:2)
Crypt::CBC
声称OpenSSL兼容性。这意味着它执行基于OpenSSL的BytesToKey
基于密码的密钥派生函数(PBKDF)。在此推导期间,也计算IV。因此,您为Crypt::CBC
提供的密钥实际上被视为密码。
您必须查找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
然后取密钥的第一个字节,然后取IV的后8个字节。但请注意Crypt的以下声明:CBC:
如果未指定-keysize,则Crypt :: CBC将使用最大长度Blowfish密钥大小为56字节(448位)。
因此,您可能需要多一些key += md5(key + data).digest()
调用,因为md5输出只有128位。