ROT13ROT13 (англ. 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]:
Иными словами, два последовательных использования 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 представляет собой частный случай алгоритма шифрования, известного как шифр Цезаря, приписываемый Юлию Цезарю в 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]. Игры с буквами и «сетевая» культура
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 алгоритм выглядит следующим образом: 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));
}
См. такжеПримечания
Ссылки
|
Portal di Ensiklopedia Dunia