当前位置: 首页 > 面试题库 >

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

徐弘图
2023-03-14
问题内容

很难在Google上找到直接答案。

我想从诸如的用户那里收集一段文字和一条消息1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc hello world

然后,我希望能够以某种方式对消息进行加密/解密,以便可以将其保存在数据库中,而不必担心如果我的网站被黑客入侵,数据就会被泄露,
encrypt('1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc', 'hello world')
decrypt('1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc', <encrypted_text>)

有没有一种简单的方法可以用python实现,请有人提供/指导我看一个例子。

也许是一个示例,该示例如何使用诸如之类的种子创建公钥/私钥对'1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc'

提前谢谢了 :)

编辑:为了清楚起见,我正在寻找一种以不带混淆的方式加密用户数据的方法,不会混淆消息。

如果那意味着我必须通过使用文本1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc作为种子来快速生成PGP / GPG pub /pri密钥对,那很好,但是这样做的方法是什么?


问题答案:

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

import base64
from Crypto.Cipher import AES
from Crypto.Hash import SHA256
from Crypto import Random

def encrypt(key, source, encode=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.b64encode(data).decode("latin-1") if encode else data

def decrypt(key, source, decode=True):
    if decode:
        source = base64.b64decode(source.encode("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数据,因此,如果要加密字符串或使用字符串密码,请encode()在将它们传递给方法之前,确保使用正确的编解码器对它们进行加密。如果将encode参数保留为输出,Trueencrypt()输出将为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/4eYdyhCbZmraVfc305g5P8VhDBOUDGrXmHw8h5ISsS3aPTGfsTSqn9f5
dec:  b'input_string_to_encrypt/decrypt'

data match: True

Second round....

enc:  BQm8FeoPx1H+bztlZJYZH9foI+IKAorCXRsMjbiYQkqLWbGU3NU50OsR+L9Nuqm6
dec:  b'input_string_to_encrypt/decrypt'

data match: True

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

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



 类似资料:
  • 问题内容: 目前,我将密码[未加密]保留在属性文件中。使用ant将该密码原样放置在配置xml中。 [配置xml用于数据源,它正在创建dbcp.BasicDataSource的对象] 现在,是否有可能在ant目标之后以加密形式复制密码。听说Jasypt可以做到!直到现在我还没有尝试过。但是,问题不止于此。BasicDataSource不接受加密的密码。是否可以替代BasicDatasource。 仅

  • 我使用下面的命令使用加密了一个文件 我怎么能解密文件使用python加密包。我尝试了下面,它不工作。 我需要一种使用openssl aes-256-cbc密码加密文件并在python中解密的方法

  • 问题内容: 我正在使用JConsole访问我的应用程序MBean,并且使用了password.properties文件。但是根据Sun的规范,此文件仅包含明文格式的密码。 现在,我想对密码进行加密并将其用于JConsole的JMX用户身份验证(“远程”部分中的“用户名”和“密码”字段)。我可以使用任何预定义的加密逻辑或自己的加密算法。 是否有人知道将这种纯文本密码更改为加密密码,这样JMX Fra

  • 问题内容: 我有一个名为’filename.txt.pgp’的PGP文件,需要解密。当我从命令行运行解密时,它仅询问我密码。我使用gpg命令: 密码足够,我的文件已解密。我可以阅读它的内容。 现在,我应该用Java创建一个实用程序。经过研究,我发现Bouncy Castle图书馆是我最好的选择。但是我可以找到的所有Java示例都使用我没有的公共/专用密钥文件。 您能帮我举一个Java示例,该示例仅

  • 问题内容: 我正在尝试编写一个使用RSA密钥对加密和解密纯文本文件的实用程序。RSA密钥是使用ssh-keygen生成的,并照常存储在.ssh中。 我在理解如何使用Go语言crypto和crypto / rsa软件包时遇到问题吗?有关这些文档的文档很少(甚至更多,因为我对加密还不熟悉),并且示例很少。我检查了rsa_test.go文件是否有任何线索,但这只会使我更加困惑。 简而言之,我试图从.ss

  • 本文向大家介绍如何用Python 加密文件,包括了如何用Python 加密文件的使用技巧和注意事项,需要的朋友参考一下 生活中,有时候我们需要对一些重要的文件进行加密,Python 提供了诸如 hashlib,base64 等便于使用的加密库。 但对于日常学习而言,我们可以借助异或操作,实现一个简单的文件加密程序,从而强化自身的编程能力。 基础知识 在 Python 中异或操作符为:^,也可以记作