请简要介绍一下Caesar加密思想。
答:Caesar是一种简单的替换加密技术。将明文中的字母通过移动一定的固定位数的偏移后替换为密文。如果k等于3,则在编码后的消息中,每个字母都会向前移动3位:a会被替换为d;b会被替换成e;依此类推。字母表末尾将回卷到字母表开头。于是,w会被替换为z, x会被替换为a。在解码消息的时候,每个字母会反方向移动同样的
实验环境:Python编程环境 |
截图显示你编写的函数
其中-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就是加密解密的密钥。