凯撒密码

96
溪边的墓志铭
2016.12.29 23:26* 字数 549

凯撒密码(Ceasar cipher) 相传在公元前100年左右,古罗马著名的将军尤利乌斯-凯撒与其他将领之间的通信,曾使用此加密算法加密。

0x00 凯撒密码原理


1. 加密原理

凯撒加密其实是通过将明文中每个字符,按照字符表中顺序,全部后移K(K为密钥,K<字符表总数)位,得到新的字符,即密文

2. 解密原理

解密,其实也就是加密的反过程,凯撒解密将密文中每个字符,按照字符表中顺序,全部前移N(加密是后移几位,解密就前移几位)位,得到新的字符即为明文

3. 注意

  • 字符表中每个字符必须唯一,字符表中不能同时存在两个或者两个以上相同的字符。
  • 密钥的范围: 0<密钥<字符表总数。

0x01 以数字加密解密举例


1. 基本信息

  • 明文:
5201314
  • 字符表:
1234567890
字母表.png
  • 密钥:
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]
  • 图解推导
    推导过程.png

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. 实现效果

python实现效果.png

0x03 补充


由于本人能力有限,文中有可能出现错误、不足之处,欢迎各位读者指正。

密码技术
Web note ad 1