【问题标题】:AES-ECB encryption (Difference between Python Crypto.Cipher and openssl)AES-ECB 加密(Python Crypto.Cipher 和 openssl 的区别)
【发布时间】:2015-06-15 23:53:21
【问题描述】:

我在使用 python 和 openssl 加密时遇到问题。

我写了这个小 Python 脚本:

#!/usr/bin/python
from Crypto.Cipher import AES

obj = AES.new('Thisisakey123456', AES.MODE_ECB)
message = "Sample text....."
ciphertext = obj.encrypt(message)
print ciphertext

当我用这个命令运行脚本时:

$ ./enc.py | base64

结果我得到了E0lNh0wtSg9lxxKClBEITAo=

如果我在 openssl 中做同样的事情(或者显然不一样;))我会得到另一个结果:

$ echo -n "Sample text....." | openssl aes-128-ecb -k "Thisisakey123456" -nosalt -nopad | base64
yvNTGC+gwUK38uyJXIk/sQ==

我做错了什么??我希望使用相同的 base64 编码字符串。

顺便说一句:我知道 ecb 不好,但我只是随便玩玩,所以没问题... ;)

【问题讨论】:

  • 请记住,欧洲央行可能是不安全的(如果您对细节感兴趣)。它唯一安全的if消息小于块大小,并且只有一条消息在密钥下加密。如果您的消息大于块大小,则需要使用 CBC 模式(或其他类似)模式。如果消息重复,则每条消息都需要一个唯一的 IV。
  • 谢谢,我知道了。我没有实现一些安全的东西,只是在玩一些东西......无论如何,你不能提及它足够多:)

标签: python encryption openssl aes


【解决方案1】:

你可以试试这个命令:

echo -n "Sample text....." | openssl aes-128-ecb -K 546869736973616b6579313233343536 -nopad | openssl base64

这明确指定了hexadecimals 中的键。对于-k,下面的“密钥”实际上是一个密码,它是通过一个名为EVP_BytesToKey 的基于 OpenSSL 密码的密钥派生函数 (PBKDF) 进行转换的(使用一次 SHA-1 迭代)。

结果是E0lNh0wtSg9lxxKClBEITA==。这与 E0lNh0wtSg9lxxKClBEITAo= 不同,但这是因为 Python 在密文中添加了一个换行符 \n,导致要编码一个额外的字节。

【讨论】:

  • 只是出于兴趣,您目前使用的是哪种 base64 编码器?我的 Linux base64 命令似乎运行良好。
  • 似乎(不再)需要 IV 参数。这很好,因为欧洲央行不使用任何 IV。
  • 谢谢...今天又学到了一件事... :) base64 不是我认为的问题。这是因为python的print命令添加了换行符,base64也对换行符进行了编码。
  • 啊,这确实可以解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
相关资源
最近更新 更多