Как бы вы изменили этот rot_13 и шестнадцатеричный шифр? - PullRequest
0 голосов
/ 31 марта 2020
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

как бы вы перевернули этот шифр так, чтобы вы могли расшифровать его. мое зашифрованное сообщение: wrTCoMK7wrjDocKhw6HCpMKiwrDDosOiwrHCo8Kmw6LDocKswqfCpcK5wqbCo8KywqHCs8Khw6bCsMKlwq / Co8Kgw6LCo8Kyw6PCrMK0wqLCosK3wrfCrcK8wrnCt8Kswq3DosKhwqLCpMK3wrHCpMO7wrfCtMKjwrfCtA ==

1003 * Кажется, я получаю странные символы, но я не знаю, почему

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Вот еще одно возможное решение данной проблемы:

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}")
0 голосов
/ 31 марта 2020

Операция XOR симметрична c, поэтому все, что отличается между кодированием и декодированием, - это порядок, в котором выполняется операция 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
...