ROT13
ROT13 («rotar 13 posiciones») es un sencillo cifrado César utilizado para ocultar un texto sustituyendo cada letra por la letra que está trece posiciones por delante en el alfabeto. A se convierte en N, B se convierte en O y así hasta la M, que se convierte en Z. Luego la secuencia se invierte: N se convierte en A, O se convierte en B y así hasta la Z, que se convierte en M. Este algoritmo se utiliza en foros de Internet como medio para ocultar de miradas casuales el final de un chiste, la solución a un acertijo, el destripe de una película o una historia, o algún texto ofensivo. ROT13 se ha descrito como el «equivalente en Usenet de una revista que imprime bocabajo la respuesta a un pasatiempo».[1]
El nombre «ROT13» se originó en Usenet a principios de los años 1980, y el método se ha convertido en un estándar de facto. Al igual que el cifrado de César (un método de cifrado con miles de años), el ROT13 no proporciona seguridad criptográfica real y no se usa para tales fines; de hecho, a menudo se emplea como ejemplo canónico de cifrado débil. Otra característica de este cifrado es que se trata de un cifrado recíproco, para deshacer el ROT13 se aplica el mismo algoritmo, de manera que para cifrar y descifrar se puede utilizar el mismo código.
Se puede clasificar dentro de los cifrados simétricos, luego se emplea la misma clave para cifrar y para descifrar.
Descripción
Aplicar el ROT13 a un texto se reduce a examinar sus caracteres alfabéticos y sustituirlos por la letra que está 13 posiciones por delante en el alfabeto, volviendo al principio si es necesario y conservando las mayúsculas y minúsculas: a se convierte en n, B se convierte en O, y así hasta la Z, que se convierte en M. Solo quedan afectadas las letras que aparecen en el alfabeto latino; los números, símbolos, espacios y otros caracteres se dejan igual. Como hay 26 letras en el alfabeto latino y 26 = 2 × 13, la función ROT13 es su propia inversa:
- para cualquier texto x.
En otras palabras, dos aplicaciones sucesivas de ROT13 recuperan el texto original (en matemáticas, esto a veces se llama involución; en criptografía, un cifrado recíproco).
La transformación se puede hacer utilizando una tabla de búsqueda como la siguiente:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz |
NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm |
Por ejemplo, en este chiste, la respuesta se ha ocultado usando ROT13:
¿Cómo se puede distinguir a un extrovertido de un introvertido en la NSA? Ra ybf nfprafberf, ry rkgebiregvqb zven ybf mncngbf qr ybf BGEBF gvcbf.
Transformando todo el texto mediante el ROT13, se revela la respuesta al chiste:
¿Pbzb fr chrqr qvfgvathve n ha rkgebiregvqb qr ha vagebiregvqb ra yn AFN? En los ascensores, el extrovertido mira los zapatos de los OTROS tipos.
Una segunda aplicación del ROT13 recuperaría el original.
Historia
El ROT13 se originó en el grupo de noticias net.jokes[2] a principios de la década de 1980,[3] en un esfuerzo por proporcionar un medio voluntario para ocultar los chistes que algunos lectores podrían encontrar ofensivos, o simplemente para ofuscar el final de un chiste y evitar que se leyese demasiado pronto. (Los intentos anteriores de categorizar los chistes ofensivos colocándolos en grupos de noticias separados fallaron: los administradores no querían dar a entender que consentían esas publicaciones creando un sitio especial para ellas). El ROT13 fue una solución conveniente debido a su simplicidad.
Como sustituye letras alfabéticas por otras letras, se garantizaba que el ROT13 no causaría problemas con algún software de grupos de noticias que pudiera tener incompatibilidades con caracteres poco usuales. Se eligió ROT-13 en lugar de ROT-N (para cualquier otro valor de N, como el 3 en el cifrado César original) porque 13 es el valor que hace que la codificación y la decodificación sean equivalentes, permitiendo así la comodidad de un mismo comando para cifrar y descifrar. En sentido estricto, el valor 13 funciona así solo para idiomas como el inglés, que tienen 26 letras en su alfabeto, pero como el alfabeto latino de 26 caracteres está incluido en el juego de caracteres ASCII, el ROT13 es bastante universal, al menos para los idiomas occidentales que pueden usar el ASCII o alguna de sus extensiones.
Aunque los usuarios podían codificar y descodificar los mensajes a mano, el descifrado automático es mucho más cómodo. Los sistemas UNIX tienen una utilidad estándar llamada "tr" (transliterar) que se puede aplicar para hacer una codificación ROT13:
- tr A-Za-z N-ZA-Mn-za-m
Que significa, literalmente:
- Traduce el texto que te paso cambiando todas las letras de la secuencia que va de la «A» a la «Z» mayúsculas (A-Z), respectivamente, por, primero, la secuencia de letras que van de la «N» a la «Z» (N-Z), y después —puesto que solo llevamos la mitad de la secuencia a traducir— por la secuencia que va de la «A» a la «M» (A-M). Hacer lo análogo con las minúsculas.
Que se corresponde, precisamente, con una codificación (o descodificación) ROT13.
Pronto el descifrado automático se añadió como característica incorporada en las aplicaciones de grupos de noticias. A partir de principios de los 90, el ROT13 también se utilizó en los foros de FidoNet, hasta el punto de que las aplicaciones de correo de Fidonet solían incluir características para cifrar y descifrar automáticamente.
ROT13 como método de cifrado
ROT13 pertenece a un conjunto de algoritmos de cifrado conocidos como cifrados César, que son a su vez un tipo especialmente simple de cifrado por sustitución. El ROT13 no está pensado para los casos en los que el secreto tiene alguna importancia: el uso de un desplazamiento constante significa que el cifrado no tiene clave, y el descifrado no requiere más conocimiento que el hecho de que se está usando el método ROT13. Incluso sin este conocimiento, como con cualquier cifrado por sustitución, el algoritmo se puede romper fácilmente por análisis de frecuencias o mediante la explotación de palabras patrón (el ROT13 es un ejemplo de lo que Bruce Schneier llama «cifrado para la hermana pequeña»: como mucho servirá para mantener en secreto un documento contra tu hermana pequeña).
El efecto real del ROT13 es simplemente asegurarse de que el lector de un mensaje tenga que descifrarlo conscientemente, lo que normalmente suele implicar ejecutar el comando en cuestión en el software que lee el mensaje. En lugar de proteger un mensaje confidencial de los lectores no autorizados, el ROT13 salvaguarda a los lectores autorizados del material que pueden no querer leer involuntariamente, como los spoilers en una crítica de un libro o una película.
Debido a su completa inutilidad para una verdadera confidencialidad, el ROT13 se ha convertido en un eslogan para referirse a cualquier sistema de cifrado visiblemente débil; un crítico podría decir que «el DES de 56 bits es poco mejor que el ROT13 en estos días». Además, en juego con términos reales como «DES doble», surgen términos como ROT13 doble, ROT26 o 2ROT13 con intenciones jocosas, incluyendo un artículo académico paródico titulado "Sobre el algoritmo de cifrado 2ROT13".[4] Como se explica arriba, aplicar el ROT13 a un texto que ya está cifrado con ROT13 recupera el texto en claro original, de manera que el ROT26 es equivalente a no cifrar en absoluto.
La idea del ROT26 se ha utilizado como una pulla satírica contra la Acta de derechos de autor Milenio Digital (DMCA) estadounidense; algunos usuarios de Internet firman sus mensajes en los foros con frases como «Codificado con ROT26: ¡los intentos de saltarse la protección serán perseguidos!» (el DMCA introdujo la prohibición general de saltarse los sistemas de protección de copia, sistemas que a menudo se descubre que internamente emplean métodos lamentablemente inseguros de criptografía). También se pueden observar menciones al «ROT13 triple», que, por supuesto, es equivalente al ROT13 normal (el término procede probablemente del Triple DES).
En 2001, el criptoanalista ruso Dmitry Sklyarov fue arrestado tras detallar las debilidades de los sistemas de protección de copia de los libros electrónicos. Un vendedor de libros electrónicos, New Paradigm Research Group (NPRG), utilizó de hecho el ROT13 para cifrar sus documentos. Se especula que NPRG puede haber confundido un ejemplo de juguete —incluido en el kit de desarrollo de libros electrónicos de Adobe— con un sistema de cifrado serio.[5]
Juegos de letras con ROT13 y cultura digital
| |||
arar ↔ nene | cherne ↔ purear | ||
chan ↔ puna | bu ↔ oh | ||
chane ↔ punar | erar ↔ rene | ||
pena ↔ cran | prear ↔ cerne | ||
ora ↔ ben | tena ↔ gran | ||
un ↔ ha | ve ↔ ir |
ROT13 permite hacer juegos de letras. Algunas palabras, transformadas con el ROT13, producen otra palabra. El ejemplo más largo en el idioma español es la pareja de palabras de 6 letras cherne y purear; si no se tienen en cuenta las tildes, se añaden dos parejas más de 6 letras: chamba y punzón, y germán y trezna. El idioma inglés tiene dos parejas de 7 letras: abjurer y nowhere, y chechen y púrpura. En la tabla hay más ejemplos de este tipo en español.
La palabra entregar queda transformada por ROT13 en ragertne (su inversión, aunque no es una palabra española). Pasa lo mismo con enarenar, banano, enviar, nana y bobo. No hay ningún par de palabras en español que sean a la vez su inversión y su transformación ROT13; en el idioma inglés existe un caso: gnat (un insecto díptero) y tang (sabor fuerte).
En la edición de 1989 del Concurso Internacional de Código C Ofuscado (IOCCC) participó Brian Westley con un programa que, si se transformaba con ROT13 o se invertía, seguía compilando correctamente. Su función, cuando se ejecutaba, era o bien codificar en ROT13 o invertir la salida.[6]
El grupo de noticias alt.folklore.urban acuñó una palabra —furrfu— que era la codificación en ROT13 de la exclamación «sheesh», usada frecuentemente. «Furrfu» evolucionó a mediados de 1992 como respuesta a los mensajes que repetían leyendas urbanas en alt.folklore.urban, después de que algunos usuarios se quejaran de que se estaba sobreutilizando la respuesta «¡Sheesh!» a los recién llegados.[7]
Variantes
Hay otros sistemas de ofuscación poco utilizados con propósitos similares al ROT13. ROT13 solo maneja letras y deja intactos el resto de caracteres, como los signos de puntuación, los números y los espacios en blanco. A causa de esto, el ROT13 es inapropiado para algunos propósitos, por ejemplo, ocultar la respuesta numérica de un enigma o manejar datos binarios arbitrarios.
ROT5
ROT5 es similar a ROT13 que se aplica a dígitos numéricos (0 a 9). ROT13 y ROT5 se pueden utilizar conjuntamente en el mismo mensaje.
El comando en Unix para aplicar el ROT5 es:
- tr 0-9 5-90-4
ROT47
El ROT47 es una variante del ROT13 que, además de desordenar las letras básicas, también trata números y muchos otros caracteres. En lugar de usar la secuencia A-Z como alfabeto, el ROT47 utiliza un alfabeto más largo derivado de una codificación de caracteres llamada ASCII. El ASCII asocia letras, dígitos, signos de puntuación y otros caracteres especiales con una serie de números que van del 0 al 127. Visto en ASCII, el ROT13 cubre los códigos 65–90 y 97–122: las letras mayúsculas y minúsculas, respectivamente. En cambio, el ROT47 emplea 94 caracteres, desde ! (el signo de exclamación, código ASCII 33) a ~ (la tilde, código ASCII 126), rotándolos con un desplazamiento de 47. El uso de un alfabeto más largo está destinado a producir más ofuscación que el ROT13, pero el ROT47 se utiliza mucho menos.
Al aplicar el ROT47 al ejemplo anterior (entero en texto en claro) se obtiene:
¿ró>@ D6 AF656 5:DE:?8F:C 2 F? 6IEC@G6CE:5@ 56 F? :?EC@G6CE:5@ 6? =2 }$pn t? =@D 2D46?D@C6D[ 6= 6IEC@G6CE:5@ >:C2 =@D K2A2E@D 56 =@D ~%#~$ E:A@D]
El comando en Unix para aplicar el ROT47 es:
- tr '!-~' 'P-~!-O'
memfrob()
La biblioteca de C de GNU (un conjunto de rutinas estándar para su uso en programación informática) contiene una función — memfrob()[8] — que tiene el mismo objetivo que el ROT13, aunque está destinada para usarla con datos binarios arbitrarios. La función trabaja combinando cada byte con la secuencia binaria 00101010 (42 en decimal) utilizando la operación o exclusivo (XOR). Esto efectúa un cifrado XOR sencillo. Al igual que el ROT13, memfrob() es autorrecíproco; también es igual de inseguro (es decir, es igual de trivial descifrarlo sin conocer la clave).
Implementaciones
Implementaciones para Unix de RO13
- tr A-Za-z N-ZA-Mn-za-m
- sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm
Implementación en C de ROT13
Una posible implementación en C, para codificación ASCII, sería la siguiente.
char* rot13(char *p)
{
size_t i;
char c;
for (i = 0; p[i] != '\0'; ++i) {
switch (p[i]) {
case 'A' ... 'Z':
c = 'A'; //Escoge el abecedario de mayúsculas.
break;
case 'a' ... 'z':
c = 'a'; //Escoge el abecedario de minúsculas.
break;
default:
continue;
}
/* p[i] - c : Consigue indice en el abecedario. Ej: A->0, Z->25, N->13
* p[i] - c + 13 : Mueve el indice 13 posiciones. Ej: A->13, Z->38, N->26
* (p[i] - c + 13) % 26 : Rota las posiciones. Ej: A->13, Z->12, N->0
* (p[i] - c + 13) % 26 + c: Convierte el indice al abecedario. Ej: A->N, Z->M, N->A
*/
c = (p[i] - c + 13) % 26 + c;
p[i] = c;
}
return p;
}
En esta implementación se obvian las letras que no están en el alfabeto de ASCII no se reemplazan.
Implementación en VB de ROT47
Una posible implementación de ROT47 en VB6. El cifrado queda claramente expuesto en el bucle.
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Function Rot47(ByVal Texto As String) As String
Dim n() As Integer, max As Long, k As Long, t As Integer
If Texto <> "" Then
max = Len(Texto)
ReDim n(0 To max - 1)
Call CopyMemory(ByVal VarPtr(n(0)), ByVal StrPtr(Texto), max * 2)
For k = 0 To max - 1
t = n(k)
If t > 32 And t < 127 Then
If t < 80 Then
n(k) = t + 47
Else
n(k) = t - 47
End If
End If
Next
Call CopyMemory(ByVal StrPtr(Texto), ByVal VarPtr(n(0)), max * 2)
Erase n
End If
Rot47 = Texto
End Function
Debe notarse que se pasa la cadena de texto a una matriz para ganar en velocidad de cálculo y finalmente se deposita en la cadena de texto. Igualmente debe notarse que se pasa a una matriz de enteros debido a la codificación de 2 bytes por carácter, si se opera con 1 byte por carácter debe usarse una matriz de bytes y copiar solo max bytes y no max * 2 bytes.
Véase también
Notas
- Google mac groups (en inglés)
- net.jokes Enlace al archivo del grupo de noticias (en inglés).
- los primeros usos del ROT13 que se pueden encontrar en archivo USENET de Google datan del 8 de octubre de 1982, publicados en el grupo de noticias net.jokes .
- (PDF) Enlace al artículo en formato PDF (en inglés).
- Bruce Perens Archivado el 23 de diciembre de 2005 en Wayback Machine. analiza el caso Sklyarov (en inglés)
- Archivado el 9 de junio de 2012 en Wayback Machine.,, son ejemplos (en inglés).
- Entrada en el Free On-Line Dictionary of Computing (en inglés).
- Descripción técnica de la función Archivado el 30 de marzo de 2014 en Wayback Machine. (en inglés).
Referencias
- Eric S. Raymond (Editor), Jargon File, .
- Bruce Schneier, Applied Cryptography, 2nd edition, Wiley, 1996, p11. ISBN 0-471-11709-9.
Enlaces externos
- Codificador ROT13 en línea
- Software para codificar en ROT13 en un gran número de lenguajes: incluye un parche para SSH que añade soporte para ROT13, y una herramienta de criptoanálisis que distingue automáticamente el texto en ROT13 del texto en claro.
- Codificador ROT47 en línea
- Online Converter for ROT5 and ROT13 (no requiere JavaScript)