首页 > 解决方案 > 试图加密

问题描述

免责声明:我不太擅长python,如果这是我看不到的一些简单问题,我很抱歉。

基本上我想创建一个登录和注册系统,将用户名和密码存储在一个文本文件中,然后我想加密该文件中的数据。我以前从未做过加密,所以我从网上获取了登录和注册系统的代码来测试和试用。我遇到了很多以前从未见过的错误,所以我只需要一些帮助。我还没有完成解密(如果这很重要的话)。抱歉,如果我粘贴太多,我只是不知道如何解决这个问题。加密部分是 def Encryption(): 我在 def FSSignup(): 中实现它。

from cryptography.fernet import Fernet
from tkinter import *
import os

creds = 'tempfile.temp' #

def Signup():
    global pwordE
    global nameE
    global roots

    roots = Tk()
    roots.title('Signup')
    intruction = Label(roots, text='Please Enter new Credidentials\n')
    intruction.grid(row=0, column=0, sticky=E)

    nameL = Label(roots, text='New Username: ')
    pwordL = Label(roots, text='New Password: ')
    nameL.grid(row=1, column=0, sticky=W)
    pwordL.grid(row=2, column=0, sticky=W)

    nameE = Entry(roots)
    pwordE = Entry(roots, show='*')
    nameE.grid(row=1, column=1)
    pwordE.grid(row=2, column=1)

    signupButton = Button(roots, text='Signup', command=FSSignup)
    signupButton.grid(columnspan=2, sticky=W)
    roots.mainloop()

def Encryption():
    file = open('Encryption.txt', 'rb' )
    key = file.read()
    file.close()

    with open('tempfile.temp', 'rb') as f:
        data = f.read()

    fernet = Fernet(key)
    encrypted = fernet.encrypt(data)

    with open('tempfile.temp.encrypted', 'wb') as f:
        f.write(encrypted)

def FSSignup():
    with open(creds, 'w') as f:
        f.write(nameE.get())
        f.write('\n')
        f.write(pwordE.get())
        f.close()

    Encryption()
    roots.destroy()
    Login()

def Login():
    global nameEL
    global pwordEL
    global rootA

    rootA = Tk()
    rootA.title('Login')

    intruction = Label(rootA, text='Please Login\n')
    intruction.grid(sticky=E)

    nameL = Label(rootA, text='Username: ')
    pwordL = Label(rootA, text='Password: ')
    nameL.grid(row=1, sticky=W)
    pwordL.grid(row=2, sticky=W)

    nameEL = Entry(rootA)
    pwordEL = Entry(rootA, show='*')
    nameEL.grid(row=1, column=1)
    pwordEL.grid(row=2, column=1)

    loginB = Button(rootA, text='Login', command=CheckLogin)
    loginB.grid(columnspan=2, sticky=W)

    rmuser = Button(rootA, text='Delete User', fg='red', command=DelUser)
    rmuser.grid(columnspan=2, sticky=W)
    rootA.mainloop()

def CheckLogin():
    with open(creds) as f:
        data = f.readlines()
        uname = data[0].rstrip()
        pword = data[1].rstrip()

    if nameEL.get() == uname and pwordEL.get() == pword:
        r = Tk()
        r.title(':D')
        r.geometry('150x50')
        rlbl = Label(r, text='\n[+] Logged In')
        rlbl.pack()
        r.mainloop()
    else:
        r = Tk()
        r.title('D:')
        r.geometry('150x50')
        rlbl = Label(r, text='\n[!] Invalid Login')
        rlbl.pack()
        r.mainloop()

def DelUser():
    os.remove(creds)
    rootA.destroy()
    Signup()

if os.path.isfile(creds):
    Login()
else: 
    Signup()

以下是我不知道的错误。

Tkinter 回调中的异常:

回溯(最后一次调用):文件“C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\tkinter__init__.py”,第 1702 行,调用 返回 self.func(*args)

FSSignup Encryption() 中的文件“C:\Users\admin\Desktop\Py1A\SignUpSystem\Thing123.py”,第 52 行

文件“C:\Users\admin\Desktop\Py1A\SignUpSystem\Thing123.py”,第 39 行,在 Encryption fernet = Fernet(key)

文件“C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\site-packages\cryptography\fernet.py”,第 35 行,在init key = base64.urlsafe_b64decode(key)

文件“C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\base64.py”,第 133 行,在 urlsafe_b64decode 返回 b64decode(s)

文件“C:\Users\admin\AppData\Local\Programs\Python\Python37-32\lib\base64.py”,第 87 行,在 b64decode 返回 binascii.a2b_base64(s)

binascii.Error:不正确的填充

这发生在我注册后,它会尝试加密新的用户名和密码。

标签: python

解决方案


您的 Fernet 密钥似乎有问题。你的Encryption.txt文件内容是什么?

这是引发错误的行:

fernet = Fernet(key)

key正在从 Encryption.txt 读取,我怀疑它是无效的。

要检查这个假设是否正确,只需将行替换为:

fernet = Fernet.generate_key()

如果一切正常,则文件 Encryption.txt 中的密钥(以字节为单位)不正确。您可以生成一个新密钥Fernet.generate_key()并将其放入其中。

>>> key = Fernet.generate_key()
>>> key
b'ZmDfcTF7_60GrrY167zsiPd67pEvs0aGOv2oasOM1Pg='

正如 Hans 在评论中指出的那样,您可能正试图以二进制文件打开文件,而它只是一个文本文件。b要检查这是否是错误,请通过删除from将文件简单地作为文本文件读取rb,如下所示:

file = open('Encryption.txt', 'r')

推荐阅读