凱撒密碼

凱撒密碼(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ò)誤急波、不足之處,歡迎各位讀者指正瘪校。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末澄暮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子阱扬,更是在濱河造成了極大的恐慌泣懊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件麻惶,死亡現(xiàn)場(chǎng)離奇詭異馍刮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窃蹋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門卡啰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人警没,你說我怎么就攤上這事匈辱。” “怎么了杀迹?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵亡脸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我树酪,道長(zhǎng)浅碾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任嗅回,我火速辦了婚禮及穗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绵载。我一直安慰自己埂陆,他們只是感情好苛白,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焚虱,像睡著了一般购裙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹃栽,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天躏率,我揣著相機(jī)與錄音,去河邊找鬼民鼓。 笑死薇芝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丰嘉。 我是一名探鬼主播夯到,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼饮亏!你這毒婦竟也來了耍贾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤路幸,失蹤者是張志新(化名)和其女友劉穎荐开,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體简肴,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晃听,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了着帽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杂伟。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖仍翰,靈堂內(nèi)的尸體忽然破棺而出赫粥,到底是詐尸還是另有隱情,我是刑警寧澤予借,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布越平,位于F島的核電站,受9級(jí)特大地震影響灵迫,放射性物質(zhì)發(fā)生泄漏秦叛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一瀑粥、第九天 我趴在偏房一處隱蔽的房頂上張望挣跋。 院中可真熱鬧,春花似錦狞换、人聲如沸避咆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽查库。三九已至路媚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間樊销,已是汗流浹背整慎。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留围苫,地道東北人裤园。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像剂府,于是被迫代替她去往敵國(guó)和親比然。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 0x01 目錄 常見編碼: ASCII編碼 Base64/32/16編碼 shellcode編碼 Quoted-p...
    H0f_9閱讀 12,716評(píng)論 2 17
  • CTF中那些腦洞大開的編碼和加密 0x00 前言 正文開始之前先閑扯幾句吧周循,玩CTF的小伙伴也許會(huì)遇到類似這樣的問...
    查無此人asdasd閱讀 5,985評(píng)論 0 19
  • 介紹 凱撒密碼作為一種最為古老的對(duì)稱加密體制,在古羅馬的時(shí)候都已經(jīng)很流行万俗,他的基本思想是:通過把字母移動(dòng)一定的位數(shù)...
    Blizzard_liu閱讀 3,133評(píng)論 0 1
  • 簡(jiǎn)介 凱撒密碼(Caesar's code)作為一種最為古老的對(duì)稱加密體制湾笛,在古羅馬的時(shí)候都已經(jīng)很流行,他的基本思...
    Co_zy閱讀 11,367評(píng)論 0 0
  • 知乎有一個(gè)求助題, 破譯密碼的 當(dāng)然了, 根據(jù)普通人定律, 小孩子喜歡用這種方式表白... 鏈接在此 https:...
    michaeljacc閱讀 1,724評(píng)論 0 0