ROT13 (англ.rotate; «сдвинуть на 13 позиций», иногда используется написание через дефис — ROT-13) представляет собой шифр подстановки простой заменой для алфавита английского языка (стандартной латиницы), используемый в интернет-форумах, как средство для сокрытия спойлеров, основных мыслей, решений загадок и оскорбительных материалов от случайного взгляда. ROT13 был охарактеризован как «сетевой эквивалент того, как в журналах печатают ответы на вопросы викторин — перевёрнутыми буквами»[1]. ROT13 — это вариация шифра Цезаря, разработанного в Древнем Риме.
ROT13 является обратимым алгоритмом, то есть отменить ROT13 можно, применив тот же алгоритм; одни и те же действия могут быть использованы для кодирования и декодирования. Алгоритм не дает никакой реальной криптографической безопасности и никогда не должен использоваться для этого. Он часто приводится в качестве канонического примера слабого метода шифрования. Алгоритм ROT13 породил разнообразные онлайн-игры с буквами и словами; алгоритм часто применяется в новостных группах (Usenet).
Применение алгоритма ROT13 к части текста требует простой замены каждого буквенного символа на соответствующий ему со сдвигом на 13 позиций в алфавите[2]. A становится N, B становится O, и т. д. до М, которое становится Z, а затем последовательно применяются буквы из начала алфавита: N становится A, O становится B, и так далее до Z, которая становится М. Затронуты лишь те буквы, которые используются в английском алфавите; цифры, символы, пробелы и все остальные символы остаются без изменений. Поскольку в английском алфавите всего 26 букв, а 26 = 2 × 13, то функция ROT13 является обратной для самой себя[2]:
для любого текста x.
Иными словами, два последовательных использования ROT13 восстанавливают первоначальный текст (в математике это иногда называют инволюцией; в криптографии — взаимные шифры).
Преобразования можно сделать с помощью таблицы поиска, такие, как:
Например, в следующей шутке основная мысль была закрыта шифром ROT13:
How can you tell an extrovert from an introvert at NSA?
Ubj pna lbh gryy na rkgebireg sebz na vagebireg ng AFN?
Преобразование текста через шифр ROT13, ответ на шутку:
In the elevators, the extrovert looks at the OTHER guy's shoes.
Va gur ryringbef, gur rkgebireg ybbxf ng gur BGURE thl'f fubrf.
Повторное применение алгоритма ROT13 восстановит оригинал.
Применение
ROT13 использовался в новостном форуме net.jokes в начале 1980-х[3]. Он использовался, чтобы скрыть потенциально оскорбительные шутки или ответ на головоломку или спойлер. Сдвиг на тринадцать знаков был выбран по сравнению с другими значениями, такими, как три, как в оригинале шифра Цезаря, потому что тринадцать — это число, которое обеспечивает как кодирование, так и декодирование, тем самым предоставляя единое удобство для обеих команд[2][4]. ROT13, как правило, поддерживается в качестве встроенной функции в функциях программного обеспечения для чтения лент новостей[4]. Адреса электронной почты также иногда кодируют алгоритмом ROT13, чтобы скрыть их от не самых продвинутых спам-ботов.
ROT13 не предназначен для использования с конфиденциальной информацией; использование постоянного сдвига означает, что шифрование фактически не имеет ключа, и для расшифровки требуется не больше знаний, чем тот факт, что может использоваться ROT13. Даже без этих знаний алгоритм легко дешифруется посредством частотного анализа[2]. Поскольку он полностью не соответствует реальной защите тайны, ROT13 стал жаргонным словом для обозначения какой-либо явно слабой схемы шифрования; критика может утверждать, что «56-битный DES — это немного лучше, чем ROT13 в прошлом». Кроме того, часто используется сходство с реальными выражениями, например, «double DES», используют с чувством юмора «double ROT13», «ROT26» или «2ROT13», в том числе в пародийной академической работе «On the 2ROT13 Encryption Algorithm»[6].
Применив алгоритм ROT13 к уже ROT13-зашифрованному тексту, получим первоначальный текст; ROT26 — эквивалент отсутствия шифрования как такового. В дополнение, тройное применение ROT13 или 3ROT13 (используется по шутливой аналогии с 3DES) эквивалентно обычному ROT13.
В декабре 1999 года было установлено, что Netscape Communicator использовал RОТ-13 в рамках небезопасной схемы для хранения паролей электронной почты[7].
В 2001 году русскийпрограммистДмитрий Скляров продемонстрировал, что поставщик eBook, компания New Paradigm Research Group (NPRG), использовала ROT13 для шифрования своих документов; предположительно, в NPRG ошибочно приняли игрушечный пример ROT13, предоставляемый Adobe с инструментарием Software Development Kit для eBook, за серьёзную схему шифрования[8]Windows XP использует ROT13 для некоторых ключей своего реестра[9].
ROT13 предоставляет возможность для «игр в слова».
Некоторые слова, трансформированные алгоритмом ROT13, производят другое известное слово.
Самые длинные примеры из английского языка состоят из семи букв:
«abjurer» (отрекающийся от своих убеждений) ↔ «nowhere» (нигде) и
«Chechen» (чеченец) ↔ «purpura» (пурпура).
Другие примеры слов приведены в таблице[10].
В 1989 году ассоциация International Obfuscated C Code Contest (IOCCC) добавила нотацию Brian Westley.
Компьютерная программа Westley может корректно компилировать как простые, так и кодированные алгоритмом ROT13 исходники.
Программа действует либо для выполнения кодировки ROT13, либо для обратного кодирования закодированного введённого текста[11].
В группе новостей alt.folklore.urban придумали слово «furrfu», что является закодированным в ROT13 часто используемым словом «sheesh» (тьфу!).
«Furrfu» активно использовался в середине 1992 года в ответ на часто публикующиеся повторения городских мифов на сайте alt.folklore.urban, на что многие жаловались, что такие ответы на публикации новичков были чрезмерностью[12].
В веб-комиксах «Darths and Droids»[13] один герой (Jim, играет Квай-Гон Джинн) утверждает, что в ROT13 слово «Jedi» (джедай) кодируется как «monk» (монах).
Другой герой (Pete, играет робота R2-D2) немедленно корректирует его, отмечая, что «monk» в ROT13 соответствует «Zbax».
Варианты алгоритма
ROT47 является производным от алгоритма ROT13, в дополнение к основному набору букв, также использует числа и вспомогательные символы. Вместо использования алфавитной последовательности A–Z, ROT47 использует больший набор символов, известный как кодировка ASCII. В частности, 7-битные символы для печати, за исключением пробела, от десятичного 33-го символа '!' до 126-го символа '~' — 94 символа в общей сложности, принятых в порядке числовых значений их кодов ASCII, способны смещаться на 47 позиций без специальных договорённостей. Например, символ A отображается на p, символ a отображается на 2. Использование большего алфавита производит более тщательную обфускацию, чем у ROT13, например, неочевидно, что Z`\c`d\gbh\eggd — это закодированный телефонный номер +1-415-839-6885. С другой стороны, поскольку ROT47 вводит цифры и символы в смеси без каких-либо различий, является более очевидным, что текст был зашифрован.
Библиотека GNU C, набор стандартных процедур для использования в компьютерных программах, содержит функциюmemfrob()[14], которая имеет цели, аналогичные ROT13, хотя она предназначена для использования с произвольными бинарными данными. Эта функция работает, оперируя с каждым байтом в сочетании с двоичной схемой 00101010 (число 42) с использованием операции исключающего ИЛИ (XOR). Это работает как простой XOR-шифр. Как и ROT13, memfrob() взаимнообратна, и предоставляет аналогичный, практически отсутствующий, уровень безопасности.
Примеры
На языке программирования Python алгоритм выглядит следующим образом:
#[rustfmt::skip]constSUBSTITUTIONS: [u8;58]=[b'N',b'O',b'P',b'Q',b'R',b'S',b'T',b'U',b'V',b'W',b'X',b'Y',b'Z',b'A',b'B',b'C',b'D',b'E',b'F',b'G',b'H',b'I',b'J',b'K',b'L',b'M',0,0,0,0,0,0,b'n',b'o',b'p',b'q',b'r',b's',b't',b'u',b'v',b'w',b'x',b'y',b'z',b'a',b'b',b'c',b'd',b'e',b'f',b'g',b'h',b'i',b'j',b'k',b'l',b'm',];/// # Example////// ```/// assert_eq!("Uryyb, jbeyq!", rot13("Hello, world!"));/// ```fnrot13(src: &str)-> String{src.bytes().map(|byte|{letcapital_byte=byte&!32;char::from(ifcapital_byte>=b'A'&&capital_byte<=b'Z'{// safety: this should be safe for Latin lettersunsafe{*SUBSTITUTIONS.get_unchecked((byte-b'A')asusize)}}else{byte})}).collect()}fnmain(){letsrc="Hello, world!";println!("Original: \"{}\", Encoded: \"{}\"",src,rot13(src));}
↑Horrocks, BruceUCSM Cabal Circular #207-a (неопр.). Usenet group uk.comp.sys.mac (Message ID UZ36hgCSoh$+EwqG@nodomain.nodomain.us) (28 июня 2003). Дата обращения: 17 сентября 2007.
Software for ROT13 in a large number of languages — includes a patch to ssh to add support for ROT13, and a cryptanalysis tool to automatically distinguish ROT13 text from plaintext. (англ.) (недоступная ссылка)