📜  通过移动纯文本进行XOR加密

📅  最后修改于: 2021-05-25 07:33:35             🧑  作者: Mango

这里是一个密码算法,基于十六进制字符串是通过异或给定的明文,N次,其中N是它的长度来实现。但是,要注意的是,每个连续的下一个XOR操作都是在将连续的纯文本条目向右移动之后完成。示例操作如下所示:

假设密码为“ abcd”,则通过对密码自身进行N次(即4次)异或运算,将十六进制文本计算为a1d0a1d

同样,如果密码为‘636f646572’ ,则

653cae8da8edb426052是十六进制文本。

因此,问题陈述是创建一种解密算法(使用任何编程语言),并从给定的十六进制字符串推导出纯文本。

例子 :

Input : a1d0a1d
Output : abcd
abcd once coded will return a1d0a1d

Input : 653cae8da8edb426052
Output : 636f646572

方法:加密和解密的关键要素是XOR的属性。 XOR是按位运算,如果两个可能的输入相同,则结果为0 ,但如果输入不同则结果为1 。下面给出了XOR表以供参考:

Inputs Outputs
X Y Z
0 0 0
0 1 1
1 0 1
1 1 0

XOR的一个重要且有用的特性是在密码学中广泛流行的是,如果对多个数字(例如M个数字)进行XOR运算,那么如果我们只知道M – 1个数字(一个未知数)以及XOR结果,那么我们可以通过对已知数字和XOR结果进行XOR来轻松计算缺失的数字。使用以下十六进制数字讨论此属性:

在此问题中,我们将最充分地使用上面列出的属性。现在,如果我们看一下“ abcd”的加密图,它只是数字的重复异或。最右边的数字是d“ abcd”的最右边的数字也是d ,因此纯文本和十六进制字符串的最后一个数字相同。下一个数字是1 ,这是通过使用属性我们知道明文数字可以推导出为d ^ 1 = c的属性对abcd的第二个右数位和上一个数字即1 = d ^ c进行XOR运算而得出的。同样,下一个数字是a ,可以通过d ^ c ^ b = a找到。我们只需要这样做直到十六进制字符串的一半,因为其余部分是对称的,因此不需要它们

下面是上述方法的实现:

# Implementation in Python 3
  
# Hex String variable
hex_s = '653cae8da8edb426052'
  
# Plain text variable
plain = ''
  
# variable to store the XOR
# of previous digits
x = 0
  
l = len(hex_s)
  
# Loop for loop from the end to
# the mid section of the string
for i in range(l - 1, int(l / 2) - 1, -1):
      
    # calculation of the plaintext digit
    y = x^int(hex_s[i], 16)
      
    # calculation of XOR chain
    x = x^y
    plain = hex(y)[-1] + plain
      
print(plain)
输出:
636f646572