你将如何逆转这个rot_13和十六进制密码


def enc(s):
s = codecs.encode(s, 'rot_13')
for k in 'A3 A7 AD B3 B5 BF C1 C5 C7 D3 DF E3 E5 E9 EF F1 FB'.split(' '):
k = int('0x' + k, 16)
s = (''.join(chr(ord(c) ^ k) for c in s))
return s

你怎么把这个密码颠倒过来,这样就可以解密了。我的加密消息是:wrTCoMK7wrjDocKhw6HCpMKiwrDosOiwrHCo8Kmw6LDocKswqfCpcK5wqbCo8KywqHCs8Khw6bCsMKlwq/Co8Kgw6LCo8Kyw 6PrmK0wLCosK3wrfCrcK8wrnCt8Kswq3DosKhwLCpMK3wrHCpMO7wrfCtMKjwrfCtAT==

我似乎得到了奇怪的字符,但我不知道为什么

XOR运算是对称的,所以编码和解码之间的区别只是ROT-13运算的执行顺序。对于编码,您在XOR之前进行,对于解码,您在之后进行。

import codecs

def xor_s(s, keystream):
for k in keystream:
s = "".join(chr(ord(c) ^ k) for c in s)
return s

def rot13(s):
return codecs.encode(s, "rot_13")

def enc(s, keystream):
return xor_s(rot13(s), keystream)

def dec(s, keystream):
return rot13(xor_s(s, keystream))

keystream = [
int(k, 16) for k in "A3 A7 AD B3 B5 BF C1 C5 C7 D3 DF E3 E5 E9 EF F1 FB".split(" ")
]
o = "Very Secret Message"
a = enc(o, keystream)
b = dec(a, keystream)
print(o, "->", a, "->", b)

打印

Very Secret Message -> §°¹õ§¥°§²õ§³³»¡§ -> Very Secret Message

下面是给定问题的另一个可能的解决方案:

import codecs

class BodyGuard():
def secret_sauce(self, s):
keystream = [
int(k, 16) for k in "A3 A7 AD B3 B5 BF C1 C5 C7 D3 DF E3 E5 E9 EF F1 FB".split(" ")
]
for k in keystream:
s = "".join(chr(ord(c) ^ k) for c in s)
return s
def encode(self, s):
return self.secret_sauce(codecs.encode(s, "rot_13"))
def decode(self, s):
return codecs.decode(self.secret_sauce(s), "rot_13")

if __name__ == '__main__':
b = BodyGuard()
msg_raw = "Hello world"
msg_encoded = b.encode(msg_raw)
msg_decoded = b.decode(msg_encoded)
print(f"{msg_raw} -> {msg_encoded} -> {msg_decoded}")

最新更新