900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 使用Python语言实现凯撒密码的加密和解密

使用Python语言实现凯撒密码的加密和解密

时间:2020-10-31 05:11:52

相关推荐

使用Python语言实现凯撒密码的加密和解密

使用Python语言实现凯撒密码的加密和解密

介绍

在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

扫盲:大写字母A至Z对应的十进制ASCII编码为65至90,小写字母a至z对应的十进制ASCII编码为97至122。

方法一

chr()函数用一个范围在range(256)内的(就是0~255)整数作参数,返回一个对应的字符。返回值是当前整数对应的ASCII字符。该函数的返回值为字符串形式,例如输入chr(90),输出为 ‘Z’ 。

ord()函数与chr()函数对应,输入ASCII字符表中字符的字符串形式,返回为其在字符表中的排序位次。例如输入ord(‘a’),输出为97。

加密

str=input("请输入明文:")n=int(input("请输入密钥:"))str_encrypt=""for letter in str:if letter==" ": #遇到空格选择不加密letter_encrypt=" "else:letter_encrypt=chr((ord(letter)-ord("a") +n) %26 +ord("a"))str_encrypt += letter_encryptprint("密文为:",str_encrypt)

解密

str=input("请输入密文:")n=int(input("请输入密钥:"))str_decrypt=""for word in str:if word==" ": #遇到空格选择不解密word_decrypt=" "else:word_decrypt=chr((ord(word)-ord("A") -n) %26 +ord("A"))str_decrypt = str_decrypt+word_decryptprint("明文为:",str_decrypt)

高阶

我们嵌入一个多分支结构,使得程序能够同时判定大小写字母,这里只列出加密代码,解密只需将“+n”替换为“-n”即可。

str=input("请输入明文:")n=int(input("请输入密钥:"))str_encrypt=""for letter in str:if "a"<=letter<="z":str_encrypt +=chr((ord(letter)-ord("a") +n) %26 +ord("a"))elif "A"<=letter<="Z":str_encrypt +=chr((ord(letter)-ord("A") +n) %26 +ord("A"))else:str_encrypt += letterprint("密文为:",str_encrypt)

方法二

利用多分支结构在同一程序里执行大小写字母判定、加密、解密等命令。

str = input("请输入一段英文:")key = int(input("请输入密钥:"))enc = int(input("0 - 解密\n1 - 加密\n请选择 0 或者 1: "))str_enc = ""str_dec = ""if enc == 1: #加密for i in str: #用i进行遍历if i.isupper(): #isupper函数判断i是否为大写字母i_unicode = ord(i) #找到“i”对应的Unicode码i_index = ord(i) - ord("A") #计算字母“i”到A(起始)的间距new_index = (i_index + key) % 26new_unicode = new_index + ord("A")new_character = chr(new_unicode) #将Unicode码转换为字符str_enc += new_characterelif i.islower(): #如果“i”为小写字母i_unicode = ord(i)i_index = ord(i) - ord("a")new_index = (i_index + key) % 26new_unicode = new_index + ord("a")new_character = chr(new_unicode)str_enc = str_enc + new_characterelse: #数字或符号str_enc += i #直接返回“i”print("密文为:",str_enc)else: #解密for k in str:if k.isupper():k_unicode = ord(k)k_index = ord(k) - ord("A")new_index = (k_index - key) % 26new_unicode = new_index + ord("A")new_character = chr(new_unicode)str_dec = str_dec + new_characterelif k.islower():k_unicode = ord(k)k_index = ord(k) - ord("a")new_index = (k_index - key) % 26new_unicode = new_index + ord("a")new_character = chr(new_unicode)str_dec += new_character else:str_dec += kprint("明文为:",str_dec)

方法三

利用函数实现凯撒密码的加密与解密。

def encrypt(str, key):ciphertext=""for word in str: if word.isupper():ciphertext += chr((ord(word) - 65 + key) % 26 + 65)elif word.islower():ciphertext += chr((ord(word) - 97 + key) % 26 + 97)else:ciphertext = ciphertext + wordreturn ciphertextdef decrypt(str, key):plaintext=""for word in str: if word.isupper():plaintext += chr((ord(word) - 65 - key) % 26 + 65)elif word.islower():plaintext += chr((ord(word) - 97 - key) % 26 + 97)else:plaintext = plaintext + wordreturn plaintextoption = int(input("请选择0(解密)或1(加密): "))if option == 1:text1=input("请输入明文:")s1=int(input("请输入密钥:"))print("密文为:", encrypt(text1, s1))else:text2=input("请输入密文:")s2=int(input("请输入密钥:"))print("明文为:", decrypt(text2, s2))

方法四

通过函数使用其他算法进行加密,并且将空格与符号也进行加密。

def option():while True:print("请输入enc(加密)或dec(解密),退出请输入q")mode=input("选择:").lower()if mode in "enc dec q".split():return modeelse:print("请输入正确选项!")def getKey(mode):key=0while key<=0 or key>=26:try:key=int(input("请输入密钥(1-26):"))except:print("请输入正确密钥!")if mode=="dec":key=-key #对密钥进行变换return keydef getMessage(key):text=input("请输入一段英文:") message=""for i in text:num=ord(i)num=num+keyif i.isupper():if num>ord("Z"):num=num-26elif num<ord("A"):num=num+26elif i.islower():if num>ord("z"):num=num-26elif num<ord("a"):num=num+26message += chr(num)return messagemode = option()if mode == "q":print("欢迎下次使用!")elif mode == "enc":key=getKey(mode)str1=getMessage(key)print("密文为:",str1)elif mode == "dec":key=getKey(mode)str2=getMessage(key)print("明文为:",str2)

暴力破解凯撒密码方式一

LETTERS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"LETTERS1="ABCDEFGHIJKLMNOPQRSTUVWXYZ"LETTERS2="abcdefghijklmnopqrstuvwxyz"text=input("请输入密文:")for key in range(len(LETTERS)):str=""for i in text:if i in LETTERS:if i.isupper(): #密文字母为大写num = LETTERS1.find(i) #在字母里搜索到密文字符的位置num = num - keyif num<0:num = num + len(LETTERS1)str = str + LETTERS1[num] #将解密后字符追加到字符串末尾elif i.islower(): #密文字母为小写num = LETTERS2.find(i) #在字母里搜索到密文字符的位置num = num - keyif num<0:num = num + len(LETTERS2)str = str + LETTERS2[num] #将解密后字符追加到字符串末尾else:str = str + i #如果密文中内容不在字母里则不解密,直接追加print('第%d把钥匙的结果是%s' %(key, str)) #显示每一个可能的值

暴力破解凯撒密码方式二

def unlock(text):for i in text:if 65+key<=ord(text)<92 or 97+key<=ord(text)<123:text=chr(ord(text)-key)elif 65<=ord(text)<65+key or 97<=ord(text)<97+key:text=chr(ord(text)-key+26)else:text=textreturn texttext=input("请输入密文:")plaintext=""for key in range(1,27):for k in list(map(unlock,text)):plaintext=plaintext+kprint("第%d把钥匙的结果是%s"%(key,plaintext))plaintext=""

以上。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。