如何在python中使用密码加密文本?

如何在python中使用密码加密文本?,第1张

如何在python中使用密码加密文本?

以下是在CBC模式下正确执行 *** 作的方法,包括PKCS#7填充:

import base64from Crypto.Cipher import AESfrom Crypto.Hash import SHA256from Crypto import Randomdef encrypt(key, source, enpre=True):    key = SHA256.new(key).digest()  # use SHA-256 over our key to get a proper-sized AES key    IV = Random.new().read(AES.block_size)  # generate IV    encryptor = AES.new(key, AES.MODE_CBC, IV)    padding = AES.block_size - len(source) % AES.block_size  # calculate needed padding    source += bytes([padding]) * padding  # Python 2.x: source += chr(padding) * padding    data = IV + encryptor.encrypt(source)  # store the IV at the beginning and encrypt    return base64.b64enpre(data).depre("latin-1") if enpre else datadef decrypt(key, source, depre=True):    if depre:        source = base64.b64depre(source.enpre("latin-1"))    key = SHA256.new(key).digest()  # use SHA-256 over our key to get a proper-sized AES key    IV = source[:AES.block_size]  # extract the IV from the beginning    decryptor = AES.new(key, AES.MODE_CBC, IV)    data = decryptor.decrypt(source[AES.block_size:])  # decrypt    padding = data[-1]  # pick the padding value from the end; Python 2.x: ord(data[-1])    if data[-padding:] != bytes([padding]) * padding:  # Python 2.x: chr(padding) * padding        raise ValueError("Invalid padding...")    return data[:-padding]  # remove the padding

它设置为可以处理

bytes
数据,因此,如果要加密字符串或使用字符串密码,请
enpre()
在将它们传递给方法之前,确保使用正确的编解码器对它们进行加密。如果将
enpre
参数保留为输出
True
encrypt()
输出将为base64编码的字符串,并且
decrypt()
source也应为base64字符串。

现在,如果您将其测试为:

my_password = b"secret_AES_key_string_to_encrypt/decrypt_with"my_data = b"input_string_to_encrypt/decrypt"print("key:  {}".format(my_password))print("data: {}".format(my_data))encrypted = encrypt(my_password, my_data)print("nenc:  {}".format(encrypted))decrypted = decrypt(my_password, encrypted)print("dec:  {}".format(decrypted))print("ndata match: {}".format(my_data == decrypted))print("nSecond round....")encrypted = encrypt(my_password, my_data)print("nenc:  {}".format(encrypted))decrypted = decrypt(my_password, encrypted)print("dec:  {}".format(decrypted))print("ndata match: {}".format(my_data == decrypted))

您的输出将类似于:

key:  b'secret_AES_key_string_to_encrypt/decrypt_with'data: b'input_string_to_encrypt/decrypt'enc:  7roSO+P/4eYdyhCbZmraVfc305g5P8VhDBOUDGrXmHw8h5ISsS3aPTGfsTSqn9f5dec:  b'input_string_to_encrypt/decrypt'data match: TrueSecond round....enc:  BQm8FeoPx1H+bztlZJYZH9foI+IKAorCXRsMjbiYQkqLWbGU3NU50OsR+L9Nuqm6dec:  b'input_string_to_encrypt/decrypt'data match: True

证明相同的密钥和相同的数据每次仍会产生不同的密文。

现在,这比ECB更好,但是…如果您要使用它进行通信-别!这更多是为了解释它应该如何构造,而不是真正在生产环境中使用,尤其是不能用于通讯,因为它缺少关键要素-
消息身份验证。可以随意使用它,但是您不应该使用自己的加密货币,有经过严格审查的协议可以帮助您避免常见的陷阱,应该使用这些陷阱。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5498836.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存