ROT13

ROT13 (англ. rotate; «сдвинуть на 13 позиций», иногда используется написание через дефис — ROT-13) представляет собой шифр подстановки простой заменой для алфавита английского языка (стандартной латиницы), используемый в интернет-форумах, как средство для сокрытия спойлеров, основных мыслей, решений загадок и оскорбительных материалов от случайного взгляда. ROT13 был охарактеризован как «сетевой эквивалент того, как в журналах печатают ответы на вопросы викторин — перевёрнутыми буквами»[1]. ROT13 — это вариация шифра Цезаря, разработанного в Древнем Риме.

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

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
ahanun antnag
balkonyx barone
barfones beor
binova ebbsroof
envyrail erre
errsreef flapsync
furshe geltry
gnattang irkvex
clerkpyrex purelycheryl
PNGcat SHAfun
furbysheol terragreen
whatJung URLhey
purpuraChechen shoneFUBAR

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 года.

Ссылки править