python密碼學(xué)列置換密碼學(xué)習(xí)
列置換密碼
參考教材:《現(xiàn)代密碼學(xué)教程》P46 3.1.1
過(guò)程
加密過(guò)程
- 將明文p以設(shè)定的固定分組寬度m按行寫(xiě)出,即每行有m個(gè)字符;若明文長(zhǎng)度不是m的整數(shù)倍,則不足部分用雙方約定的方式填充,如雙方約定用空格代替空缺處字符,不妨設(shè)最后得字符矩陣[Mp]n×m
- 按1,2…,m的某一置換σ交換列的位置次序得字符矩陣[Mp]n×m
- 把矩陣按[Mp]n×m列的順序依次讀出得密文序列c。
解密過(guò)程
- 將密文c以分組寬度n按列寫(xiě)出得到字符矩陣[Mp]n×m
- 按加密過(guò)程用的置換σ的逆置換σ-1交換列的位置次序得字符矩陣[Mp]n×m
- 把矩陣[Mp]n×m按1,2…,n行的順序依次讀出得明文p
說(shuō)明
以例3.2為例
σ=(143)(56)即每個(gè)括號(hào)里部分輪著相對(duì)應(yīng)
1→4→3→1
5→6→5
這里我是用字典表示
for i in range(len(s)): for j in range(len(s[i])-1): Key[int(s[i][j])]=int(s[i][j+1]) #密鑰字典 antiKey[int(s[i][j+1])]=int(s[i][j]) #反密鑰字典 Key[int(s[i][-1])]=int(s[i][0]) #解決最后一個(gè)的問(wèn)題 antiKey[int(s[i][0])]=int(s[i][-1]) temp.append(int(s[i][-1]))
當(dāng)然,這兒σ=(143)(56)中沒(méi)有2,因?yàn)?對(duì)應(yīng)他自己即
2→2
所以要再單獨(dú)表示
sameKey=lenKey-set(temp) #找到?jīng)]有變化的密鑰 for i in sameKey: Key[i]=i antiKey[i]=i
而加密的時(shí)候,便是把明文先變?yōu)榫仃?,載根據(jù)密鑰進(jìn)行轉(zhuǎn)換
比如本題便將矩陣第一列轉(zhuǎn)換為第四列,第四列轉(zhuǎn)換為第三列,第三列轉(zhuǎn)換為第一列,以此類推
這里可以用生成式完成
M=[M[i][Key[j+1]-1] for i in range(n) for j in range(m)] #矩陣轉(zhuǎn)換
完整代碼
'''列置換密碼 Auher:Jarrycow time:2020-04-17 ''' import re class colCode: __m=0 __n=0 __key=[] # 密鑰 __apaMsg="" # 明文 __secMsg="" #密文 def __init__(self,m): # 初始化,定義矩陣寬 self.__m=m __n=0 __key=[] __apaMsg="" __secMsg="" def getKey(self,s): # 密鑰形成函數(shù) m=self.__m Key={} antiKey={} s=re.split(r'[()]',s) #以()分界 while '' in s: # 消除'' s.remove('') temp=[] lenKey={i+1 for i in range(m)} #密鑰長(zhǎng)度 for i in range(len(s)): for j in range(len(s[i])-1): Key[int(s[i][j])]=int(s[i][j+1]) #密鑰字典 antiKey[int(s[i][j+1])]=int(s[i][j]) #反密鑰字典 temp.append(int(s[i][j])) #鑰匙收錄 Key[int(s[i][-1])]=int(s[i][0]) #解決最后一個(gè)的問(wèn)題 antiKey[int(s[i][0])]=int(s[i][-1]) temp.append(int(s[i][-1])) sameKey=lenKey-set(temp) #找到?jīng)]有變化的密鑰 for i in sameKey: Key[i]=i antiKey[i]=i self.__key.append(Key) self.__key.append(antiKey) def enCode(self,p): #加密函數(shù) self.__apaMsg=p m=self.__m n=self.__n Key=self.__key[0] p=p.replace(' ','') #去除空格 p+=' '*(m-len(p)%m) #末尾補(bǔ)齊 n=len(p)//m #矩陣列數(shù) self.__n=n M=[p[i*m:(i+1)*m] for i in range(n)] #矩陣生成 M=[M[i][Key[j+1]-1] for i in range(n) for j in range(m)] #矩陣轉(zhuǎn)換 M=''.join(M) #列表轉(zhuǎn)換為字符串 self.__secMsg=M return M def deCode(self,q): self.__apaMsg=p m=self.__m n=self.__n Key=self.__key[1] M=[q[i*m:(i+1)*m] for i in range(n)] M=[M[i][Key[j+1]-1] for i in range(n) for j in range(m)] M=''.join(M) self.__secMsg=M return M def Print(self): print(self.__m,self.__n,self.__key,self.__apaMsg,self.__secMsg) if __name__=='__main__': m=6 p="Beijing 2008 Olympic Games" s='(143)(56)' a=colCode(m) a.getKey(s) q=a.enCode(p) e=a.deCode(q) a.Print() def main(): pass
以上就是python密碼學(xué)列置換密碼學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于python密碼學(xué)列置換密碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
對(duì)Python中TKinter模塊中的Label組件實(shí)例詳解
今天小編就為大家分享一篇對(duì)Python中TKinter模塊中的Label組件實(shí)例詳解,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06Python opencv實(shí)現(xiàn)人眼/人臉識(shí)別以及實(shí)時(shí)打碼處理
這篇文章主要為大家詳細(xì)介紹了Python opencv實(shí)現(xiàn)人眼、人臉識(shí)別,以及實(shí)時(shí)打碼處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04深入淺析Python科學(xué)計(jì)算庫(kù)Scipy及安裝步驟
這篇文章主要介紹了Python科學(xué)計(jì)算庫(kù)—Scipy的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10Python實(shí)現(xiàn)的視頻播放器功能完整示例
這篇文章主要介紹了Python實(shí)現(xiàn)的視頻播放器功能,結(jié)合完整實(shí)例形式分析了Python基于pyglet庫(kù)實(shí)現(xiàn)視頻播放功能的相關(guān)操作技巧,需要的朋友可以參考下2018-02-02Python基于HOG+SVM/RF/DT等模型實(shí)現(xiàn)目標(biāo)人行檢測(cè)功能
這篇文章主要介紹了Python基于HOG+SVM/RF/DT等模型實(shí)現(xiàn)目標(biāo)檢測(cè)[行人檢測(cè)],今天這里并不是說(shuō)要做出怎樣的效果,而是基于HOG+SVM來(lái)實(shí)踐機(jī)器學(xué)習(xí)檢測(cè)的流程,需要的朋友可以參考下2022-06-06對(duì)Tensorflow中的矩陣運(yùn)算函數(shù)詳解
今天小編就為大家分享一篇對(duì)Tensorflow中的矩陣運(yùn)算函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07django數(shù)據(jù)模型中null和blank的區(qū)別說(shuō)明
這篇文章主要介紹了django數(shù)據(jù)模型中null和blank的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09python“靜態(tài)”變量、實(shí)例變量與本地變量的聲明示例
這篇文章主要給大家介紹了關(guān)于python“靜態(tài)”變量、實(shí)例變量與本地變量的聲明的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11