Python實現一個簡單的Feistel結構的密碼演算法
阿新 • • 發佈:2019-01-30
這是我們密碼學老師留的一個作業,她本來留的作業內容是仿照DES密碼設計一個密碼演算法,但第一次聽到這個作業時我的內心是崩潰的(冏rz),因為其實我並不太能理解DES演算法中P盒還有S盒設計的思想是什麼。。(也就是並不太能理解這些置換表為什麼要這麼設計)
但是我知道DES演算法是一種分組密碼,採用的是Feistel結構的呀!於是我就根據Feistel結構的設計思想設計了一個簡單的加密演算法。
Feistel結構最大的優點就是加密和解密過程可以使用完全相同的演算法,這就使得在實施的過程中,對編碼量和線路傳輸的要求就減少了幾乎一半。使用其結構的安全性主要在於選擇塊的大小,金鑰長度,迴圈次數,子金鑰生成演算法和輪函式複雜度。
我設計的演算法中,把字串的8個字元分為一組加密,每次加密時使用4個字元的字串作為金鑰(一個ASCII字元8個bit,所以4個字元應該就是32個bit了吧⊙▽⊙),加密演算法很簡單,就是把每個分組8個字元分為兩組,每組的字元按位與金鑰字元異或。
8個字元為一個分組,前4個字元為設為L0,後4個字元設為R0
即設L0=’aaaa’,R0=’bbbb’,key=’abcd’
加密演算法為
For i in (1 to 4)
L1[i]=L0[i] xor R0[i] xor key[i]
R1=L0
然後我用Python實現了上述加密,但是程式有一個小瑕疵,處理的明文字元數必須為8的整數倍,否則多出來的字元將不會處理。但這也無傷大雅啦,只是一些細節的處理而已。
可能我之前描述設計思想時講地並不是很好,所以我在這裡提供程式的完整程式碼,畢竟Linux之父Linus大神也說過“Talk is cheap. Show me the code”
# -*- coding: utf-8 -*- #每個分組8個字元,一個金鑰4個字元 def strEncrypt(s1,s2,key):#每次傳輸8個字元,分成兩組按位異或,金鑰4個字元 result='' for i in range(0,4): temp=ord(s1[i])^ord(s2[i])^ord(key[i]) result+=chr(temp) return result def encode(plainText,keylist): cipherText='' for i in range(0,len(plainText)//8): temp=plainText[i*8:(i+1)*8]#每8個字元劃分成一組加密 L=temp[:4] R=temp[4:] for currentKey in keylist: temp2=R R=strEncrypt(L,R,currentKey) L=temp2 cipherText+=R+L return cipherText def main(): key=[] a=input('請輸入要加密的字串,目前演算法能處理的明文字元為8的整數倍') keynum=input('請輸入加密迴圈次數') for i in range(0,int(keynum)): temp=input('請輸入第'+str(i)+'組加密時使用的金鑰(4個字元)') key.append(temp) print('要加密的明文為:',a) a=encode(a,key) print('密文:',a) #####解密 key.reverse() a=encode(a,key) print('解密後的明文:',a) if __name__ == '__main__': main()