python密碼學列置換密碼學習
列置換密碼
參考教材:《現(xiàn)代密碼學教程》P46 3.1.1
過程
加密過程
- 將明文p以設(shè)定的固定分組寬度m按行寫出,即每行有m個字符;若明文長度不是m的整數(shù)倍,則不足部分用雙方約定的方式填充,如雙方約定用空格代替空缺處字符,不妨設(shè)最后得字符矩陣[Mp]n×m
- 按1,2…,m的某一置換σ交換列的位置次序得字符矩陣[Mp]n×m
- 把矩陣按[Mp]n×m列的順序依次讀出得密文序列c。
解密過程
- 將密文c以分組寬度n按列寫出得到字符矩陣[Mp]n×m
- 按加密過程用的置換σ的逆置換σ-1交換列的位置次序得字符矩陣[Mp]n×m
- 把矩陣[Mp]n×m按1,2…,n行的順序依次讀出得明文p
說明
以例3.2為例

σ=(143)(56)即每個括號里部分輪著相對應(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]) #解決最后一個的問題
antiKey[int(s[i][0])]=int(s[i][-1])
temp.append(int(s[i][-1]))
當然,這兒σ=(143)(56)中沒有2,因為2對應(yīng)他自己即
2→2
所以要再單獨表示
sameKey=lenKey-set(temp) #找到?jīng)]有變化的密鑰
for i in sameKey:
Key[i]=i
antiKey[i]=i
而加密的時候,便是把明文先變?yōu)榫仃?,載根據(jù)密鑰進行轉(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)} #密鑰長度
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]) #解決最后一個的問題
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) #末尾補齊
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密碼學列置換密碼學習的詳細內(nèi)容,更多關(guān)于python密碼學列置換密碼的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
對Python中TKinter模塊中的Label組件實例詳解
今天小編就為大家分享一篇對Python中TKinter模塊中的Label組件實例詳解,具有很好的價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Python opencv實現(xiàn)人眼/人臉識別以及實時打碼處理
這篇文章主要為大家詳細介紹了Python opencv實現(xiàn)人眼、人臉識別,以及實時打碼處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04
Python基于HOG+SVM/RF/DT等模型實現(xiàn)目標人行檢測功能
這篇文章主要介紹了Python基于HOG+SVM/RF/DT等模型實現(xiàn)目標檢測[行人檢測],今天這里并不是說要做出怎樣的效果,而是基于HOG+SVM來實踐機器學習檢測的流程,需要的朋友可以參考下2022-06-06
django數(shù)據(jù)模型中null和blank的區(qū)別說明
這篇文章主要介紹了django數(shù)據(jù)模型中null和blank的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
python“靜態(tài)”變量、實例變量與本地變量的聲明示例
這篇文章主要給大家介紹了關(guān)于python“靜態(tài)”變量、實例變量與本地變量的聲明的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11

