解决Python密码管理器中的Padding错误

秋浩君_2535

秋浩君_2535

2025-11-24

168人浏览

原创

解决python密码管理器中的padding错误

本文旨在解决在使用Python开发密码管理器时遇到的Padding错误问题。该错误通常出现在使用AES加密算法时,由于数据块大小的限制,需要对数据进行填充。本文将提供一个修复后的代码示例,并解释如何正确地进行加密和解密操作,以避免Padding错误,从而安全地存储和检索密码。

在开发密码管理器时,安全性至关重要。使用AES(Advanced Encryption Standard)算法对密码进行加密是一种常见的做法。然而,在使用AES时,开发者经常会遇到“Padding is incorrect”的错误。本文将深入探讨这个问题,并提供一个可靠的解决方案。

问题分析

AES算法要求加密的数据长度必须是块大小的整数倍。如果原始数据长度不是块大小的整数倍,就需要进行填充(Padding)。在解密时,需要去除填充,才能恢复原始数据。ValueError: Padding is incorrect. 错误通常发生在解密阶段,表明填充不正确,导致无法正确解密数据。

解决方案

以下代码展示了一种避免Padding错误的实现方式,它使用了自定义的Padding和Unpadding方法,并使用 hashlib 来处理密钥:

GitHub & Developer Data
GitHub & Developer Data

面向AI代理的GitHub及开发者数据——仓库元数据(星标、语言、许可证)、仓库审计与风险评分、用户资料、最新发布和gist内容...

下载
import re
import random
import string
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import hashlib

def password_generator(size=10):
    if size = 8:
        if bool(re.match(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z\d])', password)):
            print("The password is strong")
        else:
            print("The password is weak")
    else:
        print("You have entered a short or invalid password.")

# Generate a password
generated_password = password_generator()
print(generated_password)

# Check the generated password
password_checker(generated_password)


class AESCipher(object):

    def __init__(self, key):
        self.bs = AES.block_size
        self.key = hashlib.sha256(key).digest()

    def encrypt_data(self, iv, raw):
        raw = self._pad(raw)
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return cipher.iv, iv + cipher.encrypt(raw.encode())

    def decrypt_data(self, iv, enc):
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return AESCipher._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8')

    def _pad(self, s):
        return s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)

    @staticmethod
    def _unpad(s):
        return s[:-ord(s[len(s)-1:])]

# Generate a random 128-bit IV for AES
iv = get_random_bytes(16)

# Generate a random 256-bit key for AES
key = get_random_bytes(32)  # save this maybe?

Cipher = AESCipher(key)

# Encrypt the generated password
iv, encrypted_password = Cipher.encrypt_data(iv, generated_password)
print(f"Encrypted password: {encrypted_password}")

# Decrypt the encrypted password
decrypted_password = Cipher.decrypt_data(iv, encrypted_password)
print(f"Decrypted password: {decrypted_password}")

# Save the encrypted password to a file
with open(
        'Password.txt',
        'a', encoding='utf-8') as f:
    f.write(f"{iv.hex()}:{encrypted_password.hex()}\n")

# Read the encrypted password from the file
with open(
        'Password.txt',
        'r', encoding='utf-8') as f:
    for line in f.readlines():
        line = line.strip()  # Remove the trailing newline character
        iv, encrypted_password = line.split(':')
        decrypted_password = Cipher.decrypt_data(bytes.fromhex(iv), bytes.fromhex(encrypted_password))

代码解释:

  1. AESCipher 类: 封装了AES加密和解密操作。
  2. __init__(self, key): 构造函数,接收密钥并使用SHA256算法对其进行哈希处理,以确保密钥的安全性。
  3. encrypt_data(self, iv, raw): 加密数据。首先,使用_pad方法对原始数据进行填充,然后使用AES算法进行加密。
  4. decrypt_data(self, iv, enc): 解密数据。使用AES算法进行解密,然后使用_unpad方法去除填充。
  5. _pad(self, s): 自定义的填充方法。它将原始数据填充到块大小的整数倍。
  6. _unpad(self, s): 自定义的去除填充方法。它去除_pad方法添加的填充。
  7. 密钥处理: 使用 hashlib.sha256(key).digest() 对密钥进行哈希处理,增强安全性。
  8. IV处理: 在加密时,将IV与加密后的数据连接起来,并在解密时将其分离。

注意事项

  • 密钥安全: 请务必安全地存储密钥。如果密钥丢失,将无法解密数据。
  • IV (Initialization Vector) 的使用: 每次加密都应使用不同的IV。IV不需要保密,但必须在解密时使用相同的IV。
  • 文件路径: 避免在代码中硬编码文件路径,特别是包含个人信息的路径。

总结

通过使用自定义的Padding和Unpadding方法,可以有效地避免Python密码管理器中常见的Padding错误。同时,请务必注意密钥的安全存储和IV的正确使用,以确保密码管理器的安全性。记住,安全性是密码管理器开发中最重要的考虑因素。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

word python git crypto

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

2023.12.07

3212

3

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

2023.08.14

6616

4

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

2026.11.03

0

17

Tailwind CSS 响应式布局怎么写
Tailwind CSS 响应式布局怎么写

Tailwind CSS 响应式布局通常从移动端样式写起,再用 sm、md、lg 等前缀调整不同屏幕宽度下的网格、间距和导航。本专题整理断点配置、Grid 与 Flex 自适应布局及常见溢出问题,帮助你逐步完成多设备适配。

2026.11.03

0

19

Tailwind CSS 常用类名怎么记
Tailwind CSS 常用类名怎么记

Tailwind CSS 类名很多,先按布局、间距、文字、颜色和状态分组记忆,再通过官方文档检索具体写法。本专题结合类名排序、动态拼接失效、自定义实用类等问题,帮助你建立常用类名的速查方法。

2026.11.03

0

12

码上飞入口地址合集
码上飞入口地址合集

本专题汇总了码上飞(CodeFlying)的官方入口地址合集,涵盖官网主站及网页版在线使用入口,支持注册登录后直接在线体验零代码AI应用生成。同时整理了APP端下载渠道与小程序入口,助你快速访问平台,通过自然语言描述需求即可生成应用、小程序或网站。

2026.11.03

0

10

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

2026.11.02

20

14

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

2026.11.02

20

17

Uvicorn安装配置教程
Uvicorn安装配置教程

本专题汇总了Uvicorn的安装配置教程与部署指南,涵盖通过pip安装Uvicorn、启动FastAPI/Starlette应用、开发模式热重载(--reload)及多进程工作模式配置等核心操作。同时整理了结合Gunicorn的生产部署方案、HTTPS与反向代理配置及性能调优技巧,助你快速完成Uvicorn服务的安装与上线部署。

2026.11.02

20

17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程