Feistel样式解密

一,加密算法

大概像这样

def fen(a0,a1,key):
    for i in range(len(key)):
        tem = a0
        a0 = a1 ^ enc(a0,key[i])
        a1 =tem
    return a0,a1

输入为两部分,还有一个密钥,并不做任何限制

加密算法也是交换,然后将其中一个和由key生成的东西异或。

二,解密

解密的话,要区分加密轮次是奇数还是偶数

下面我简化一下,将加密算法enc直接去除了,实际上可以看成key=enc(xxxxx)

def fen(a0,a1,key):
    for i in range(len(key)):
        tem = a0
        a0 = a1 ^ key[i]
        a1 =tem
    return a0,a1

偶数

加密轮次为偶数的话,很简单,直接将加密时用的密钥和加密得到的数据重新用原函数加密一遍即可,和RC4差不多。

这是一个例子

#密钥与密文
key=[10000,20000,30000,40000,50000,60000]
flag=[1234,4567]

#使用这个加密
enflag=[0]*2
enflag[0],enflag[1]=fen(flag[0],flag[1],key)
print(enflag)
#[15570, 32935]
#解密
text=[0]*2
text[0],text[1]=fen(enflag[0],enflag[1],key)
print(text)
#[1234, 4567]

奇数

加密轮次奇数就复杂一些,需要先将加密后的数据密钥逆序,再用原函数解密,最后将得到的结果再逆序就完成了

这是一个例子:

#密钥和密文
key=[100456500,20000,30000,40000,50000,60000,595]
flag=[1234,4567]
#加密
enflag=[0]*2
enflag[0],enflag[1]=fen(flag[0],flag[1],key)
print(enflag)
#[100433360, 15570]
#解密
rekey=key[::-1]
text=[0]*2
text[0],text[1]=fen(enflag[1],enflag[0],rekey)#注意这里,我交换了顺序不是0和1,而是1和0
print(text)
#[4567, 1234],这里再逆序一下就和原始密文一样了,

特别情况

如果我改成这样加密:

def fen(a0,a1,key):
    for i in range(n):
        tem = a0
        a0 = a1 ^ key[i%len(key)]
        a1 =tem
    return a0,a1

n为偶数解密过程的时候和上面一样

但n为奇数的时候,如果把密钥逆序反而不对,正序却能得出正确结果

真是神奇。

posted @ 2025-05-21 19:39  漫宿骄盛  阅读(35)  评论(0)    收藏  举报