feistel密码结构,带你从0到0.1了解

代码实践

第一步 转换成UTF8编码

s = "我要加密"
encoded = s.encode("utf-8")
print(encoded)

我们可以看到输出结果是
b’\xe6\x88\x91\xe8\xa6\x81\xe5\x8a\xa0\xe5\xaf\x86’
xe6的十六进制值是0xe6。
将0xe6转化为二进制数值,得到11100110。
将11100110转化为十进制数值,得到230
底层我们用11100110…来理解我们的数据

第二步 分割L和R

然后我们将这个字节串分成两半,左边就是我们的L,右边就是我们的R
我们来定义我们的L和R

# 计算中点,将字节串划分为两半
midpoint = len(encoded) // 2

# L为字节串的前半部分,R为字节串的后半部分
L = encoded[:midpoint]
R = encoded[midpoint:]

print("L:", L)
print("R:", R)

我们得到了L和R

L: b’\xe6\x88\x91\xe8\xa6\x81’
R: b’\xe5\x8a\xa0\xe5\xaf\x86’

进一步地,我们将L和R转换成整数,方便后面的异或运算

s = "我要加密"
encoded = s.encode("utf-8")
print(encoded)

# 计算中点,将字节串划分为两半
midpoint = len(encoded) // 2

# L为字节串的前半部分,R为字节串的后半部分
L = encoded[:midpoint]
R = encoded[midpoint:]

print("L:", L)
print("R:", R)

L= int.from_bytes(L, 'big')
R = int.from_bytes(R, 'big')

第三步 进行加密

计算加密函数F需要密钥K
假设我们现在有一个密钥,密钥就是“1117”这个数字,
我们用简单的加密来试试,直接用R+K,首先我们定义我们的F函数就是F=R+K
那么我们进行一次加密的操作就是L 异或 F(R,K):

s = "我要加密"
encoded = s.encode("utf-8")
print(encoded)

# 计算中点,将字节串划分为两半
midpoint = len(encoded) // 2

# L为字节串的前半部分,R为字节串的后半部分
L = encoded[:midpoint]
R = encoded[midpoint:]

print("L:", L)
print("R:", R)

L= int.from_bytes(L, 'big')
R = int.from_bytes(R, 'big')

# 这里我们定义了我们的密钥K的值
K=1117
# 这里我们定义了我们的加密函数F
F=R+K
M=L ^ F
print(M)

这里我们拿到了我们的密文:3307947758946
在这里插入图片描述

第四步 解密密文

# 首先,你需要对M和R进行一次逆向的异或操作,以获取原始的L
# 由于M = L ^ (R + K),我们可以通过 M ^ (R + K) = L^ (R + K)^ (R + K)来获取原始的L
# 上式中(R + K) ^ (R + K)=0,所以M ^ (R + K) = L
original_L = M ^ (R + K)

# 确定每个bytes对象的长度
length = midpoint

# 将整数L和R转换回bytes对象
L_bytes = original_L.to_bytes(length, 'big')
R_bytes = R.to_bytes(length, 'big')

# 将bytes对象L_bytes和R_bytes连接在一起
original_bytes = L_bytes + R_bytes

# 将bytes对象解码为字符串
original_string = original_bytes.decode('utf-8')

print(original_string)  # 应该打印: "我要加密"

到这里,我们就完成解密得到结果啦~
feistel密码结构,带你从0到0.1了解_第1张图片

你可能感兴趣的:(密码学)