零基礎程式設計——密碼學實戰篇-古典加密演算法加密解密破解-上篇

摘要

書接前文:

1-《零基礎程式設計——Python基礎》

2-《零基礎程式設計——密碼學基礎理論篇》

前面我們分享了密碼學的基礎理論篇,從摩斯密碼切入,逐個分析了凱撒加密法、換位加密法、數乘加密法、仿射加密、簡單替代、多表替代、對稱加密、非對稱加密RSA加密法等等。本篇繼續分享實際使用實戰。針對古典加密演算法進行加密解密,學會對明文進行Python程式設計加密、解密,以及破解密碼實戰。

零基礎程式設計——密碼學實戰篇-古典加密演算法加密解密破解-上篇

內容

1-凱撒加密法 程式設計實戰2-反轉加密法 程式設計實戰3-換位加密法 程式設計實戰4-數乘加密法 程式設計實戰0-Python cryptography 庫安裝針對密碼學的基礎加密演算法,其實自己寫也可以,不過為了不浪費時間,充分利用現有的資源,站在巨人的肩膀上學習。我們使用cryptographic、pycipher等庫#原始碼參考https://github。com/pyca/cryptography/tree/master/src/cryptographyhttps://github。com/jameslyons/pycipher#安裝使用pip install cryptographypip install pycipher#不懂使用的童鞋,請參考我們的-Python基礎篇章

0-Python cryptography 庫安裝

針對密碼學的基礎加密演算法,其實自己寫也可以,不過為了不浪費時間,充分利用現有的資源,站在巨人的肩膀上學習。

我們使用cryptographic、pycipher等庫

#原始碼參考https://github。com/pyca/cryptography/tree/master/src/cryptographyhttps://github。com/jameslyons/pycipher

#安裝使用pip install cryptographypip install pycipher#不懂使用的童鞋,請參考我們的-Python基礎篇章

1-凱撒加密法 程式設計實戰

原理

:(具體參考我們上一篇密碼學基礎理論篇)

零基礎程式設計——密碼學實戰篇-古典加密演算法加密解密破解-上篇

零基礎程式設計——密碼學實戰篇-古典加密演算法加密解密破解-上篇

實戰

def encode(string, shift): cipher = ‘’ for char in string: if char == ‘ ’: cipher = cipher + char elif char。isupper(): cipher = cipher + chr((ord(char) + shift - ord(‘A’)) % 26 + ord(‘A’)) else: cipher = cipher + chr((ord(char) + shift - ord(‘a’)) % 26 + ord(‘a’)) return cipherdef decode(text, s): result = “” for x in text: if(x == ‘ ’): result += “ ” elif(ord(x)-ord(‘A’)-s < 0): result += chr(ord(x)-s+26) else: result += chr(ord(x)-s) return resulttext = ‘Hello FreoStudio Welcome U ’print(‘明文:’+text)text = encode(text, 4) # 加密print(‘密文:’+text)decode(text, 4)

當我們不知道金鑰Key=4的情況下爆破:

for key in range(0, 26): print(‘Key=’+str(key)) text = decode(‘Lipps JvisWxyhms Aipgsqi Y’, key) print(text)#執行結果:Key=0Lipps JvisWxyhms Aipgsqi YKey=1Khoor IuhrVwxglr Zhofrph XKey=2Jgnnq HtgqUvwfkq Ygneqog WKey=3Ifmmp GsfpTuvejp Xfmdpnf VKey=4Hello FreoStudio Welcome UKey=5Gdkkn EqdnRstchn Vdkbnld TKey=6Fcjjm DpcmQrsbgm Ucjamkc SKey=7Ebiil CoblPqrafl Tbi`ljb RKey=8Dahhk BnakOpq`ek Sah_kia QKey=9C`ggj Am`jNop_dj R`g^jh` PKey=10B_ffi Zl_iMno^ci Q_f]ig_ OKey=11A^eeh Yk^hLmn]bh P^e\hf^ NKey=12Z]ddg Xj]gKlm\ag O]d[ge] MKey=13Y\ccf Wi\fJkl[`f N\cZfd\ LKey=14X[bbe Vh[eIjkZ_e M[bYec[ KKey=15WZaad UgZdHijY^d LZaXdbZ JKey=16VY``c TfYcGhiX]c KY`WcaY IKey=17UX__b SeXbFghW\b JX_Vb`X HKey=18TW^^a RdWaEfgV[a IW^Ua_W GKey=19SV]]` QcV`DefUZ` HV]T`^V FKey=20RU\\_ PbU_CdeTY_ GU\S_]U EKey=21QT[[^ OaT^BcdSX^ FT[R^\T DKey=22PSZZ] N`S]AbcRW] ESZQ][S CKey=23ORYY\ M_R\ZabQV\ DRYP\ZR BKey=24NQXX[ L^Q[Y`aPU[ CQXO[YQ AKey=25MPWWZ K]PZX_`OTZ BPWNZXP Z

一般情況下,我們明文字符集不止25個,像我們漢字常用的就有3千多個,那我們就需要進行爆破3千多個Key,但是爆破完了,我們怎麼知道哪一個是我們想要的Key?一個個看也不現實。

可以用字典進行檢測單詞有效性,Python可以使用enchant或者nltk庫來判斷單詞是否有效英語單詞,我們也可以自己下載一本英文單詞書(words。txt),進行逐個匹對:

def is_english_word(word): with open(“。/files/words。txt”) as word_file: english_words = set(word。strip()。lower() for word in word_file) return word。lower() in english_wordsis_english_word(‘hellX’)#執行結果:False

爆破

,獲取最佳金鑰Key

import tools#爆破凱撒加密的密文def caesar_cracking(msg,len): relKey =0 relCount =0 print(‘破解中,耐心等待。。。’) for key in range(0, len): print(key) text = caesar_decode(msg, key) count =0 for word in text。split(“ ”): #print(‘=====’+word) if tools。is_english_word(word): count+=1 if count > relCount: relCount = count relKey = key if relKey >=100:#如果正確率達到100個,可以任務是得到了金鑰 break print(‘破解完成。。。’) print(‘最佳金鑰為:key=’+str(relKey)) return relKey caesar_cracking(‘Lipps JvisWxyhms Aipgsqi Y’,26)#執行結果如下:

零基礎程式設計——密碼學實戰篇-古典加密演算法加密解密破解-上篇

2-反轉加密法 程式設計實戰

原理

:(具體參考我們上一篇密碼學基礎理論篇)

零基礎程式設計——密碼學實戰篇-古典加密演算法加密解密破解-上篇

實戰

# 反轉加密法#加密演算法與解密演算法一致def reverse_cipher(msg): i = len(msg) - 1 result = ‘’ # 儲存加反轉後的資訊 while i >= 0: result += msg[i] i = i - 1 print(“反轉為:”, result) return resultmessage = ‘This is program to explain reverse cipher。’text = reverse_cipher(message)#反轉加密reverse_cipher(text)#反轉再反轉得到明文

破解:反轉即可,關鍵是你不知道別人的密文是不是其中一個環節用了反轉

3-換位加密法 程式設計實戰

原理

:(具體參考我們上一篇密碼學基礎理論篇)

零基礎程式設計——密碼學實戰篇-古典加密演算法加密解密破解-上篇

行列轉換後按列號從新排序1、2、3、4列

實戰

# 換位加密法from pycipher import ColTrans#加密def transposition_encode(key, msg): return ColTrans(key)。encipher(msg)#解密def transposition_decode(key, msg): return ColTrans(key)。decipher(msg)text = transposition_encode(“21334”,“Hello FreoStudio Welcome U”)transposition_decode(“HELLO”,text)#pycipher ColTrans 換位加密具體演算法原始碼#我們站在巨人肩膀上,創新創造,不重複造輪子了https://github。com/freostudio/pycipher/tree/master/pycipher/columnartransposition。py

密碼分析

換位加密法通常稱之為列轉換加密法,行列轉置密碼,將明文按自定義列數換位。加密強度本身很弱,但通常和其他加密方法結合,例如替代加密法結合,ADFGVX密碼就是用換位加密大大增強安全性的。

怎麼破解呢,如果採用爆破去逐個嘗試,基本不可能,因為首先換位的列數可以無數個,而且列進行排序組合也很多,得到結果後還得校驗單詞正確性。一般的計算機基本難於爆破。

零基礎程式設計——密碼學實戰篇-古典加密演算法加密解密破解-上篇

基本長度9之後都很難逐個破解了

逐個破解無望,可以使用字典攻擊方法,通常加密Key是常用人名地名的,然後我們建立一個字典,逐個嘗試,提高效率。

4-數乘加密法 程式設計實戰

原理

:(具體參考我們上一篇密碼學基礎理論篇)

零基礎程式設計——密碼學實戰篇-古典加密演算法加密解密破解-上篇

實戰

# 數乘加密def multiplicative_encode(key,totol_num, text): result = ‘’ # 儲存加反轉後的資訊 for x in text: if(x == ‘ ’): result += “ ” else: offset = ord(x) - ord(‘A’) result +=chr(((key* offset ) % totol_num) + ord(‘A’)) return resultmultiplicative_encode(7,26,“ABCDEFG”)##輸出結果:# 數乘加密。。。‘AHOVCJQ’

5-總結

我們針對古典加密演算法的實戰,實戰是為了更好地掌握古典加密演算法的思想。

上篇- 1-凱撒加密法 程式設計實戰2-反轉加密法 程式設計實戰3-換位加密法 程式設計實戰4-數乘加密法 程式設計實戰下篇-5-仿射加密法6-簡單替代加密法7-維吉尼亞加密法——多表替代加密法8-一次一密加密法 one time pad cipher