AES加密示例类,使用用户密码加密数据

时间:2017-08-08 08:36:17

标签: python-3.x aes encryption-symmetric

在Python 3应用程序中,我需要使用自己的密码加密用户的数据。 我正在使用Cryptodome库。

鉴于AES需要固定大小的密钥(在示例中为128位),我使用PBKDF2来获取密钥。 下面是我在代码中使用的类。

我将用于密钥派生的salt( salt )存储在消息本身顶部,并将初始化向量(代码中的 iv )存储在消息本身的顶部。 实际上,根据我的理解(阅读文档here),盐和静脉注射都不能保密。

这是一种正确的方法,还是可以建议我一个更好的方法?

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Protocol import KDF

class crypto:
    def __init__(self,pwd):
        self.pwd = pwd

    def encrypt(self,data):
        salt = get_random_bytes(8)
        key = KDF.PBKDF2(self.pwd,salt) #128bit key derivation function
        iv = get_random_bytes(16)
        cipher = AES.new(key, AES.MODE_CFB, iv)
        return salt + iv + cipher.encrypt(data)

    def decrypt(self,msg):
        key = KDF.PBKDF2(self.pwd,msg[:8])
        cipher = AES.new(key, AES.MODE_CFB, msg[8:24])
        return cipher.decrypt(msg[24:])

提前致谢。

1 个答案:

答案 0 :(得分:1)

是的,这是正确的,是一种很好的做法,也是为解密代码提供派生盐和iv的好方法。

PBKDF提供大量安全措施来防止暴力密码攻击以及正确的长度密钥。