列置换密码
列置換密碼
參考教材:《現(xiàn)代密碼學(xué)教程》P46 3.1.1
過程
加密過程
解密過程
說明
以例3.2為例
σ=(143)(56)即每個(gè)括號(hào)里部分輪著相對(duì)應(yīng)
1→4→3→1
5→6→5
這里我是用字典表示
當(dāng)然,這兒σ=(143)(56)中沒有2,因?yàn)?對(duì)應(yīng)他自己即
2→2
所以要再單獨(dú)表示
而加密的時(shí)候,便是把明文先變?yōu)榫仃?#xff0c;載根據(jù)密鑰進(jìn)行轉(zhuǎn)換
比如本題便將矩陣第一列轉(zhuǎn)換為第四列,第四列轉(zhuǎn)換為第三列,第三列轉(zhuǎn)換為第一列,以此類推
這里可以用生成式完成
完整代碼
'''列置換密碼 Auher:Jarrycow time:2020-04-17 ''' import reclass 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.__mKey={}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è)的問題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]=iantiKey[i]=iself.__key.append(Key)self.__key.append(antiKey)def enCode(self,p): #加密函數(shù)self.__apaMsg=pm=self.__mn=self.__nKey=self.__key[0]p=p.replace(' ','') #去除空格p+=' '*(m-len(p)%m) #末尾補(bǔ)齊n=len(p)//m #矩陣列數(shù)self.__n=nM=[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=Mreturn Mdef deCode(self,q):self.__apaMsg=pm=self.__mn=self.__nKey=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=Mreturn Mdef Print(self):print(self.__m,self.__n,self.__key,self.__apaMsg,self.__secMsg)if __name__=='__main__':m=6p="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總結(jié)
- 上一篇: 智能密码钥匙开发、USBKEY开发、智能
- 下一篇: 114啦网址导航1.13版如何修改LOG