在密码学中,恺撒密码(英语: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_encrypt
print("密文为:",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_decrypt
print("明文为:",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 += letter
print("密文为:",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) % 26
new_unicode = new_index + ord("A")
new_character = chr(new_unicode) #将Unicode码转换为字符
str_enc += new_character
elif i.islower(): #如果“i”为小写字母
i_unicode = ord(i)
i_index = ord(i) - ord("a")
new_index = (i_index + key) % 26
new_unicode = new_index + ord("a")
new_character = chr(new_unicode)
str_enc = str_enc + new_character
else: #数字或符号
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) % 26
new_unicode = new_index + ord("A")
new_character = chr(new_unicode)
str_dec = str_dec + new_character
elif k.islower():
k_unicode = ord(k)
k_index = ord(k) - ord("a")
new_index = (k_index - key) % 26
new_unicode = new_index + ord("a")
new_character = chr(new_unicode)
str_dec += new_character
else:
str_dec += k
print("明文为:",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 + word
return ciphertext
def 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 + word
return plaintext
option = 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 mode
else:
print("请输入正确选项!")
def getKey(mode):
key=0
while key<=0 or key>=26:
try:
key=int(input("请输入密钥(1-26):"))
except:
print("请输入正确密钥!")
if mode=="dec":
key=-key #对密钥进行变换
return key
def getMessage(key):
text=input("请输入一段英文:")
message=""
for i in text:
num=ord(i)
num=num+key
if i.isupper():
if num>ord("Z"):
num=num-26
elif num<ord("A"):
num=num+26
elif i.islower():
if num>ord("z"):
num=num-26
elif num<ord("a"):
num=num+26
message += chr(num)
return message
mode = 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 - key
if num<0:
num = num + len(LETTERS1)
str = str + LETTERS1[num] #将解密后字符追加到字符串末尾
elif i.islower(): #密文字母为小写
num = LETTERS2.find(i) #在字母里搜索到密文字符的位置
num = num - key
if 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=text
return text
text=input("请输入密文:")
plaintext=""
for key in range(1,27):
for k in list(map(unlock,text)):
plaintext=plaintext+k
print("第%d把钥匙的结果是%s"%(key,plaintext))
plaintext=""