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()


你可能感兴趣的:(Python)