当前位置: 首页 > 知识库问答 >
问题:

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

梁豪
2023-03-14

一方面,我有一个文本加密/解密与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发送到Python系统的\u hex:ed密码短语进行加密。

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

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

然而,Crypt::CBCdocumnetation似乎表明IV已经存在

“盐”——将密码短语与一个8字节的随机值结合起来,从提供的密码短语中生成分组密码密钥和IV。盐将被附加到数据流的开头,允许解密重新生成密钥和IV,并给出正确的密码。

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

这可能是一个幼稚的问题,但我不是每天都这么做。

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

共有1个答案

郁隐水
2023-03-14

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 将使用56字节(448位)的最大长度Blowfish密钥大小。

因此,您可能还需要一些key=md5(密钥数据)。digest()调用,因为md5输出只有128位。

 类似资料:
  • 问题内容: 我在SO上发现了其他几个有关JavaMail API和通过SMTP服务器发送邮件的问题,但是没有一个使用TLS安全性进行讨论。我正在尝试使用JavaMail通过我的工作SMTP邮件服务器向我发送状态更新,但是它需要TLS,而且我在网上找不到任何有关如何使用JavaMail访问需要TLS加密的SMTP服务器的示例。有人能帮忙吗? 问题答案: 实际上,我们的产品中确实有一些通知代码,如果有

  • 我已经阅读了一些关于SaaS/PaaS/IaaS的信息,我在想: 如果我提供了一个SaaS应用程序,我的客户能否使用PaaS开发和部署他自己的应用程序,PaaS将使用一些API与我的SaaS应用程序交互?还是我对云服务的理解有误?

  • 问题内容: 谁能给我指出一个完整的示例,而 不是 在App Engine上使用OAuth2和Flask对Google帐户进行身份验证? 我试图让用户授予对Google日历的访问权限,然后使用该访问权限从日历中检索信息并对其进行进一步处理。我还需要存储并稍后刷新OAuth2令牌。 我看过Google的oauth2client库,可以开始检索授权代码了,但是我从那里有点迷失了。通过查看Google的O

  • 问题内容: TextMate似乎使用了我假定的内置Python版本(sys.path不起作用)。您如何配置它以使用3.1?我已经安装了3.1软件包,并且可以将IDLE用于交互式会话,但是现在需要使用TextMate。 谢谢 问题答案: TextMate使用变量的值来查找Python解释器的路径。一个好的解决方案是利用TextMate的能力来定义变量(例如基于每个项目): 打开一个新的或现有的Tex

  • 问题内容: 我想使用并且在本节中非常基础,我需要一些帮助,并且在网上之前对此主题进行了研究,但是没有令人满意的解决方案。 1-如何FFmpeg通过使用。(我不想使用Ubuntu,请不要建议。) 2-如何通过插入命令? 最后通知:我使用和。 任何建议,将不胜感激。 问题答案: 如果您需要进一步的帮助,请确切说明您要实现的目标以及不起作用的目标… 更新-根据评论: 要在Android上通过命令行使用f

  • 我严格遵循了一个教程,但我似乎无法让它发挥作用。本教程位于IDE的非模块化JavaFX和Intellij部分:https://openjfx.io/openjfx-docs/#install-爪哇 以下是我在尝试运行默认Intellij Idea JavaFX项目时收到的错误消息: 通向jdk-11.0.1和javafx-sdk-11.0.1的路径: C:\Program Files\Java J