Послушав Радио-Т номер 254, захотелось расшифровать код на 10% скидку на продукты от Parallels.
Воспользовавшись подсказкой о числе 13 можно после некоторых поисков найти прийти к выводу об использовании алгоритма ROT13 (подробнее о нем можно почитать в википедии). По сути это элементарный сдвиг на 13 позиций в алфавите. Пишем простую функцию на Python 3.0.
import string
def rot13(text):
rot13_trans = string.maketrans( \
"ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz", \
"NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")
return string.translate(text, rot13_trans)
Первый этап пройден. Полученную в результате строку необходимо разбить на подстроки, затем сохранить в файл и пропустить через утилиту uudecode, которая есть в любом дистрибутиве linux (на mac’е тоже она есть). Но мне было лень заморачиваться с этим и я написал аналог также на питоне.
import base64, re
# s - это декодированная с помощью rot13 строка
matches = re.split('~', s)
print base64.b64decode(matches[1] + matches[2])
Описывать подробно смысла особого нет. Делим на подстроки по маске ‘~’, соединяем 2 и 3 строки и декодируем через base64. Вот и все. Финальный результат публиковать не стану, кому надо тот сам все сделает.
На Python 2.x можно написать через .decode(‘rot13’)
и не морочить себе голову, как это сделал я.
import base64, re
matches = re.split('~', 'rot13 string'.decode('rot13'))
print base64.b64decode(matches[1] + matches[2])