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

如何在python中解密使用openssl[duplicate]加密的文件

商飞尘
2023-03-14

我使用下面的命令使用openssl加密了一个文件

cat input.txt
hello world
openssl aes-256-cbc -pass pass:'00112233445566778899aabbccddeeff' -iv a2a8a78be66075c94ca5be53c8865251 -nosalt -base64 -in input.txt -out output.txt
cat output.txt
pt7DqtAwtTjPbTlzVApucQ==

我怎么能解密文件使用python加密包。我尝试了下面,它不工作。

>>> from Crypto.Cipher import AES
>>> from base64 import b64decode
>>> with open('output.txt') as f:
...     aes = AES.new('00112233445566778899aabbccddeeff', AES.MODE_CBC, IV='a2a8a78be66075c94ca5be53c8865251'.decode('hex'))
...     print(aes.decrypt(b64decode(f.read())))
...
L�|�L   ��O�*$&9�

我需要一种使用openssl aes-256-cbc密码加密文件并在python中解密的方法

共有1个答案

夏学名
2023-03-14

密码不是密钥。Openssl使用EVP_BytesToKey创建适当的密钥(

正如James K Polk在评论中提到的,可以使用-P(或-P)选项告诉Openssl打印密钥(十六进制),然后将密钥传递给Crypto。密码或者,您可以在Python中实现EVP_BytesToKey,如下所示。这是一个简化版的EVP_BytesToKey,它不使用盐,并且countarg的默认值为1。

正如EVP_BytesToKeydocs所述,这是一个相当弱的密码派生函数。正如hashlib文档所提到的,现代密码派生通常会执行数十万次哈希,从而使密码哈希攻击非常缓慢。

我们还需要一个函数来从解密的数据字节中删除PKCS7填充。下面的unpad函数只是假设填充数据有效。在实际软件中,unpad功能必须验证填充数据是否有效,以防止基于填充的攻击。Myunpad函数还假设数据已编码为UTF-8字节,并将未添加的数据解码为文本。

from __future__ import print_function
from Crypto.Cipher import AES
from base64 import b64decode
from hashlib import md5

def evp_simple(data):
    out = ''
    while len(out) < 32:
        out += md5(out + data).digest()
    return out[:32]

def unpad(s):
    offset = ord(s[-1])
    return s[:-offset].decode('utf-8')

iv = 'a2a8a78be66075c94ca5be53c8865251'.decode('hex')
passwd = '00112233445566778899aabbccddeeff'
key = evp_simple(passwd)
print('key', key.encode('hex'))

aes = AES.new(key, AES.MODE_CBC, IV=iv)

data = b64decode('pt7DqtAwtTjPbTlzVApucQ==')

raw = aes.decrypt(data)
print(repr(raw), len(raw))
plain = unpad(raw)
print(repr(plain), len(plain))

输出

key b4377f7babf2991b7d6983c4d3e19cd4dd37e31af1c9c689ca22e90e365be18b
'hello world\n\x04\x04\x04\x04' 16
u'hello world\n' 12

这些代码不会在Python3上运行,所以这里有一个Python3版本。

from Crypto.Cipher import AES
from base64 import b64decode
from hashlib import md5

def evp_simple(data):
    out = b''
    while len(out) < 32:
        out += md5(out + data).digest()
    return out[:32]

def unpad(s):
    offset = s[-1]
    return s[:-offset].decode('utf-8')

iv = bytes.fromhex('a2a8a78be66075c94ca5be53c8865251')
passwd = b'00112233445566778899aabbccddeeff'
key = evp_simple(passwd)

aes = AES.new(key, AES.MODE_CBC, IV=iv)

data = b64decode('pt7DqtAwtTjPbTlzVApucQ==')

raw = aes.decrypt(data)
print(repr(raw), len(raw))
plain = unpad(raw)
print(repr(plain), len(plain))

输出

b'hello world\n\x04\x04\x04\x04' 16
'hello world\n' 12
 类似资料:
  • OpenSSL提供了一个流行的(但不安全-请参见下面!)AES加密的命令行界面: Python以PyCrypto包的形式支持AES,但它只提供了工具。如何使用Python/Pycrypto解密已经使用OpenSSL加密的文件? 这个问题过去也涉及使用相同方案在Python中进行加密。我已经删除了这部分,以阻止任何人使用它。不要再用这种方式加密任何数据,因为按照今天的标准,它是不安全的。您应该只使用

  • 如果生成RSA密钥和加密文本,如下所示 现在我想在JAVA源代码中解密。有什么办法吗?

  • 我需要设置一个Python进程,它能够获取特定文件夹中的每个ZIP文件,并将其解压缩,以便访问和处理其中的数据。提供ZIP文件的人显然使用Java例程来实现这一点,但由于我不懂Java(甚至不懂密码学),所以我想使用Python。他们给了我: 一个密码 一个初始化向量 他们还指定使用这种类型的命令行:

  • 问题内容: 我需要使用以下命令在JAVA中解密在UNIX中加密的文件: 我必须像在UNIX中一样在Java中解密 有人可以给我一个Java代码来执行此操作吗? 问题答案: OpenSSL通常使用自己的基于密码的密钥派生方法,该方法在中指定EVP_BytesToKey,请参见下面的代码。此外,它会在多行中隐式地将密文编码为base 64,以便在邮件正文中发送密文。 因此,结果是伪代码: 因此解密为:

  • 问题内容: 我正在连接一个旧的Java应用程序(无法更改该应用程序),该应用程序正在使用AES加密数据。这是原始Java代码如何实例化AES密码: 我是C / C ++开发人员,而不是Java,但是从我可以看出来的传统Java代码中,既没有指定模式,也没有指定初始化向量。有人偶然知道默认情况下将使用什么Java,因为未指定它? 我们需要新的C / C ++应用程序来解密Java加密的数据。但是我不

  • 我使用以下命令加密了一个文件 openssl rand 32>test.key openssl enc-aes-256-cbc-iter 10000-pbkdf2-salt-输入test.txt-输出test.txt.enc-通过文件:test.key 我的代码 我得到的错误 我引用了以下链接 尝试使用时,仍然得到错误