这里是一个密码算法,基于十六进制字符串是通过异或给定的明文,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