凯撒密码

凯撒密码(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 补充


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 0x01 目录 常见编码: ASCII编码 Base64/32/16编码 shellcode编码 Quoted-p...
    H0f_9阅读 12,647评论 2 17
  • CTF中那些脑洞大开的编码和加密 0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问...
    查无此人asdasd阅读 5,970评论 0 19
  • 介绍 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数...
    Blizzard_liu阅读 3,113评论 0 1
  • 简介 凯撒密码(Caesar's code)作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思...
    Co_zy阅读 11,318评论 0 0
  • 知乎有一个求助题, 破译密码的 当然了, 根据普通人定律, 小孩子喜欢用这种方式表白... 链接在此 https:...
    michaeljacc阅读 1,719评论 0 0