很难在Google上找到直接答案。
我想从诸如的用户那里收集一段文字和一条消息1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc hello world。
1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc
hello world
然后,我希望能够以某种方式对消息进行加密/解密,以便可以将其保存在数据库中,而不必担心如果我的网站被黑客入侵,数据就会被泄露, encrypt('1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc', 'hello world') decrypt('1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc', <encrypted_text>)
encrypt('1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc', 'hello world')
decrypt('1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc', <encrypted_text>)
有没有一种简单的方法可以用python实现,请有人提供/指导我看一个例子。
也许是一个示例,该示例如何使用诸如之类的种子创建公钥/私钥对'1PWP7a6xgoYx81VZocrDr5okEEcnqKkyDc'?
'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参数保留为输出,True则encrypt()输出将为base64编码的字符串,并且decrypt()source也应为base64字符串。
bytes
encode()
encode
True
encrypt()
decrypt()
现在,如果您将其测试为:
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更好,但是…如果您要使用它进行通信-别!这更多是为了解释它应该如何构造,而不是真正在生产环境中使用,尤其是不能用于通讯,因为它缺少关键要素- 消息身份验证。可以随意使用它,但是您不应该使用自己的加密货币,有经过严格审查的协议可以帮助您避免常见的陷阱,应该使用这些陷阱。