首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决"binascii.Error:填充错误“问题

如何解决"binascii.Error:填充错误“问题
EN

Stack Overflow用户
提问于 2020-09-18 10:50:40
回答 2查看 1.1K关注 0票数 0

我有以下代码:

代码语言:javascript
复制
import base64
from cryptography.hazmat.primitives.kdf.scrypt import Scrypt
from cryptography.hazmat.backends import default_backend
from cryptography.fernet import Fernet


def DeriveKey(passwordParam):
    if type(passwordParam) == str:
        passwordParam = passwordParam.encode("utf-8")
    keyDerivationFunction = Scrypt(
        salt=b'ABCDEFGHIJKLMNOP',
        length=32,
        n=2**14,
        r=8,
        p=1,
        backend=default_backend()
    )
    deriveKEY = keyDerivationFunction.derive(passwordParam)
    key = base64.urlsafe_b64decode(deriveKEY)
    return key

def Encrypt(chunkParam, passwordParam: str):
    key = DeriveKey(passwordParam)
    fernet = Fernet(key)
    encryptedChunk = fernet.encrypt(chunkParam)
    return encryptedChunk


def Decrypt(chunkParam, passwordParam: int):
    key = DeriveKey()
    fernet = Fernet(key)
    decryptedChunk = fernet.decrypt((chunkParam))
    return decryptedChunk



def EncryptFile(fileNameParam: str, passwordParam: str) -> None:
    with open(fileNameParam, "rb") as fileObject:
        fileContent = fileObject.read()
        encryptedFileContent = Encrypt(fileContent, passwordParam)
    with open(f"{fileNameParam}.enc", "wb") as fileObject:
        fileObject.write(encryptedFileContent)


def DecryptFile(fileNameParam: str, passwordParam: str) -> None:
    with open(fileNameParam, "rb") as fileObject:
        fileContent = fileObject.read()
        decryptedFileContent = Decrypt(fileContent, passwordParam)
    with open(f"{fileNameParam}.dec", "wb") as fileObject:
        fileObject.write(decryptedFileContent)

command = input("(E)ncrypt or (D)ecrypt ?").upper()
password=(input("Type password: "))
fileName = input("type filename: ")

if command == "E":
    EncryptFile(fileName, password)
elif command ==  "D":
    DecryptFile(fileName, password)

我收到以下错误消息:

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:/Users/mucah/PycharmProjects/FileEncrytDecrypt/main.py", line 57, in <module>
    EncryptFile(fileName, password)
  File "C:/Users/mucah/PycharmProjects/FileEncrytDecrypt/main.py", line 40, in EncryptFile
    encryptedFileContent = Encrypt(fileContent, passwordParam)
  File "C:/Users/mucah/PycharmProjects/FileEncrytDecrypt/main.py", line 24, in Encrypt
    fernet = Fernet(key)
  File "C:\Users\mucah\PycharmProjects\FileEncrytDecrypt\venv\lib\site-packages\cryptography\fernet.py", line 34, in __init__
    key = base64.urlsafe_b64decode(key)
  File "C:\Users\mucah\AppData\Local\Programs\Python\Python38-32\lib\base64.py", line 133, in urlsafe_b64decode
    return b64decode(s)
  File "C:\Users\mucah\AppData\Local\Programs\Python\Python38-32\lib\base64.py", line 87, in b64decode
    return binascii.a2b_base64(s)
binascii.Error: Incorrect padding

怎么啦?

EN

回答 2

Stack Overflow用户

发布于 2020-09-18 22:44:35

此脚本中有两个错误:

  1. 你想在你的scrypt派生的输出上调用urlsafe_b64encode而不是urlsafe_b64decode。Fernet需要key安全的base64编码密钥。
  2. 解密时,您忘记将passwordParam传递给密钥派生函数(并且参数的类型错误)
票数 0
EN

Stack Overflow用户

发布于 2020-09-19 03:19:05

现在就像这样:

回溯(最近一次调用):文件"C:/Users/mucah/PycharmProjects/FileEncrytDecrypt/main.py",行59,在DecryptFile(fileName,密码)文件"C:\Users\mucah\PycharmProjects\FileEncrytDecrypt\venv\lib\site-packages\cryptography\fernet.py",行48,在解密decryptedFileContent =解密(fileContent,passwordParam)文件"C:/Users/mucah/PycharmProjects/FileEncrytDecrypt/main.py",行32,在解密decryptedChunk = fernet.decrypt((chunkParam))文件Decrypt行75,在decrypt timestamp中,data = Fernet._get_unverified_token_data(token)文件"C:\Users\mucah\PycharmProjects\FileEncrytDecrypt\venv\lib\site-packages\cryptography\fernet.py",行101,in _get_unverified_token_data raise InvalidToken cryptography.fernet.InvalidToken

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63948660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档