Feistel结构就是交替使地使用替换和置换。替换和置换地定义如下:
替换:每个明文元素或元素组被唯一地替换为相应地密文元素或元素组。
置换:明文元素地序列被替换为该序列地一个置换,序列里没有添加新元素,但是元素出现的顺序变了。
分组密码,是将整个长明文分成若干组,以组为单位进行加密。分组越长意味着安全性越高,但是会降低加密解密的速度。为了简化加密过程,我们设定每个分组长度都相等,不足则补上空格。
一、加密思路
将明文分成若干等长分组,对于每个分组进行以下加密:
取分组后KSIZE位字符生成子密钥,将子密钥与前 (PSIZE - KSIZE)为进行异或加密,再将子密钥拼接到异或得到的密文后,得到与原分组长度相等的密文C1,再对问C1进行栅栏密码的加密,最终得到该分组加密的密文。
1.分组函数
# devide str into part (each part's size = size)
def str_size(string,size):
s = []
for i in range(0,len(string),size):
c = string[i:i+size]
for j in range(len(c),size):
c += ' '
s.append(c)
return s
2.替换函数
Feistel的替换是在每一轮将分组前后两半对调,这里变形为使用栅栏密码,并且栅栏密码的行列数是随机的。
# Encode function
def fence(message,n):
part = ['' for i in range(n)]
C = ''
for i in range(len(message)):
part[i%n] += message[i]
for i in range(n):
C += part[i]
return C
3.子密钥产生算法
这里采用了一种变异的凯撒密码,
def STUPID (message,key):
j = 13
C = ''
for i in range(len(message)):
if (message[i].isupper()):
C += chr( (ord(message[i]) - ord('A') + j ) %26 + ord('A') )
j += key
elif (message[i].islower()):
C += chr( (ord(message[i]) - ord('a') + j ) %26 + ord('a') )
j += key
else :
C += message[i]
return C
凯撒的安全性不高,所以这里还进行了一定程度的