python密碼學(xué)周期置換密碼學(xué)習(xí)
周期置換密碼
參考教材:《現(xiàn)代密碼學(xué)教程》P47 3.1.2
加密解密過程
周期置換密碼是將明文p串按固定長度m分組.然后對(duì)每組中的子串按1,2…,m的某個(gè)置換重新排列位置從而得到密文,其中密鑰σ包含分組長度信息。
解密時(shí)同樣對(duì)密文c按長度m分組,并按σ的逆置換σ-1把每組子串重新排列位置從而得到明文p。
以例3.3為例
和上次提及的列置換密碼類似
代碼
import re class timeCode: __key=[] # 密鑰 __apaMsg="" # 明文 __secMsg="" #密文 __lenKey=0 #密鑰長度 周期值 def getKey(self,s): # 密鑰形成函數(shù) Key={} antiKey={} s=re.split(r'[()]',s) #以()分界 while '' in s: # 消除'' s.remove('') temp=[] 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è)的問題 antiKey[int(s[i][0])]=int(s[i][-1]) temp.append(int(s[i][-1])) maxtemp=max(temp) #密鑰長度 self.__lenKey=maxtemp lenKey={i+1 for i in range(maxtemp)} 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 Key=self.__key[0] time=self.__lenKey p=p.replace(' ','') #去除空格 if len(p)%time != 0: p+=' '*(time-len(p)%time) #末尾補(bǔ)齊 n=len(p)//time M=[p[i*time:(i+1)*time] for i in range(n)] #分組生成 M=[M[i][Key[j+1]-1] for i in range(n) for j in range(time)] #矩陣轉(zhuǎn)換 M=''.join(M) #列表轉(zhuǎn)換為字符串 self.__secMsg=M return M def deCode(self,q): self.__apaMsg=p m=self.__lenKey n=len(q)//m 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.__key,self.__apaMsg,self.__secMsg,self.__lenKey) s='(15623)' p='State Key Laboratory of Networking and Switching' a=timeCode() a.getKey(s) q=a.enCode(p) a.deCode(q) a.Print()
以上就是python密碼學(xué)周期置換密碼學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于python密碼學(xué)周期置換密碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
利用For循環(huán)遍歷Python字典的三種方法實(shí)例
字典由多個(gè)鍵和其對(duì)應(yīng)的值構(gòu)成的鍵—值對(duì)組成,鍵和值中間以冒號(hào):隔開,項(xiàng)之間用逗號(hào)隔開,整個(gè)字典是由大括號(hào){}括起來的,下面這篇文章主要給大家介紹了關(guān)于如何利用For循環(huán)遍歷Python字典的三種方法,需要的朋友可以參考下2022-03-03全網(wǎng)最全python庫selenium自動(dòng)化使用詳細(xì)教程
這篇文章主要介紹了python庫selenium自動(dòng)化使用詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-01-01解決PyCharm的Python.exe已經(jīng)停止工作的問題
今天小編就為大家分享一篇解決PyCharm的Python.exe已經(jīng)停止工作的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11django admin實(shí)現(xiàn)動(dòng)態(tài)多選框表單的示例代碼
借助django-admin,可以快速得到CRUD界面,但若需要?jiǎng)?chuàng)建多選標(biāo)簽字段時(shí),需要對(duì)表單進(jìn)行調(diào)整,本文通過示例代碼給大家介紹django admin多選框表單的實(shí)現(xiàn)方法,感興趣的朋友跟隨小編一起看看吧2021-05-05matplotlib常見函數(shù)之plt.rcParams、matshow的使用(坐標(biāo)軸設(shè)置)
這篇文章主要介紹了matplotlib常見函數(shù)之plt.rcParams、matshow的使用(坐標(biāo)軸設(shè)置),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python利用代碼計(jì)算2個(gè)坐標(biāo)之間的距離
這篇文章主要介紹了Python利用代碼計(jì)算2個(gè)坐標(biāo)之間的距離,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08