使用Python PyCrypto和Perl Crypt :: CBC

时间:2015-11-14 17:04:36

标签: python perl encryption cryptography blowfish

一方面,我使用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端提取它。

1 个答案:

答案 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位。