我需要用python解密在OpenSSL上加密的文件,但我不了解pycrypto的选项。
下面是我在OpenSSL中所做的
>
openssl enc-aes-256-cbc-a-盐-pbkdf2-iter 100000-在"clear.txt"-在"crypt.txt"-传递:"my密码"
openssl enc-d-aes-256-cbc-a-pbkdf2-iter 100000-输入“crypt.txt”-输出“out.txt”-传递:“mypassword”
我试过了(这显然行不通)
obj2 = AES.new("mypassword", AES.MODE_CBC)
output = obj2.decrypt(text)
我只想在python中执行第二步,但在查看示例时:
https://pypi.org/project/pycrypto/
obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
obj2.decrypt(ciphertext)
我不需要静脉注射,我怎么指定盐?pbkdf2散列?我也在看这根线
如何在Python中解密OpenSSL AES加密文件?
但没有帮助。
有人能告诉我如何使用python做到这一点吗?
非常感谢。
OpenSSL语句使用PBKDF2创建一个32字节的密钥和一个16字节的IV。为此,隐式生成一个随机的8字节salt,并应用指定的密码、迭代计数和摘要(默认值:SHA-256)。密钥/IV对用于在CBC模式下使用AES-256和PKCS7填充对明文进行加密。结果以OpenSSL格式返回,该格式以Salted_uuu;的8字节ASCII编码开始,然后是8字节的salt和实际的密文,均为Base64编码。解密需要salt,这样才能重建密钥和IV。
请注意,OpenSSL语句中的密码实际上是在没有引号的情况下传递的,即在发布的OpenSSL语句中,引号是密码的一部分。
对于Python中的解密,必须首先根据加密数据确定salt和实际密文。使用salt可以重建密钥/IV对。最后,密钥/IV对可用于解密。
示例:对于发布的OpenSSL语句,明文
The quick brown fox jumps over the lazy dog
被加密进了密文
U2FsdGVkX18A+AhjLZpfOq2HilY+8MyrXcz3lHMdUII2cud0DnnIcAtomToclwWOtUUnoyTY2qCQQXQfwDYotw==
使用Python解密可以如下(使用PyCryptodome):
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Hash import SHA256
from Crypto.Util.Padding import unpad
from Crypto.Cipher import AES
import base64
# Determine salt and ciphertext
encryptedDataB64 = 'U2FsdGVkX18A+AhjLZpfOq2HilY+8MyrXcz3lHMdUII2cud0DnnIcAtomToclwWOtUUnoyTY2qCQQXQfwDYotw=='
encryptedData = base64.b64decode(encryptedDataB64)
salt = encryptedData[8:16]
ciphertext = encryptedData[16:]
# Reconstruct Key/IV-pair
pbkdf2Hash = PBKDF2(b'"mypassword"', salt, 32 + 16, count=100000, hmac_hash_module=SHA256)
key = pbkdf2Hash[0:32]
iv = pbkdf2Hash[32:32 + 16]
# Decrypt with AES-256 / CBC / PKCS7 Padding
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = unpad(cipher.decrypt(ciphertext), 16)
print(decrypted)
编辑-关于您的评论: 16MB应该是可能的,但是对于较大的数据,密文通常会从文件中读取,解密的数据会写入文件,这与上面发布的示例相反。
数据是否可以在一步最终取决于可用内存。
当使用组块时,不使用Base64编码加密数据而是直接以二进制格式存储它们会更有意义。这可以通过在OpenSSL语句中省略-a选项来实现。否则,必须确保总是加载块大小(相对于未解码密文)的整数倍,其中未解码密文的3个字节对应于Base64编码密文的4个字节。
对于二进制存储的密文:在解密过程中,在第一步中仅应(二进制)读取第一个块(16字节)。由此,可以确定salt(字节8到16),然后是key和IV(类似于上面发布的代码)
其余的密文可以(二进制)以适当大小的块(=块大小的倍数,例如1024字节)读取。每个区块都是单独加密/解密的,请参阅多个加密/解密调用。有关使用Python读取/写入分块文件的信息,请参见例如此处
更多详细信息最好在单独的问题范围内回答。
我理解哈希和加密之间的区别。我正在寻找一种在Python中实现加密/解密字符串的简单方法。我在网上找到的大多数方法都是关于使用散列算法(MD5-SHA-1等)来进行单向散列。但不幸的是,哈希是不可逆的。有什么建议吗?
问题内容: 我有一个密码,该密码是通过JavaScript从JavaScript加密的 然后我尝试解密来自Python中JavaScript的密码: 我从浏览器控制台检查了JS,它显示IV in是具有某些属性(如)的对象。它似乎是随机生成的。 从一个网页上,它告诉我JS有两种方法来加密密码(参考链接): 一种。 b。 我在JavaScript中看到的应该是选项a。但是,只有选项b等效于python
我需要在Python中使用RSA加密和解密的帮助。 我正在创建一个私钥/公钥对,用密钥加密一条消息,并将消息写入一个文件。然后我从文件中读取密文,并使用密钥解密文本。 谁能帮我写这个代码,让解密从文件中读取密文,然后使用密钥解密密文?
我正在尝试在python中实现此代码(我是python新手),它给我以下错误: attribute error:“str”对象没有属性“decode” 如果我们删除 只是为了避免这样的错误: 但它给我以下错误: ValueError:IV必须为16字节长 因为算法需要,我必须删除 有没有人知道我该怎么做才能使这段代码工作?
我已经看过了AES-Encryption with Crypto(node js)/decryption with Pycrypto(python)的文章,因为我正试图做完全相反的事情,但我似乎做得不对。这是我到目前为止试过的。。。 Python加密 节点。js解密 每次我尝试运行节点时。js解密,我最终得到错误消息:
问题内容: 我在PHP中有一个函数,可按如下所示加密文本: 如何在Python中解密这些值? 问题答案: 要解密这种加密形式,您将需要获得Rijndael版本。在这里可以找到一个。然后,您将需要模拟PHP Mcrypt模块中使用的键和文本填充。它们增加了填充文本和键的正确大小。他们使用的是256位块大小,并且您提供的密钥使用的密钥大小为128(如果您提供更大的密钥,则密钥大小可能会增加)。不幸的是