1. 程式人生 > >Python實現一個簡單的Feistel結構的密碼演算法

Python實現一個簡單的Feistel結構的密碼演算法

這是我們密碼學老師留的一個作業,她本來留的作業內容是仿照DES密碼設計一個密碼演算法,但第一次聽到這個作業時我的內心是崩潰的(冏rz),因為其實我並不太能理解DES演算法中P盒還有S盒設計的思想是什麼。。(也就是並不太能理解這些置換表為什麼要這麼設計)

但是我知道DES演算法是一種分組密碼,採用的是Feistel結構的呀!於是我就根據Feistel結構的設計思想設計了一個簡單的加密演算法。

Feistel結構最大的優點就是加密和解密過程可以使用完全相同的演算法,這就使得在實施的過程中,對編碼量和線路傳輸的要求就減少了幾乎一半。使用其結構的安全性主要在於選擇塊的大小,金鑰長度,迴圈次數,子金鑰生成演算法和輪函式複雜度。

我設計的演算法中,把字串的8個字元分為一組加密,每次加密時使用4個字元的字串作為金鑰(一個ASCII字元8bit,所以4個字元應該就是32bit了吧⊙▽⊙),加密演算法很簡單,就是把每個分組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()