代码实践
第一步 转换成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) # 应该打印: "我要加密"
到这里,我们就完成解密得到结果啦~

5040

被折叠的 条评论
为什么被折叠?



