凱撒密碼(Ceasar cipher) 相傳在公元前100年左右,古羅馬著名的將軍尤利烏斯-凱撒與其他將領(lǐng)之間的通信,曾使用此加密算法加密。
0x00 凱撒密碼原理
1. 加密原理
凱撒加密其實(shí)是通過將明文中每個(gè)字符属韧,按照字符表中順序,全部后移K(K為密鑰蛤吓,K<字符表總數(shù))位宵喂,得到新的字符,即密文会傲。
2. 解密原理
解密锅棕,其實(shí)也就是加密的反過程,凱撒解密將密文中每個(gè)字符淌山,按照字符表中順序裸燎,全部前移N(加密是后移幾位,解密就前移幾位)位泼疑,得到新的字符即為明文德绿。
3. 注意
- 字符表中每個(gè)字符必須唯一,字符表中不能同時(shí)存在兩個(gè)或者兩個(gè)以上相同的字符退渗。
- 密鑰的范圍: 0<密鑰<字符表總數(shù)移稳。
0x01 以數(shù)字加密解密舉例
1. 基本信息
- 明文:
5201314
- 字符表:
1234567890
字母表.png
- 密鑰:
N=5 #前移5位
2. 加密方法
- 假設(shè):
明文字符所在位置為x,字符表總數(shù)為n個(gè)会油,密鑰為k(0<k<n),最終得到的密文字符所在位置為y个粱。
m[x]:表示明文字符位置為x的字符
p[y]:表示密文字符位置為y的字符
- 計(jì)算方法:
y=(x+k)%n
m[x]-->p[y]
-
圖解推導(dǎo)
推導(dǎo)過程.png
3. 解密方法
- 假設(shè):
明文字符所在位置為x,字符表總數(shù)為n個(gè)翻翩,密鑰為k(0<k<n),密文字符所在位置為y都许。
m[x]:表示明文字符位置為x的字符
p[y]:表示密文字符位置為y的字符
- 計(jì)算方法:
x=(y+n-k)%n
p[x]-->m[y]
-
圖解推導(dǎo)
解密過程與加密相反稻薇,此不在詳細(xì)描述。
0x02 程序?qū)崿F(xiàn)
1. Python代碼
此Python代碼未包含異常處理機(jī)制胶征。
#coding:utf-8
#explain: 凱撒密碼
#python2.7.10
"""
Ascii字符表
ascii字符范圍為[32-126],共95個(gè)字符,key的范圍[1-94]塞椎。
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
數(shù)字表
共10個(gè)字符,key的范圍為[1,9]
字母順序: 1234567890
字母表
共26個(gè)字符睛低,key的范圍為[1,25]
abcdefghijklmnopqrstuvwxyz
"""
#制作字符表函數(shù)
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":
#數(shù)字表
number="1234567890"
return number
else:
#字母表
letter=""
for i in range(97,123):
letter=letter+chr(i)
return letter
#凱撒加密函數(shù)
def CaesarEncryption(express,key,dicttable):
#變量定義
dt=dicttable #字符表
dt_n=len(dicttable) #字符表總字符數(shù)
m=express #明文
m_n=len(express) #明文字符數(shù)
k=key #密鑰
p="" #密文
#明文轉(zhuǎn)換密文過程
for i in range(0,m_n):
temp=(dt.find(m[i])+k)%dt_n #計(jì)算明文轉(zhuǎn)換密文后,密文字符的位置
p=p+dt[temp] #根據(jù)密文字符在字符表中位置暇昂,輸出密文字符
return p
#凱撒解密函數(shù)
def CaesarDecrypt(ciphertext,key,dicttable):
#變量定義
dt=dicttable #字符表
dt_n=len(dicttable) #字符表總字符數(shù)
p=ciphertext #密文
p_n=len(ciphertext) #密文字符數(shù)
k=key #密鑰
m="" #明文
#密文轉(zhuǎn)換為明文過程
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 #設(shè)置密鑰
print "明文:"+express
temp1=CaesarEncryption(express,key,dt) #調(diào)用凱撒加密函數(shù)
print "密文:"+temp1
temp2=CaesarDecrypt(temp1,key,dt) #調(diào)用凱撒解密函數(shù)
print "明文:"+temp2
2. 實(shí)現(xiàn)效果
python實(shí)現(xiàn)效果.png
0x03 補(bǔ)充
由于本人能力有限伴嗡,文中有可能出現(xiàn)錯(cuò)誤急波、不足之處,歡迎各位讀者指正瘪校。