lunes, 26 de octubre de 2015

Criptografía

Cifrados clásicos

En criptografía, un cifrado por transposición es un tipo de cifrado en el que unidades de texto plano se cambian de posición siguiendo un esquema bien definido; las 'unidades de texto' pueden ser de una sola letra (el caso más común), pares de letras, tríos de letras, mezclas de lo anterior,... Es decir, hay una permutación de 'unidades de texto'. Este tipo de cifradores eran muy usados en la criptografía clásica y por tanto, al tener que hacer los cálculo por medios muy básicos, normalmente el algoritmo se basaba en un diseño geométrico o en el uso de artilugios mecánicos (Ej escítala). Este tipo de algoritmos son de clave simétrica porque es necesario que tanto el que cifra como el que descifra sepan la misma clave para realizar su función. La clave puede es intrínseca en el propio método de cifrado/descifrado de forma que algoritmo y clave son un conjunto indivisible.

Ejemplos

  • Por ejemplo un simple (y fácil de descifrar) método de cifrado es el de escribir una palabra al revés (de atrás hacia delante). Por tanto la cadena: "Hola mi nombre es Pepa" sería cifrada por "aloH im erbmon se apeP". En este algoritmo la clave está implícita.
  • Otro ejemplo sería el cifrado con forma de columna. En él el mensaje original estará limitado a un rectángulo, de izquierda a derecha y de arriba hacia abajo. Después, se escoge una clave para asignar un número a cada columna del rectángulo para determinar el orden. El número correspondiente a la letra de la clave estará determinado por su posición en el alfabeto, por ejemplo. A es 1, B es 2, C es 3, etc. Por ejemplo si la palabra clave es CAT ("gato" en inglés) y el mensaje es "THE SKY IS BLUE" ("El cielo es azul" en inglés), el proceso sería el siguiente:
                         C A T
                         3 1 20
                         T H E
                         S K Y
                         I S B
                         L U E
Después, tomamos las letras por orden numérico y así es como transportaríamos el mensaje. Tomamos la columna debajo de la A primero, después la columna de C, y por último la columna de T, y como resultado el mensaje "The sky is blue" pasaría a ser: HKSUTSILEYBE
  • En el método de cifrado por transposición Chino, las letras del mensaje son escritas de derecha a izquierda y de abajo a arriba en columnas. Después, empezando la primera hilera, las letras se toman para obtener el texto cifrado. Por ejemplo, si el mensaje que queremos codificar es THE DOG RAN FAR ("El perro corrió lejos" en inglés), el cifrado chino sería así:
                           R R G T
                           A A O H
                           F N D E
El texto cifrado se leería: RRGT AAOH FNDE

Cifrados por transposición

Los cifrados por transposición reordenan el texto de acuerdo con algún esquema. Este reordenamiento se hacía clásicamente con la ayuda de algún tipo de figura geométrica.
Primero el texto a cifrar se escribía en la figura de una forma determinada y después se extraía de la figura de una forma diferente, quedando cifrado. La llave (clave) consiste pues en la forma de introducir y sacar el texto de la figura.
La figura escogida la mayoría de las veces era una matriz bidimensional. Como ejemplos podemos distinguir:
  • Cifrado por transposición columnar
  • Cifrado por transposición

Cifrado por transposición columnar

Descripción
Dado un texto a cifrar, se escribe por filas en una matriz de una anchura predeterminada y se obtiene el texto cifrado leyendo las columnas en algún orden. Por ejemplo, para cifrar el texto "El cristal roto empezaba a crecer de nuevo", con una anchura de bloque de 6 caracteres hacemos:
E   L   C   R   I   S
T   A   L   R   O   T
O   E   M   P   E   Z
A   B   A   A   C   R
E   C   E   R   D   E
N   U   E   V   O
Ahora lo que se hace es leer el texto por columnas en cualquier orden. Por ejemplo, en el orden 2-4-6-1-3-5 tenemos:
LAEBCU RRPARV STZRE ETOAEN CLMAEE IOECDO
La llave (clave) de este cifrado es la permutación que se ha usado y las dimensiones de la tabla.
Criptoanálisis
Como se ha explicado anteriormente lo único que hace este método es considerar el texto escrito por filas en una matriz y volver a escribir este texto cogiendo las columnas de dicha matriz. Debemos tener en cuenta que la llave (clave) en este cifrado es la permutación que se ha utilizado, es decir, la forma de elegir las columnas, y las dimensiones de la matriz donde se escribe el texto.
Teniendo en cuenta lo expuesto en el párrafo anterior, y que al escribir el texto cifrado hay espacios en blanco entre los "trozos" de texto que se corresponden con las columnas, entonces, una forma de realizar el criptoanálisis al texto anteriormente cifrado puede ser la siguiente:
  • Coger el texto cifrado y volverlo a poner en una matriz como la explicada anteriormente.
  • Intercambiar las columnas de dicha matriz hasta obtener un texto con sentido.
Para facilitar la labor debemos tener en cuenta que la columna de menor longitud será la última columna de la matriz original. Entonces, partiendo de la tabla:
L   R   E   C   I   S
A   R   T   L   O   T
E   P   O   M   E   Z
B   A   A   A   C   R
C   R   E   E   D   E
U   V   N   E   O
Realizando distintas permutaciones entre las columnas de la misma podemos volver a obtener la matriz original:
E   L   C   R   I   S
T   A   L   R   O   T
O   E   M   P   E   Z
A   B   A   A   C   R
E   C   E   R   D   E
N   U   E   V   O
Y, por tanto, podemos descifrar el mensaje:
El cristal roto empezaba a crecer de nuevo

Cifrado por transposición

Descripción
Dado un texto a cifrar, se escribe por filas en una matriz de una anchura predeterminada y luego se cambian las columnas de sitio. Por ejemplo, para cifrar el texto "A quien madruga Dios le ayuda", con una anchura de bloque de 5 caracteres hacemos:
A   Q   U   I   E
N   M   A   D   R
U   G   A   D   I
O   S   L   E   A
Y   U   D   A   H
Metemos cualquier carácter de relleno al final, para que la matriz quede completamente rellena y cambiamos las columnas de sitio, por ejemplo, las ponemos en el orden 3-5-2-1-4 y obtenemos:
U   E   Q   A   I
A   R   M   N   D
A   I   G   U   D
L   A   S   O   E
D   H   U   Y   A
Con lo que el texto cifrado queda:
EQAI ARMND AIGUD LASOE DHUYA
Más formalmente, lo que se hace es dividir el texto en bloques de una longitud fija y aplicar a cada bloque una permutación p. En el ejemplo anterior, se dividiría el texto en bloques de 5 caracteres:
AQUIE NMADR UGADI OSLEA YUDAH
Se le añaden letras al final para terminar de llenar un bloque y se aplica la permutación (1, 3, 2, 5,4), con lo que se llega el resultado UEQAI ARMND AIGUD LASOE DHUYA, que coincide con el obtenido anteriormente.
Criptoanálisis
Para realizar el criptoanálisis de un texto que ha sido cifrado con este método debemos seguir los pasos considéranos en el apartado de cifrado por transposición columnar.
Además de lo expuesto anteriormente hay que tener en cuenta que ahora los huecos son rellenados con caracteres. Entonces, dado un texto cifrado con este método y sin espacios en blanco para delimitar las columnas, podríamos obtener el número de columnas de la matriz sin más que conocer la longitud del texto cifrado, pues el número de columnas debe ser un divisor de este.
Como ejemplo de lo expuesto en el párrafo anterior consideremos el texto cifrado del anterior ejemplo:
UEQAIARMNDAIGUDLASOEDHUYA
Como la longitud de este texto es de 25 caracteres, y como:
25 = 5 • 5
Entonces, sabemos que la matriz debe contener 5 columnas. Con esta información podemos dividir el texto anterior y obtener la matriz del texto cifrado, con la que realizando distintas permutaciones entre sus columnas podríamos obtener la matriz del texto llano correspondiente a dicho texto cifrado, y con lo cual descifraríamos el mensaje oculto en el texto cifrado.









Inventado hacia 150 a. C. por el historiador Polibio, el cuadrado de Polibio fue utilizado principalmente por nihilistas rusos encerrados en las prisiones zaristas.
Se trata de un algoritmo trivial, donde cada letra del alfabeto es reemplazada por las coordenadas de su posición en un cuadrado. Es un caso particular de transposición mono-alfabética. Este tipo de código no resiste a un análisis de frecuencias.

Principio

Tomamos un cuadrado de Polibio con lugares cuadrados. Es posible extenderlo a 36 para agregar cifras y signos de puntuación.
En este caso, pondremos la I y la J juntas para poder entrar en 25 lugares.
12345
1ABCDE
2FGHI, JK
3LMNOP
4QRSTU
5VWXYZ
De esta manera, el texto"Wikipedia" será codificado así: La"W" está en la línea 5 y en la columna 2, y por lo tanto, le corresponde el 52. El resto de las letras se cifra de manera análoga.
Ejemplo:
52242524351514241103111015331324133134351514241103124124215

Polibio, historiador griego del siglo II aC, ideó un sistema para poder transmitir mensajes indescifrables a larga distancia. Se basaba en un tablero conocido como Tablero o Cuadrado de Polibio.
En él cada letra es equivalente a una pareja de ellas, correspondiendo a la fila y a la columna que forman sus coordenadas. Así si se quería cifrar un mensaje se sustituirían cada una de las letras que lo forman por el par de letras que le correspondían en el tablero.
Si en el tablero se introducían cifras en lugar de letras para formar las coordenadas de cada uno de los caracteres se consiguía una variante que ha servido de base para otros sistemas de cifrado.
Es curioso destacar que este deseo de encriptar mensajes llevó a Polibio a imaginar una solución para transmitir los mensajes con antorchas ardiendo. Estaríamos ante una variante del código morse.









La escritura especular o escritura en espejo es un método de escritura que se logra trazando ellápiz sobre el papel en la dirección opuesta a la que es usada por la mayoría de los amanuenses, de tal manera que el resultado es una imagen enespejo (invertida) de la escritura habitual. Su empleo más común, cuando el idioma se escribe desde la izquierda hacia la derecha, es por parte de personas zurdas. A veces se utiliza como una forma extremadamente primitiva de cifrado. Su ejemplo más común en la actualidad puede verse al frente de las ambulancias, donde la palabra "AMBULANCIA" aparece en escritura especular con el objetivo de que los conductores que se encuentren delante de ella lean la palabra en el sentido normal en susespejos retrovisores.
Leonardo da Vinci es famoso porque en muchas de sus anotaciones personales utilizó este método que combinaba con el uso de siglas y abreviaciones para hacer más difícil su lectura por otras personas. Sólo utilizaba la manera estándar de escritura si tenía previsto que sus anotaciones fueran leídas por otras personas. Leonardo da Vinci era ambidiestro, y solía escribir con la izquierda, lo que provocaba que la tinta manchara fácilmente si escribía en escritura estándar, es decir, de izquierda a derecha.









Ottendorf se refiere, en criptografía, a un código compuesto por grupos de 3 números, a primera vista se supondrían aleatorios, pero en realidad, cada grupo representan una letra.
Esta/s letras se obtienen de algún libro, revista o cualquier documento escrito que se toma como base para obtener la palabra o palabras a encontrar.
El primer número representa el párrafo o la página del documento en la cual buscar.
El segundo número indica la línea o renglón de la página.
El tercer número nos señala la letra a utilizar contando de izquierda a derecha.
Por ejemplo 115-23-11
página 115, línea 23, letra número 11








ROT13 («rotar 13 posiciones», a veces con un guion: ROT-13) 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 alfabetoA se convierte en NB se convierte en O y así hasta la M, que se convierte en Z. Luego la secuencia se invierte: N se convierte en AO 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, un spoiler 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 es simétrico; esto es, para deshacer el ROT13, se aplica el mismo algoritmo, de manera que para cifrar y descrifrar se puede utilizar el mismo código.

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 nB 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:
\mbox{ROT}_{13}(\mbox{ROT}_{13}(x))=\mbox{ROT}_{26}(x)=x 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.jokes2 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 incompatibildades 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í sólo 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 sólo 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 cifradovisiblemente 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 dobleROT26 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 delTriple DES).
En 2001, el criptoanalista ruso Dmitry Sklyarov fue arrestado tras detallar las debilidades de los sistemas de protección de copia de los ebooks. 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

abcdefghijklmnopqrstuvwxyz
NOPQRSTUVWXYZABCDEFGHIJKLM
arar ↔ nenecherne ↔ purear
chan ↔ punabu ↔ oh
chane ↔ punarerar ↔ rene
pena ↔ cranprear ↔ cerne
ora ↔ bentena ↔ gran
un ↔ have ↔ 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, ychechen 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 enarenarbananoenviarnana 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 sólo 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-Zcomo 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 librería 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 maxbytes y no max * 2 bytes.

No hay comentarios:

Publicar un comentario