繁体   English   中英

在Perl Crypt :: CBC中使用Python PyCrypto

[英]Using Python PyCrypto with Perl Crypt::CBC

一方面,我有一个用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的crypto_hex:ed密码短语发送到了Python系统。

但是Python似乎绝对想让IV来完成工作

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

但是, Crypt::CBC域名证明似乎表明IV已经存在

“ salt”-将密码短语与8字节随机值组合,以根据提供的密码短语生成块密码密钥和IV。 该盐将被附加到数据流的开头,从而允许解密以在给出正确密码短语的情况下重新生成密钥和IV。

有什么方法可以通过PyCrypto从密钥/密码短语中提取IV? 还是必须以某种方式单独发送IV?

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

我知道我可以从Perl方面获得IV,但我真的想尽可能在​​Python方面提取它。

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

您必须查找EVP_BytesToKey的实现,并将其集成到程序中。 您可以从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

然后将第一个字节用作密钥,然后将接下来的8个字节用作IV。 但是请注意以下有关Crypt:CBC的声明:

如果未指定-keysize,则Crypt :: CBC将使用最大长度的Blowfish密钥大小为56个字节(448位)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM