Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ValueError:使用AES256解密时填充字节无效_Python_Encryption_Cryptography_Aes_Python Cryptography - Fatal编程技术网

Python ValueError:使用AES256解密时填充字节无效

Python ValueError:使用AES256解密时填充字节无效,python,encryption,cryptography,aes,python-cryptography,Python,Encryption,Cryptography,Aes,Python Cryptography,我正试图使用加密库重写解决方案,但在解密过程中,我得到了填充错误,即ValueError:Invalid padding bytes.这是我目前使用的密码类: 导入操作系统 导入base64 从cryptography.hazmat.primitives导入哈希 从cryptography.hazmat.primitives导入填充 从cryptography.hazmat.backends导入默认\u后端 从加密、危险品、原语、密码导入模式 来自密码术.hazmat.primitives.ci

我正试图使用
加密
库重写解决方案,但在解密过程中,我得到了填充错误,即
ValueError:Invalid padding bytes.
这是我目前使用的密码类:

导入操作系统
导入base64
从cryptography.hazmat.primitives导入哈希
从cryptography.hazmat.primitives导入填充
从cryptography.hazmat.backends导入默认\u后端
从加密、危险品、原语、密码导入模式
来自密码术.hazmat.primitives.ciphers导入密码
来自加密、危险品、原语、密码导入算法
从cryptography.hazmat.primitives.kdf.pbkdf2导入PBKDF2HMAC
AES256类密码:
定义初始化(自我、密码、salt):
self.password=password.encode('utf-8')
self.salt=salt.encode('utf-8')
self.backend=default_backend()
self.key=self.pbkdf2()
def加密(自身、明文):
iv=os.Uradom(16)
密码(
算法.AES(自密钥),
模式。CBC(iv),
backend=self.backend
)
encryptor=cipher.encryptor()
padder=padding.PKCS7(256).padder()
明文=明文.rstrip().encode('utf-8')
padded=padder.update(纯文本)+padder.finalize()
密文=encryptor.update(填充)+encryptor.finalize()
返回base64.b64编码(密文)
def解密(自身、密文):
ciphertext=base64.b64解码(ciphertext.rstrip())
iv=密文[:16]
密码(
算法.AES(自密钥),
模式。CBC(iv),
backend=self.backend
)
decryptor=cipher.decryptor()
unpadder=padding.PKCS7(256).unpadder()
明文=解密程序.update(密文)+解密程序.finalize()
unpadded=unpadder.update(纯文本)+unpadder.finalize()
返回未添加的。解码('utf-8')
def pbkdf2(自身):
kdf=PBKDF2HMAC(
算法=hashes.SHA256(),
长度=32,盐=自身盐,
迭代次数=100000次,
backend=self.backend
)
返回kdf.derive(self.password)
当代码到达
decrypt
方法中的
unpadded=unpadder.update(明文)+unpadder.finalize()时,会引发异常。为什么填充失败了?例如:

password='dummy\u password'
salt='IU^7862390rZI)和(*hi23q2rfbnO(*^$%#'
密码=AES256Cipher(密码,salt)
ct=cipher.encrypt('secret\u string')

cipher.decrypt(ct)#您的解密方法是将密码的前16个字节提取为IV,但您的加密方法从未将其放在那里。解决方法是让
加密
在base64编码之前将IV放在密文前面

返回base64.b64编码(iv+密文)
在解密端,您必须正确删除它:

iv,密文=密文[:16],密文[16:]

I尽管
modes.CBC(iv)
Cipher
中的
默认情况下将添加
iv
,我不必手动添加它。只需指出,链接的pycrypto问题使用的是
AES\u CFB
,而不是
CBC
@legoroj有什么区别?这会影响这个实现吗?有点-CFB不需要填充。