首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >凯撒密码加密/解密工具

凯撒密码加密/解密工具
EN

Code Review用户
提问于 2017-07-12 20:09:22
回答 1查看 149关注 0票数 3

目前,我正在学习Python,我制作了这个脚本来锻炼我的技能。因为这是我的第一批程序之一,我希望得到一些反馈和提示,比如更多的组织、更少的代码行或更多的优化,任何我可以改进的东西。

代码语言:javascript
复制
print "Do you want to encrypt or decrypt the message (e/d)"
action = raw_input("> ")
while action != "e" and action != "d":
    action = raw_input( "(e/d): ")

abc_l_e = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
abc_u_e = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
abc_l_d = "zyxwvutsrqponmlkjihgfedcbazyxwvutsrqponmlkjihgfedcba"
abc_u_d = "ZYXWVUTSRQPONMLKJIHGFEDCBAZYXWVUTSRQPONMLKJIHGFEDCBA"
chars = "!\"#$%&'()*+-'-./:;<=>?@[]^_{}|~1234567890"

if action == "e":
    print "\nEnter the message to encrypt"
    message = raw_input("> ")

    print "\nEnter the key"
    try:
        key = input("> ")
        while not (key >= 1 and key <= 26):
            print "Number not in range (1-26). Try again"
            key = input("> ")
    except:
        print "That's not a correct integer. Try again."
        exit()

    e_message = ""
    for char in message:
        if char in abc_l_e:
            e_message += abc_l_e[(abc_l_e.index(char) + key)]
        if char in abc_u_e:
            e_message += abc_u_e[(abc_u_e.index(char) + key)]
        elif char == " ":
            e_message += " "
        elif char in chars:
            e_message += char
    print "Your encrypted message is:\n", e_message

elif action == "d":
    print "\nEnter the message to decrypt"
    message = raw_input("> ")
    print "\nEnter the key (enter \"n\" if you don't know)"
    try:
        key = raw_input("> ")
        if key != "n":
            while not (int(key) >= 1 and int(key) <= 26):
                print "Number not in range (1-26). Try again"
                key = input("> ") 
    except:
        print "That's not a correct integer nor \"n\". Try again."
        exit()

    d_message = ""
    if key != "n":
        key = int(key)  
        for char in message:
            if char in abc_l_d:         
                d_message += abc_l_d[(abc_l_d.index(char) + key)]
            elif char in abc_u_d:
                d_message += abc_u_d[(abc_u_d.index(char) + key)]
            elif char == " ":
                d_message += char
            elif char in chars:
                d_message += char
        print "Your decrypted message is:\n", d_message

    if key == "n":
        results = []
        for turn in range(1,26):
            d_message = ""
            for char in message:
                if char in abc_l_d:
                    d_message += abc_l_d[(abc_l_d.index(char) + turn)]
                elif char in abc_u_d:   
                    d_message += abc_u_d[(abc_u_d.index(char) + turn)]
                elif char == " ":
                    d_message += char
                elif char in chars:
                    d_message += char
            results.append(d_message)

        print "\nYour decrypted message is between one of the following:"
        for result in results:
            print "%d." % (results.index(result) + 1), result
EN

回答 1

Code Review用户

发布于 2017-07-12 20:27:10

  • 与其提示输入,几乎所有shell脚本(包括此脚本)都将通过接受静态输入(动作和键)作为参数,然后将标准输入读取到EOF以生成输出,从而得到改进。为此,您将需要一个main方法,它只是编排参数解析,并将结果值传递给执行实际替换的函数或方法。这使得以一种常见的方式将脚本与其他命令组合起来非常容易。argparse非常适合这一点。
  • 加密和解密只是将字符左转右移的问题。您可以使用这些信息将代码减半。
  • 蛮力法应该通过运行一个函数26次来实现。
  • 一般来说,代码应该被分解成函数,直到任何地方都没有明显的重复。这将极大地简化除了输入处理之外的所有内容,这意味着脚本中有趣的部分最终应该是三行。
  • 您应该使用一次只处理一行输入,这样即使是巨大的输入也会导致小内存的使用。
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/169098

复制
相关文章

相似问题

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