这是我们密码学老师留的一个作业,她本来留的作业内容是仿照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()