我有很多密文都是使用一个时标技术完成的,但是都使用了相同的密钥,所以使用了很多时标。 我知道这是不好的做法,原因如下。
c1 = m1 XOR k
c2 = m2 XOR k
c1 XOR c2 = m1 XOR k XOR m2 XOR k = m1 XOR m2
因此我们可以在不知道密钥的情况下解密消息。 我正在使用以下方法对密文进行异或。
def xor_two_str(a,b):
xored = []
for i in range(max(len(a), len(b))):
xored_value = ord(a[i%len(a)]) ^ ord(b[i%len(b)])
xored.append('{:02x}'.format(xored_value))
return ''.join(xored)
然后我使用此方法将十六进制转换为ascii。
def hex_to_ascii(a):
return codecs.decode(a, "hex").decode('utf-8')
让我们说我有以下3个密文。
c1 = "51D9B411BE3C2FA6BD740CAD8044772413A938742F63EFC705B88C7D03BA12118EA9A2886019A938013E61992ED60E9B560E93456C264574E22C164FA8B912506FC90E4226FC622C01F6651C"
c2 = "578CA75CFB3828A0F36049AB9901647014A43A713727BBC44CA88A790EF1470B92A5EEDB645AB8311C7B6C826AD0"
c3 = "47C3B311B92D28A2F8271DB79301667619B1236E2475AEDB04B2D86102EF471E88A5EEC66E4EEA3548387D947EC1009B590789426B"
我想解密c3,所以我将其与c1和c2异或,并得到以下结果
('c1c3 ascii: ', u'\x01\x06\x07\n\x00\x07\x00\x00\x00|\x01\x07\x00~\x00\x04\x04|\x05\x03\x01\x07\x03s\x01\x03\x04\x05\x01\x01\x05\x02\x00\n\x03\x08\x01\x0b\x01q\x00r\x01\x06\x04\x03\x07u\x00\x01\x00\n|{\x01u\x00\x01\x07\x07\x05\x05\x00t\x00}\x00\x0c\x04w{\x0e\x00u\x05|\x04x\x00\r\x04\t\x00}\x01u\x00\r\x05\x00\x07\x07\x00u\x00\x00\x00\x0f\x00r\x01\n\x00\x07\x00\x01\x06\x01w\x06u\x07t\x03pz\x03r\x06~\x00\n\x04\x01\x03\x05\x04ttqz\n\x00t\x02\x04\x05\x00wzt\x03\x00p\x06tt\x02\x01\x00p\x06')
('c2c3 ascii: ', u'\x01\x00{p\x03\x04\x04r\x04{\x01|\x00\x00\x00\x02\x00\x0b\x04\x07\x05}\x03u\x00\n\x00\x00\x00\x02\x00\x06\x00\r\x03\x05\x01r\x01t\x01\x03\x05\x02\x03\x07\x07v\x04w\x03\n|y\x01\x08\x00w\x03w\x00\x00\x01\x07\x01\n\x00\x00\x00\x00\x07t\x00q\x01\x04\x07y\x00\x04\x05{\x04z\x01\x07\x01\x06\x01\x04\x07\x01\x05\x07\x01\x01t\x0e\x05t~{\x07\n\x04z')
我知道我在这里缺少什么,想知道是否有人可以提供帮助。我想我必须将密文转换为数字/二进制吗?在对它们进行异或运算之前,但不确定我将如何处理。
谢谢。