【问题标题】:Encryption functions in python [closed]python中的加密函数[关闭]
【发布时间】:2021-02-05 17:04:53
【问题描述】:

我在 python 中制作了这个程序,它可以加密和解密您输入到 Tkinter 滚动文本框中的字符串。加密由 13 个字符组成,例如“A”是“N”,“B”是“O”等等。这个程序不做的一件事是包括数字和特殊符号,如 ($ & ^ *) 以及更多。我想在 ASCII 表中包含所有可显示的字符,从空格“”开始到右大括号 }。

到目前为止,这是我的程序:

from tkinter import *
from tkinter.scrolledtext import *
root = Tk()
canvas = Canvas(root, width=800, height=600)

这是我目前拥有的加密和解密功能(这很可能是我需要更改的地方):

def encrypt_symbols(s):
    s = s.upper()
    output = ""
    for ch in s:
        if ch != " ":
            num = ord(ch) + 13
            if num > 90:
                num = num - 26
            output = output + chr(num)
        else:
            output = output + " "
    return output

def decrypt_symbols(s):
    s = s.upper()
    output = ""
    for ch in s:
        if ch != " ":
            num = ord(ch) - 13
            if num < 65:
                num = num + 26
            output = output + chr(num)
        else:
            output = output + " "
    return output

这部分只是 Tkinter 函数(它们与我的问题无关......我认为 :D):

label_plain = Label(root, text = "Plain Text")
label_encrypt = Label(root, text = "Encrypted Text")
label_plain.grid(row=0, column=0, padx=10, pady=10)
label_encrypt.grid(row=0, column=2, padx=10, pady=10)
textbox_plain = ScrolledText(root, width=30, height = 10,
                         bg = "#DDFFDD")
textbox_encrypt = ScrolledText(root, width=30, height = 10,
                           bg = "#DDDDFF")
textbox_plain.grid(row=1, column=0, padx=10, pady=10)
textbox_encrypt.grid(row=1, column=2, padx=10, pady=10)

这里是加密/解密过程的其他部分(我很确定它们不是我的问题的一部分):

def encrypt():
    plain = textbox_plain.get(1.0, "end-1c")
    e = encrypt_symbols(plain)
    textbox_encrypt.delete(1.0, "end")
    textbox_encrypt.insert(1.0, e)

def decrypt():
    e = textbox_encrypt.get(1.0, "end-1c")
    d = decrypt_symbols(e)
    textbox_plain.delete(1.0, "end")
    textbox_plain.insert(1.0, d)

frame1 = Frame(root)
frame1.grid(row=1, column=1)
be = Button(frame1, text = "Encrypt >>", command = encrypt)
bd = Button(frame1, text="<< Decrypt", command = decrypt)
be.grid(row = 0, column = 0, padx = 10, pady = 10)
bd.grid(row = 1, column = 0, padx = 10, pady = 10)

我该怎么办?我不认为这是一个复杂的修复,但我不知道如何去做......

您可以随意复制粘贴并自己弄乱程序!

谢谢!

【问题讨论】:

  • 如果您包含其他 ASCII 字符,您将如何对字母表后半部分的字符进行编码?您会像在正常的 ROT13 中一样在 Z 之后回绕 A,还是可以将字母也编码为数字或标点字符?
  • @tobias_k 好问题 xD 我认为这些符号只会分配给其他符号,而不是字符
  • 请从intro tour 重复on topichow to ask。 “告诉我如何解决这个编码问题”不是堆栈溢出问题。我们希望您做出诚实的尝试,然后然后就您的算法或技术提出一个具体的问题。这不应该是一个程序设计讨论板。

标签: python encryption ascii


【解决方案1】:

它的工作方式基本上和你现在做的一样,你只需要调整你的字符范围来加密。此外,使用模数可能会更容易一些,您可以为两个方向定义一个通用函数。

def shift(char, amount, low, high):
    return chr((ord(char) - low + amount) % high + low)

def encrypt_symbols(s):
    return ''.join(shift(c, 13, 32, 126) for c in s)

def decrypt_symbols(s):
    return ''.join(shift(c, -13, 32, 126) for c in s)

a = "Shift me by 13 chars, please!"
b = encrypt_symbols(a)
c = decrypt_symbols(b)
print(b)
# `uvs-zr-o->@-pun9-}yrnr.
print(c == a)
# True

请注意,这会将字符转换为不同的“类”,例如字母转数字,或标点转字母。如果您希望角色留在各自的班级,这将涉及更多。

【讨论】:

    【解决方案2】:

    您可以使用编解码器库来加密/解密'

    from codecs import *
    
    >>> encode('Hello World!', 'rot13')
    'Uryyb Jbeyq!'
    
    >>> decode('Uryyb Jbeyq!', 'rot13')
    'Hello World!'
    

    【讨论】:

    • 那太好了,谢谢。但在这种情况下,我需要按照我在上面的方式专门做这件事。不过感谢您的回答!
    • OP 明确表示他们也想编码空间或! 之类的东西,大腿rot13 显然没有。
    猜你喜欢
    • 2014-11-27
    • 2021-03-04
    • 2021-11-19
    • 2022-01-19
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多