【问题标题】:Python encryption function, what is wrong?Python加密函数,有什么问题?
【发布时间】:2017-08-02 01:48:09
【问题描述】:

我正在尝试在 python 中编写一个 Ascii 加密函数,其中输入和加密消息,只考虑字母(不是数字或符号)。

以下功能正在运行并正在使用中:

def code_char(c, key):
    return chr(ord(c)+int(key))

def isletter(c):
    if 65 <= ord(c) <= 90:
        return True
    elif 97 <= ord(c) <= 122:
        return True
    else:
        return False

def code_block(word,key):
    letters = list(word)
    keys = list(key)
    coded = []
    for letter, digit in zip(letters, keys):
        coded.append(code_char(letter, digit))
    return "".join(coded)

这是我目前所拥有的:

def encrypt(string, key):
    for character in string:
        if isletter(character):
            return code_block(string, key)
        else:
            print("Invalid Message or Key")

期待

Ujlw    ny  h   afeuiy  slaticji!!

但是得到了输出

Ujlw%oz(

不知道这是怎么回事???

只是一个愚蠢的学生,所以不要去火腿。

有人有什么想法吗?

【问题讨论】:

  • 我建议添加打印语句或使用调试器来查看您的代码在每一步都在做什么。
  • 您正在编写 return "".join(encryption) 而加密已初始化为空列表。因此,您会变得空白。
  • 在@Code-Apprentice 上方编辑
  • 那么我怎样才能在空列表中添加一些东西呢?我正在尝试将加密的消息添加到空列表中,以便返回。这是最好的方法吗? @KaushalKumarSingh
  • 您的意思是将code_block(string, key) 附加到encryption 吗?

标签: python python-3.x encryption ascii


【解决方案1】:

加密已初始化为空列表,其值从未更新。

加上上面的加密支持对字母以外的字符进行加密,所以不用检查是否是字母。

试试下面的

def code_char(c, key):
    return chr(ord(c)+int(key))

def isletter(c):
    if 65 <= ord(c) <= 90:
        return True
    elif 97 <= ord(c) <= 122:
        return True
    else:
        return False

def code_block(word,key):
    letters = list(word)
    keys = list(key)
    coded = []
    len_key = len(key)
    counter = 0
    for letter in word:
        if isletter(letter):
            coded.append(code_char(letter, key[counter]))
            counter = (counter + 1)%len_key
        else:
            coded.append(letter)

    return "".join(coded)

def encrypt(string, key):
    encrypted = []
    encrypted.append(code_block(string, key))
    return " ".join(encrypted)

print(encrypt("This is a secret message", "12345678"))

【讨论】:

  • 这给出了一个输出!但是,这不是我所期望的......无论如何我可以让函数不考虑感叹号,而只是将它们留在加密消息的末尾??
  • @SamKennethGordon 是的,看看编辑过的代码。它几乎与您的输出匹配。我把它留给你来解决,这样当 8 和 s 相加时,它就变成了。我可以这样做,但如果你自己尝试会更好。
  • 再次感谢您的帮助,请问加密功能是否可以保留空格和感叹号?
  • @SamKennethGordon 是的,我已经编辑了代码。请重新运行编辑后的代码。它将保留空格和感叹号。并且将与您的输出更匹配。
  • 非常感谢!你是天赐之物!我不知道如何实现 's -> key of 8 -> a ' 的东西?这与不平等有关吗?我觉得要实现它涉及很多数学......
【解决方案2】:

这就是我所看到的。

在这个函数中

def code_block(word,key):
    letters = list(word)
    keys = list(key)
    coded = []
    for letter, digit in zip(letters, keys):
        coded.append(code_char(letter, digit))
    return "".join(coded)

for 循环只能遍历较小列表的次数。例如,如果我有

list_1 = [1, 2, 3, 4, 5, 6]
list_2 = [111, 222, 333]
for i, j in zip(list_1, list_2)
    print (i, j)

我会得到

>>> (1, 111)
>>> (2, 222)
>>> (3, 333)

所以你必须传入一个与你的字符串长度相同的键。

我猜你的密钥字符串和Ujlw%oz(的长度一样

另一方面,您似乎只是在检查字符串的第一个字符是否为字符。而不是检查字符串中的所有字符实际上是字符。所以你最终会在你的代码块循环中使用你的函数code_char 转换空白。

def encrypt(string, key):
    for character in string:
        if isletter(character):
            return code_block(string, key)
        else:
            print("Invalid Message or Key")

所以,我想说重新考虑您的代码,以便检查字符串中的每个字符。大部分功能都在那里,只是需要调整。

其他注意事项,查看输入参数以及您发布的预期输出和接收输出会很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    相关资源
    最近更新 更多