ROT13

Перейти к навигацииПерейти к поиску
Алгоритм ROT13 заменяет каждую букву на парную ей из второй половины латинского алфавита, образовывая два набора по тринадцать символов. Например, HELLO становится URYYB (или, наоборот, URYYB переводится в HELLO повторным действием алгоритма).

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
ahanunantnag
balkonyxbarone
barfonesbeor
binovaebbsroof
envyrailerre
errsreefflapsync
furshegeltry
gnattangirkvex
clerkpyrexpurelycheryl
PNGcatSHAfun
furbysheolterragreen
whatJungURLhey
purpuraChechenshoneFUBAR

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 вводит цифры и символы в смеси без каких-либо различий, является более очевидным, что текст был зашифрован.

Пример:

The Quick Brown Fox Jumps Over The Lazy Dog.

шифруется в

%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));
}

См. также

Примечания

  1. Horrocks, Bruce UCSM Cabal Circular #207-a. Usenet group uk.comp.sys.mac (Message ID UZ36hgCSoh$+EwqG@nodomain.nodomain.us) (28 июня 2003). Дата обращения: 17 сентября 2007.
  2. 1 2 3 4 Schneier, Bruce. Applied Cryptography (неопр.). — Second. — John Wiley & Sons, 1996. — С. 11. — ISBN 0-471-11709-9.
  3. Early uses of ROT13 found in the Google USENET archive date back to 8 October 1982, posted to the net.jokes newsgroup [1][2]
  4. 1 2 Raymond, Eric S. (ed.) ROT13. The Jargon File, 4.4.7 (29 декабря 2003). Дата обращения: 19 сентября 2007. Архивировано 8 июня 2012 года.
  5. Kahn, David. The odebreakers: The Story of Secret Writing (англ.). — New York: Macmillan, 1996. — ISBN 0-684-83130-9.
  6. On the 2ROT13 Encryption Algorithm (PDF). Prüfziffernberechnung in der Praxis (25 сентября 2004). Дата обращения: 20 сентября 2007. Архивировано 8 июня 2012 года.
  7. Hollebeek, Tim; Viega, John.: Bad Cryptography in the Netscape Browser: A Case Study. Reliable Software Technologies. Дата обращения: 20 сентября 2007. Архивировано 8 июня 2012 года.
  8. Perens, Bruce Dimitry Sklyarov: Enemy or friend? ZDNet News (1 сентября 2001). Дата обращения: 20 сентября 2007. Архивировано 8 февраля 2009 года.
  9. Ferri, Vic The Count Keys in the Windows Registry. ABC: All 'Bout Computers (4 января 2007). Дата обращения: 20 сентября 2007. Архивировано 8 июня 2012 года.
  10. De Mulder, Tom ROT13 Words. Furrfu!. Дата обращения: 19 сентября 2007. Архивировано 8 июня 2012 года.
  11. Westley, Brian westley.c. IOCCC (1989). Дата обращения: 13 августа 2007. Архивировано 8 июня 2012 года.
  12. Furrfu. Foldoc (25 октября 1995). Дата обращения: 13 августа 2007. Архивировано 8 июня 2012 года.
  13. irregularwebcomic.net. Дата обращения: 9 февраля 2009. Архивировано 10 февраля 2009 года.
  14. 5.10 Trivial Encryption. The GNU C Library Reference Manual. Free Software Foundation (3 декабря 2006). Дата обращения: 20 сентября 2007. Архивировано 8 июня 2012 года.

Ссылки