错误- encrypt() ....位置参数:`data`

Error- encrypt() .... positional argument : `data`

所以我一直试图制作一个编码器和解码器只是为了好玩。因为我是 python 的新手,所以我通常坐下来尝试自己调试代码,但似乎这很难。希望得到一些帮助 :).

Error =
ValueError: Fernet key must be 32 url-safe base64-encoded bytes.

from cryptography.fernet import Fernet as dpsisbad


question1 = input("Do You Have A Key? (yes - y and no - n)\n")
if question1 == "y":
    key = input("Enter Your Key Here \n")
    print(key)
else:
    key = dpsisbad.generate_key() 
    print("Please Keep this Key Safely.\n")
    print(key)
dpsstalks = dpsisbad(key)
question2 = input("Do You Want to Encode Or Decode The Message? (Encode = e and Decode = d)\n")


if question2 == "e":
    gg = input("Enter the text you want to encode. \n")
    encoded_text = gg.encode()
    token = dpsstalks.encrypt(encoded_text)
    print(token)
else:
    text1 = input("Enter the the encrypted text. \n")
    token = dpsstalks.decrypt(text1)
    print(token)


我 运行 前段时间遇到过类似的问题。您的代码几乎是正确的,问题是您没有考虑到这样一个事实,即在 python 中,方法 input() 只接受字符串作为输入(因此当您在输入中写入 b'abcd' 时,它将采用整个字符串作为一个字符串,它会忽略 b'',因为它会认为它是字符串的一部分)。出于这个原因,在打印出密钥和令牌时都必须对其进行解码,并且必须在 input() 方法中对它们进行编码,代码应如下所示:

from cryptography.fernet import Fernet as dpsisbad


question1 = input("Do You Have A Key? (yes - y and no - n)\n")
if question1 == "y":
    key = input("Enter Your Key Here \n").encode()
    print(key.decode())
else:
    key = dpsisbad.generate_key() 
    print("Please Keep this Key Safely.\n")
    print(key.decode())
dpsstalks = dpsisbad(key)


while True:
    question2 = input("Do You Want to Encode Or Decode The Message? (Encode = e, Decode = d, quit = q)\n")
    if question2 == "e":
        gg = input("Enter the text you want to encode. \n")
        encoded_text = gg.encode()
        token = dpsstalks.encrypt(encoded_text)
        print(token.decode())
    elif question2 == "d":
        text1 = input("Enter the the encrypted text. \n").encode()
        token = dpsstalks.decrypt(text1)
        print(token.decode())
    elif question2 in ("q", "exit", "quit"):
        break

while 和 last elif 并不是真正需要的,我添加它们只是为了更容易测试并且不必每次都重新启动程序。 抱歉我的英语不好,但我不是母语人士。 如果我没说清楚。

编辑: 在输出中你也可以做这样的事情:

str(token)[2 : -1]

它实际上在做什么,它是将令牌转换为字符串并删除前两个字符 (b') 和最后一个字符 ('),但我不会这样做,因为它的工作量并不大正确的方法,无论如何我都会向你说明,因为它可能对你有用(如果只是修改字符串)。