密码学基础实验—Caesar加密

请简要介绍一下Caesar加密思想。

答:Caesar是一种简单的替换加密技术。将明文中的字母通过移动一定的固定位数的偏移后替换为密文。如果k等于3,则在编码后的消息中,每个字母都会向前移动3位:a会被替换为db会被替换成e;依此类推。字母表末尾将回卷到字母表开头。于是,w会被替换为z x会被替换为a。在解码消息的时候,每个字母会反方向移动同样的

 实验环境:Python编程环境

  1. 请按如下要求编写Caesar加密和解密的函数
  1. 加密函数: def EnCyper_Caesar(plainText,key),截图显示你编写的函数

  1. 解密函数:def DeCyper_Caesar(cipherText,key),截图显示你编写的函数

  1. Caesar加密比较简单,容易被暴力破解,请你编写一下Caesar加密的暴力破解函数: def BruteForce_Caesar(cipherText),要求如下:
  1. 不能在函数体里利用printf打印输出明文
  2. 函数应该返回一个list,其中包含所有可能的明文

截图显示你编写的函数

  1. 请按如下要求编写一个完整的Caesar加密的命令行工具,具体要求如下:
  1. 工具采用命令行格式
  2. 使用的格式应该为:python Caesar.py  [-f] -e|-d|-b [-k key] text

其中-e参数表明是加密功能,其后的text为明文

         -d参数表明是解密功能,其后的text为密文

         -k 参数为密钥

-b参数表明采用暴力破解,此时参数-k不用输入

-f 参数是可选项,如选择则表明对文件进行加密,文件名为后面的text,加密后的文件为”原文件”.crypt,解密后的文件为”原文件”

-h 打印帮助信息

           (3)注意如果用户输入参数不够,或者出错,打印提示信息

使用示例:

python  Caesar.py –e –k 3 abcde

将命令行送来的字符串”abcde”进行加密,并在屏幕输出密文,密钥为3

Python Caesar.py –d –k 3

将命令行送来的字符串”abcde”进行解密,并在屏幕输出明文,密钥为3

Python Caesar.py –b “abcde”

将命令行送来的加密字符串”abcde”进行暴力解密,并在屏幕输出明文

Python Caesar.py –f –e –k 3 m1.txt

将文件“m1.txt”中的内容进行加密,密钥为3,加密后的文件为”m1.crypt.txt”

Python Caesar.py –f –d –k 3 c1.crypt.txt

将文件“c1.crpyt.txt”中的内容进行解密,密钥为3,解密后的文件为”c1.txt”

Python Caesar.py  -f –b c1.crypt.txt

将文件c1.crypt.txt中的密文进行暴力破解,解密后明文输出到c1.plaintext.text中

Python Caesar.py –h

屏幕提示帮助信息,表明caesar工具的用法

请将你的完整程序复制到下方:

import argparse

orderlist='ABCDEFGHIJKLMNOPQRSTUVWXYZ';

def main():

    parser = argparse.ArgumentParser(description="Demo of argparse")

    parser.add_argument('-f','--file',help="file 文件",action='store_true')

    parser.add_argument('-e','--encrypt',help='参数表明是加密功能,其后的text为明文',action='store_true')

    parser.add_argument('-d','--dncrypt',help='参数表明是解密功能,其后的text为密文',action='store_true')

    parser.add_argument('-b','--baoli',help='参数表明采用暴力破解,此时参数-k不用输入',action='store_true')

    parser.add_argument('-k','--key',type=int,help='参数为密钥')

    parser.add_argument('text')

    args = parser.parse_args()

    print(args)

  

  

# 加密   -e参数表明是加密功能

def Encyper_Caesar(plainText, key):

    EnCyper = []

    length = len(plainText)

    for i in range(length):

        if ord(plainText[i]) >= 97 and ord(plainText[i]) <= 122:

            for j in range(26):

                if plainText[i] == alphabet[j]:

                    EnCyper.append(alphavent[(j + int(key)) % 26])

        elif ord(plainText[i]) >= 65 and ord(plainText[i]) <= 90:

            for j in range(26):

                if plainText[i] == alphavent[j]:

                    EnCyper.append(alphavent[(j + int(key)) % 26])

        else:

            print("输入的密文有问题!!!")

    x = "".join(EnCyper)

    return x

  

  

# 解码   -d参数表明是解密功能

def DeCyper_Caesar(cipherText, key):

    DeCyper = []

    length = len(cipherText)

    for i in range(length):

        if (ord(cipherText[i]) >= 97 and ord(cipherText[i]) <= 122):

            for j in range(26):

                if cipherText[i] == alphabet[j]:

                    DeCyper.append(alphabet[(j - int(key)) % 26])

        elif (ord(cipherText[i]) >= 65 and ord(cipherText[i]) <= 90):

            for j in range(26):

                if cipherText[i] == alphabet[j]:

                    DeCyper.append(alphabet[(j - int(key)) % 26])

    x = "".join(DeCyper)

    return x

  

#暴力破解

def BruteForce_Caesar(cipherText):

    List = []

    for i in range(26):

        List.append(Decrypt(cipherText, i))

    return List

  

  

# 主函数

def main(argv):

    # 如果sys.argv<=3只有三个参数指令输入的: -h 帮助方式; -b 暴力破解;

    if (len(sys.argv) <= 3):

        # 解说:帮助文档

        if (sys.argv[1] == "-h"):

            print("text为密文或明文  -d为解密  -e为加密  -b为暴力  -k为密钥  -f为写入文件")

            print("python Caesar.py  -d 密文 -k 密钥 <解密>")

            print("python Caesar.py  -e 明文 -k 密钥 <加密>")

            print("python Caesar.py  -b text <暴力>")

            print("python Caesar.py  -f 文件名 -k 密钥 <文本解密>")

  

        # 暴力破解

        elif (sys.argv[1] == "-b"):

            plainText = sys.argv[2]

            for key in range(0, 26):

                print(DeCyper_Caesar(plainText, key))

        else:

            print("输入格式不对,请输入-h(注意大小写)查看命令")

  

    elif (len(sys.argv) >= 4):

        # 解密

        if (sys.argv[1] == "-d" and sys.argv[3] == "-k"):

            print(DeCyper_Caesar(sys.argv[2], sys.argv[4]))

        # 加密

        elif (sys.argv[1] == "-e" and sys.argv[3] == "-k"):

            print(EnCyper_Caesar(sys.argv[2], sys.argv[4]))

  

        # <文本解密>  python Caesar.py  -f 文件名 -k 密钥 (-d,-e,-b)

        elif (sys.argv[1] == "-f" and sys.argv[3] == "-k"):

            if sys.argv[2].endswith('.txt'):

                with open(sys.argv[2], 'r') as f:

                    if (sys.argv[5] == "-d"):

                        with open(sys.argv[2][:-4] + '.crypt.txt', 'w') as f1:

                            f1.write(EnCyper_Caesar(f.read(), int(sys.argv[4])))

                    elif (sys.argv[5] == "-e"):

                        with open(sys.argv[2][:-4] + ".txt") as f2:

                            f2.write(DeCyper_Caesar(f.read(), int(sys.argv[4])))

                    else:

                        print("输入格式不对,请输入-h(注意大小写)查看命令")

        # 输入格式不对

        else:

            print("Caesar -e 明文 -k 密钥 加密")

            print("Caesar -d 密文 -k 密钥 解密")

            print("Caesar -b 密文 暴力破解")

            print("Caesar -f 文件名 -k 密钥 -d|-e|-b")

if __name__ =='__main__':

    main()

位数。偏移的位数k就是加密解密的密钥。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值