凯撒密码(Ceasar cipher) 相传在公元前100年左右,古罗马著名的将军尤利乌斯-凯撒与其他将领之间的通信,曾使用此加密算法加密。
0x00 凯撒密码原理
1. 加密原理
凯撒加密其实是通过将明文中每个字符,按照字符表中顺序,全部后移K(K为密钥,K<字符表总数)位,得到新的字符,即密文。
2. 解密原理
解密,其实也就是加密的反过程,凯撒解密将密文中每个字符,按照字符表中顺序,全部前移N(加密是后移几位,解密就前移几位)位,得到新的字符即为明文。
3. 注意
- 字符表中每个字符必须唯一,字符表中不能同时存在两个或者两个以上相同的字符。
- 密钥的范围: 0<密钥<字符表总数。
0x01 以数字加密解密举例
1. 基本信息
- 明文:
5201314
- 字符表:
1234567890
- 密钥:
N=5 #前移5位
2. 加密方法
- 假设:
明文字符所在位置为x,字符表总数为n个,密钥为k(0<k<n),最终得到的密文字符所在位置为y。
m[x]:表示明文字符位置为x的字符
p[y]:表示密文字符位置为y的字符
- 计算方法:
y=(x+k)%n
m[x]-->p[y]
-
图解推导
3. 解密方法
- 假设:
明文字符所在位置为x,字符表总数为n个,密钥为k(0<k<n),密文字符所在位置为y。
m[x]:表示明文字符位置为x的字符
p[y]:表示密文字符位置为y的字符
- 计算方法:
x=(y+n-k)%n
p[x]-->m[y]
-
图解推导
解密过程与加密相反,此不在详细描述。
0x02 程序实现
1. Python代码
此Python代码未包含异常处理机制。
#coding:utf-8
#explain: 凯撒密码
#python2.7.10
"""
Ascii字符表
ascii字符范围为[32-126],共95个字符,key的范围[1-94]。
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
数字表
共10个字符,key的范围为[1,9]
字母顺序: 1234567890
字母表
共26个字符,key的范围为[1,25]
abcdefghijklmnopqrstuvwxyz
"""
#制作字符表函数
def DictTable(choice):
if choice=="ascii":
#ascii字符表(包含Ascii所有打印字符,32到126)
ascii=""
for i in range(32,127):
ascii=ascii+chr(i)
return ascii
elif choice=="number":
#数字表
number="1234567890"
return number
else:
#字母表
letter=""
for i in range(97,123):
letter=letter+chr(i)
return letter
#凯撒加密函数
def CaesarEncryption(express,key,dicttable):
#变量定义
dt=dicttable #字符表
dt_n=len(dicttable) #字符表总字符数
m=express #明文
m_n=len(express) #明文字符数
k=key #密钥
p="" #密文
#明文转换密文过程
for i in range(0,m_n):
temp=(dt.find(m[i])+k)%dt_n #计算明文转换密文后,密文字符的位置
p=p+dt[temp] #根据密文字符在字符表中位置,输出密文字符
return p
#凯撒解密函数
def CaesarDecrypt(ciphertext,key,dicttable):
#变量定义
dt=dicttable #字符表
dt_n=len(dicttable) #字符表总字符数
p=ciphertext #密文
p_n=len(ciphertext) #密文字符数
k=key #密钥
m="" #明文
#密文转换为明文过程
for i in range(0,p_n):
temp=(dt.find(p[i])+dt_n-k)%dt_n
m=m+dt[temp]
return m
if __name__ == "__main__":
dt=DictTable("ascii") #选择字符表,此选择ascii字母表
express='''abcdefghijklmnopqrst''' #需要加解密的字符
key=6 #设置密钥
print "明文:"+express
temp1=CaesarEncryption(express,key,dt) #调用凯撒加密函数
print "密文:"+temp1
temp2=CaesarDecrypt(temp1,key,dt) #调用凯撒解密函数
print "明文:"+temp2
2. 实现效果
0x03 补充
由于本人能力有限,文中有可能出现错误、不足之处,欢迎各位读者指正。