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


  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我作为AI语言模型没有办法提供代码,但我可以向您解释Feistel密码结构实现原理: Feistel密码结构是一种对称密钥加密算法,它将明文分成两个相等的部分并通过多轮迭代来加密。每一轮迭代会通过一个非线性函数(称为“S盒”)将一部分明文与密钥进行混淆,并将结果与另一部分明文进行异或操作,然后将两部分明文交换位置。这个过程会重复多次,直到达到设定的轮数,最终输出密文。 以下是Feistel密码结构的伪代码: ``` function feistel_cipher(plaintext, key, rounds): left_half = plaintext[:len(plaintext)//2] right_half = plaintext[len(plaintext)//2:] for i in range(rounds): temp = left_half left_half = right_half right_half = temp ^ feistel_function(right_half, key[i]) ciphertext = right_half + left_half return ciphertext function feistel_function(data, key): # S-box substitution data = s_box(data) # XOR with key data = data ^ key # Permutation data = permutation(data) return data def s_box(data): # Non-linear substitution function ... def permutation(data): # Permutation function ... ``` 在这个伪代码中,`plaintext`是明文,`key`是密钥,`rounds`是轮数。`left_half`和`right_half`是明文分割后的两部分。在每一轮迭代中,我们将`left_half`和`right_half`交换位置,并将`right_half`与经过`feistel_function`函数加密后的结果进行异或操作。最后,我们将`left_half`和`right_half`合并成密文输出。 `feistel_function`函数是Feistel密码结构中的关键部分,它由三个部分组成:S盒、密钥混淆和置换。在实现中,我们可以使用不同的S盒和置换函数来增加算法的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值