【问题标题】:Using Python PyCrypto with Perl Crypt::CBC将 Python PyCrypto 与 Perl Crypt::CBC 一起使用
【发布时间】:2015-11-15 11:00:56
【问题描述】:

一方面,我有一个用 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 文档似乎表明 IV 已经存在

"salt" -- 将密码短语与 8 字节随机值组合到 从 提供密码。盐将附加到 数据流的开始允许解密 给定正确的重新生成密钥和IV 密码。

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

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

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

【问题讨论】:

  • 很抱歉您不喜欢我的编辑,但请记住,您提出问题的主要目的以及您可能提供的任何解决方案都是为了帮助遇到类似问题的其他人,这意味着主题行应该有助于引导这些人访问此页面。
  • 糟糕!我是新来的,不知道其他人可以编辑你的帖子,所以我以为我做了一些事情并试图回滚。现在我知道了,如果您愿意,欢迎您重新编辑;)

标签: python perl encryption cryptography blowfish


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2020-05-10
    • 2012-02-04
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多