ROT13
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 восстанавливают первоначальный текст (в математике это иногда называют инволюцией; в криптографии — взаимные шифры).
Преобразования можно сделать с помощью таблицы поиска, такие, как:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz |
NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm |
Например, в следующей шутке основная мысль была закрыта шифром 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 представляет собой частный случай алгоритма шифрования, известного как шифр Цезаря, приписываемый Юлию Цезарю в I веке до нашей эры[5]. Более специфичный случай использования шифрования — индийским философом Ватсьяяна Малланага, автором секс-руководства Кама Сутра.
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].
Игры с буквами и «сетевая» культура
abcdefghijklmnopqrstuvwxyz NOPQRSTUVWXYZABCDEFGHIJKLM | |
aha ↔ nun | ant ↔ nag |
balk ↔ onyx | bar ↔ one |
barf ↔ ones | be ↔ or |
bin ↔ ova | ebbs ↔ roof |
envy ↔ rail | er ↔ re |
errs ↔ reef | flap ↔ sync |
fur ↔ she | gel ↔ try |
gnat ↔ tang | irk ↔ vex |
clerk ↔ pyrex | purely ↔ cheryl |
PNG ↔ cat | SHA ↔ fun |
furby ↔ sheol | terra ↔ green |
what ↔ Jung | URL ↔ hey |
purpura ↔ Chechen | shone ↔ FUBAR |
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 вводит цифры и символы в смеси без каких-либо различий, является более очевидным, что текст был зашифрован.
Пример:
шифруется в
- %96 "F:4< qC@H? u@I yF>AD ~G6C %96 {2KJ s@8]
Библиотека GNU C, набор стандартных процедур для использования в компьютерных программах, содержит функцию memfrob()[14], которая имеет цели, аналогичные ROT13, хотя она предназначена для использования с произвольными бинарными данными. Эта функция работает, оперируя с каждым байтом в сочетании с двоичной схемой 00101010 (число 42) с использованием операции исключающего ИЛИ (XOR). Это работает как простой XOR-шифр. Как и ROT13, memfrob() взаимнообратна, и предоставляет аналогичный, практически отсутствующий, уровень безопасности.
Примеры
На языке программирования Python алгоритм выглядит следующим образом:
def rot13(text):
rot13ed = ''
for letter in text:
byte = ord(letter)
capital = (byte & 32)
byte &= ~capital
if ord('A') <= byte <= ord('Z'):
byte -= ord('A')
byte += 13
byte %= 26
byte += ord('A')
byte |= capital
rot13ed += chr(byte)
return rot13ed
Оптимизированный вариант:
def rot13(text):
sub = 'NOPQRSTUVWXYZABCDEFGHIJKLM[\]^_`nopqrstuvwxyzabcdefghijklm'
res = []
for letter in text:
res.append(sub[ord(letter)-65])
return ''.join(res)
Пример на языке программирования Rust:
#[rustfmt::skip]
const SUBSTITUTIONS: [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!"));
/// ```
fn rot13(src: &str) -> String {
src.bytes()
.map(|byte| {
let capital_byte = byte & !32;
char::from(if capital_byte >= b'A' && capital_byte <= b'Z' {
// safety: this should be safe for Latin letters
unsafe { *SUBSTITUTIONS.get_unchecked((byte - b'A') as usize) }
} else {
byte
})
})
.collect()
}
fn main() {
let src = "Hello, world!";
println!("Original: \"{}\", Encoded: \"{}\"", src, rot13(src));
}
См. также
Примечания
- ↑ Horrocks, Bruce UCSM Cabal Circular #207-a . Usenet group uk.comp.sys.mac (Message ID UZ36hgCSoh$+EwqG@nodomain.nodomain.us) (28 июня 2003). Дата обращения: 17 сентября 2007.
- ↑ 1 2 3 4 Schneier, Bruce. Applied Cryptography (неопр.). — Second. — John Wiley & Sons, 1996. — С. 11. — ISBN 0-471-11709-9.
- ↑ Early uses of ROT13 found in the Google USENET archive date back to 8 October 1982, posted to the net.jokes newsgroup [1][2]
- ↑ 1 2 Raymond, Eric S. (ed.) ROT13 . The Jargon File, 4.4.7 (29 декабря 2003). Дата обращения: 19 сентября 2007. Архивировано 8 июня 2012 года.
- ↑ Kahn, David. The odebreakers: The Story of Secret Writing (англ.). — New York: Macmillan, 1996. — ISBN 0-684-83130-9.
- ↑ On the 2ROT13 Encryption Algorithm (PDF). Prüfziffernberechnung in der Praxis (25 сентября 2004). Дата обращения: 20 сентября 2007. Архивировано 8 июня 2012 года.
- ↑ Hollebeek, Tim; Viega, John.: Bad Cryptography in the Netscape Browser: A Case Study . Reliable Software Technologies. Дата обращения: 20 сентября 2007. Архивировано 8 июня 2012 года.
- ↑ Perens, Bruce Dimitry Sklyarov: Enemy or friend? ZDNet News (1 сентября 2001). Дата обращения: 20 сентября 2007. Архивировано 8 февраля 2009 года.
- ↑ Ferri, Vic The Count Keys in the Windows Registry . ABC: All 'Bout Computers (4 января 2007). Дата обращения: 20 сентября 2007. Архивировано 8 июня 2012 года.
- ↑ De Mulder, Tom ROT13 Words . Furrfu!. Дата обращения: 19 сентября 2007. Архивировано 8 июня 2012 года.
- ↑ Westley, Brian westley.c . IOCCC (1989). Дата обращения: 13 августа 2007. Архивировано 8 июня 2012 года.
- ↑ Furrfu . Foldoc (25 октября 1995). Дата обращения: 13 августа 2007. Архивировано 8 июня 2012 года.
- ↑ irregularwebcomic.net . Дата обращения: 9 февраля 2009. Архивировано 10 февраля 2009 года.
- ↑ 5.10 Trivial Encryption . The GNU C Library Reference Manual. Free Software Foundation (3 декабря 2006). Дата обращения: 20 сентября 2007. Архивировано 8 июня 2012 года.
Ссылки
- Онлайн шифратор/дешифратор Архивная копия от 13 ноября 2016 на Wayback Machine для шифров от ROT1 до ROT25.
- 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. (англ.) (недоступная ссылка)