Послушав Радио-Т номер 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])