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

在Python中实现OpenSSL AES加密

宗政金鹏
2023-03-14

我试图在Python中实现以下内容:openssl enc-e-aes-256-cbc-base 64-k"秘密密码"-inplaintext.txt-outciphertext.txt

openssl enc-d-aes-256-cbc-base64-k“秘密密码短语”——密文形式。txt-out验证。txt

我已经尝试了几个不同的模块,PyCrypto,M2Crypto等,但似乎无法获得将密码更改为正确大小的密钥和正确编码的正确组合。我找到了https://github.com/nvie/SimpleAES,但基本上是在命令行上运行OpenSSL,我宁愿避免。

共有2个答案

段干宾白
2023-03-14

因为如今base64标准已被弃用,pbkdf2哈希是最先进的,所以答案是正确的,但已经过时。我使用这篇帖子,因为它是在DDG上弹出的第一个结果。为了避免像我这样的人花上几天的时间来解决这个问题,这里是我的工作代码,用于加密openssl之类的数据。

以下代码与回声类似

def encrypt(self, password, input):
    bs = AES.block_size
    salt = urandom(bs - len(b'Salted__'))
    pbk = pbkdf2_hmac('sha256', password.encode('utf8'), salt, 10000, 48)
    key = pbk[:32]
    iv = pbk[32:48]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    result = (b'Salted__' + salt)
    finished = False
    while not finished:
        chunk = input.read(1024 * bs).encode()
        if len(chunk) == 0 or len(chunk) % bs != 0:
            padding_length = (bs - len(chunk) % bs) or bs
            chunk += (padding_length * chr(padding_length)).encode()
            finished = True
        result += cipher.encrypt(chunk)
    return result

提到/澄清几件事:

  • 你需要在散列的开头添加“salt____________________
  • iv是从pbkdf2散列中派生出来的(你经常会发现人们将iv添加到结果中。这会导致在解密结果(加密的iv)的开头出现随机的、神秘的字符。它是人类可读的,但请记住它们是随机字节,可以破坏一切!从passwordhash派生出来的一切都是有效的。)
  • openssl目前的标准值是:md=sha256,iter=10000
  • 您需要填充所有内容,以便加密工作(在循环时)
  • 如果你想,你也可以在base64中加密所有内容。为此,不要返回结果,而是返回base64。b64enode(结果)。它与上面的openssl命令相等,并添加了-base64标志

要使用openssl解密所有内容,请使用以下命令:openssl aes-256-cbc-pbkdf2-d-k

厍光霁
2023-03-14

Base 64编码和解码可以通过标准的base64模块轻松处理。

PyCrypto和M2Crypto都支持CBC模式下的AES-256解密和加密。

唯一的非标准(也是最困难的)部分是从密码推导IV和密钥。OpenSSL通过自己的EVP_BytesToKey函数来实现这一点,本手册页对此进行了描述。

Python的等价物是:

def EVP_BytesToKey(password, salt, key_len, iv_len):
    """
    Derive the key and the IV from the given password and salt.
    """
    from hashlib import md5
    dtot =  md5(password + salt).digest()
    d = [ dtot ]
    while len(dtot)<(iv_len+key_len):
        d.append( md5(d[-1] + password + salt).digest() )
        dtot += d[-1]
    return dtot[:key_len], dtot[key_len:key_len+iv_len]

其中,AES-256的key_len为32,iv_len为16。该函数返回可用于解密有效负载的密钥和IV。

OpenSSL将盐放在加密有效负载的前8个字节中。

最后,CBC模式下的AES只能处理与16字节边界对齐的数据。使用的默认填充是PKCS#7。

因此,加密的步骤如下:

  1. 生成8字节的随机数据作为salt

解密的步骤与此相反:

  1. 将Base64中的输入数据解码为二进制字符串
 类似资料:
  • 本文向大家介绍python实现在pandas.DataFrame添加一行,包括了python实现在pandas.DataFrame添加一行的使用技巧和注意事项,需要的朋友参考一下 实例如下所示: 以上这篇python实现在pandas.DataFrame添加一行就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 如何在Python usomg OpenSSL中执行RSA加密和解密? 我有以下几点:

  • 问题内容: 我正在尝试使用网站的OAuth,该网站要求签名方法仅是“ HMAC-SHA1”。 我想知道如何在Python中实现此功能? 问题答案: 假单胞菌: 签名错误通常驻留在基本字符串中,请确保您理解这一点(如OAuth1.0规范在此处所述:http://tools.ietf.org/html/draft-hammer- oauth-10#section-3.4 。 1)。 以下输入用于生成签

  • 问题内容: 我找到了它并以它为基础,但它开箱即用时却无法正常工作。我的目标也是将其视为程序包而不是命令行实用程序,因此我的代码更改将反映出来。 当我向设备发送基本命令时,它将返回以下内容。 我的代码读取第一行,但是随后出现错误消息,表明连接暂时不可用,并且没有获得第二行。如果我将其更改为阻塞,它只会阻塞并且永远不会返回。有什么想法吗? 问题答案: 如果您只使用它是否有效? 我认为您应该尝试一些更简

  • 本文向大家介绍在Python中使用M2Crypto模块实现AES加密的教程,包括了在Python中使用M2Crypto模块实现AES加密的教程的使用技巧和注意事项,需要的朋友参考一下  AES(英文:Advanced Encryption Standard,中文:高级加密标准),是一种区块加密标准。AES将原始数据分成多个4×4字节矩阵来处理,通过预先定义的密钥对每个字节矩阵中的每个字节进行异或、

  • 问题内容: 我正在尝试使用可以通过Google Authenticator应用程序 生成的一次性密码。 Google身份验证器的功能 基本上,Google身份验证器实现两种类型的密码: HOTP- 基于HMAC的一次性密码,这意味着密码会随RFC4226的每次调用而更改,并且 TOTP- 基于时间的一次性密码,每30秒更改一次(据我所知)。 Google身份验证器也可以在此处作为开源使用:code