Произошло шифрование строки. Помогите произвести дешифрование
Здраствуйте, я новичок в Python. Произошло шифрование строки encrypt("XXXXXXXX"). Помогите пожалуйста произвести дешифрование.
#!/usr/bin/python3
def encrypt(text):
for letter in text:
num = ord(letter)
print((num * 71) % 0x100, end=' ')
print("")
encrypt("XXXXXXXX") # first part
# Output:
# 177 244 80 190 151 201 147 179
import random
def encrypt(text):
for letter in text:
padding = random.randint(0, 0xffffffff)
num = ord(letter) + padding * 0x100
print((num * 71) % 0x10000000000, end=' ')
print("")
encrypt("XXXXXXXXXXX") # second part
# Output:
# 525947173269 385674887347 826626104207 1038741816624 1942636332 500176323152 308306622286 219678138270 409399376492 188475543447 321720464514
Спасибо большое!
Ответы (1 шт):
Для первого случая нам известен остаток от деления на 256 кода каждого символа, умноженного на 71. Остается решить уравнение
код символа * 71 ≡ зашифрованный код (mod 256)
(Код символа умноженный на 71 сравним с зашифрованным кодом по модулю 256)
код символа * 71 * 71-1 ≡ зашифрованный код * 71-1 (mod 256)
код символа ≡ зашифрованный код * 71-1 (mod 256)
Обратное по модулю можно найти, например, с помощью расширенного алгоритма евклида. Для 71 по модулю 256 это будет 119
Если изначальный символ входил в таблицу ASCII, т.е. его код не превышал 255, то ответ получится однозначный, иначе придется подбирать. Будем считать, что входил (скорее всего, так и есть), значит ответом будет остаток от деления на 256 зашифрованного кода, умноженного на 119.
Например, кодом первого символа будет 71 (символ G)
Второй случай может показаться страшным, но прибавленное число ни на что не влияет, потому, что
x + y * 256 ≡ x (mod 256)
Кодом первого символа во втором случае будет 67 (символ C)
