ROT13

De Viquipèdia
Dreceres ràpides: navegació, cerca
ROT13
ROT13-es.png
L'acció del xifrat ROT13 és substituir cada lletra del text clar per una altra que estigui 13 llocs més endavant a l'alfabet. En aquest exemple «HOLA» esdevé «UBYN».
General
Data primera publicació Segle I aC
Desenvolupat a partir de Xifratge de Cèsar
Detall
Estructura Xifratge per substitució
Millor criptoanàlisi pública

ROT13 (de l'anglès rotate by 13 places: «girar 13 posicions», de vegades escrit amb guió ROT-13) és un xifratge per substitució simple que substitueix cada lletra per la corresponent lletra situada 13 posicions després en l'alfabet. ROT13 és un exemple del xifratge de Cèsar,[1] desenvolupat a l'antiga Roma.

En l'alfabet llatí bàsic, de 26 caràcters, ROT13 és el seu propi invers; és a dir, per desfer ROT13, s'aplica el mateix algorisme, pel que la mateixa acció es pot utilitzar per a la codificació i la descodificació. L'algorisme no proporciona pràcticament cap seguretat criptogràfica, i se'l cita sovint com un exemple canònic de xifrat dèbil.

ROT13 s'utilitza en els fòrums d'Internet com a mitjà d'ocultació d'spoilers o filtracions, bromes, solucions de trencaclosques, i materials ofensius a la mirada fortuïta. ROT13 s'ha descrit com l'«equivalent de Usenet d'una revista que imprimeix la resposta a un qüestionari a l'inrevés».[2] ROT13 ha inspirat diversos jocs de lletres i paraules a Internet, i s'esmenta sovint en converses de grups de discussió.

Descripció[modifica | modifica el codi]

Per tal d'aplicar ROT13 a una part d'un text només cal examinar-ne els caràcters alfabètics i substituir-los cada un per la lletra situada 13 posicions més endavant en l'alfabet, seguint pel principi si cal.[3] Així, en l'alfabet llatí bàsic de 26 caràcters, la A es converteix en N, la B esdevé O, i així successivament fins a la M, que es converteix en Z. Llavors la seqüència continua pel principi de l'alfabet: la N es converteix en A, la O es converteix en B, i així successivament fins a la Z, que es converteix en M. És, per tant, un cas particular del xifratge afí. Només les lletres que apareixen en l'alfabet llatí bàsic es veuen afectades; els nombres, símbols, espais en blanc i tots els altres caràcters no es modifiquen. Com que hi ha 26 lletres en l'alfabet anglès i 26 = 2 × 13, la funció ROT13 és la seva pròpia funció inversa:[3]

\mbox{ROT}_{13}(\mbox{ROT}_{13}(x))=x per a qualsevol text x en l'alfabet llatí bàsic.

En altres paraules, dues aplicacions successives de ROT13 restauren el text original (en matemàtiques, això de vegades s'anomena una involució; en criptografia, un xifrat recíproc).

La transformació es pot realitzar usant una lookup table, com ara la següent:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm

Per exemple, en el següent acudit, el final s'ha amagat utilitzant ROT13:

Per què el pollastre va creuar la carretera?
Cre neevone n y'nyger pbfgng!

En transformar tot el text a través de ROT13, es revela la resposta de l'acudit:

Cre dhr ry cbyynfger in perhne yn pneergren?
Per arribar a l'altre costat!

Tornar a aplicar ROT13 retornaria el text a la seva forma original.

Ús[modifica | modifica el codi]

ROT13 ja es feia servir al grup de discussió net.jokes a la dècada de 1980.[4] S'utilitza sovint per a ocultar bromes potencialment ofensives, o per a amagar una resposta d'un enigma o d'una filtració (per exemple, en l'argument d'una pel·lícula).[3][5] Es va escollir la rotació de 13 posicions, en comptes de, per exemple, 3 com en el sistema de xifrat original de Cèsar, perquè tretze és el valor per al qual la codificació i descodificació són equivalents, permetent d'aquesta manera la comoditat d'una sola ordre per a totes dues accions.[5] ROT13 s'inclou típicament com una funció estàndard en el programari de lectura de notícies.[5] De vegades també s'oculten les adreces de correu electrònic amb ROT13 per evitar els robots d'spam poc sofisticats.[6]

ROT13 és un exemple de l'algorisme de xifrat conegut com a xifratge de Cèsar, que s'atribueix a Juli Cèsar en el segle primer abans de Crist.[7]

ROT13 no està destinat a utilitzar-se quan hi ha preocupació pel secret del missatge —l'ús d'una rotació constant significa que el xifrat no té efectivament cap clau, i el desxifrat no requereix cap coneixement més enllà del fet que s'hagi utilitzat ROT13. Fins i tot sense aquest coneixement, l'algoritme es pot trencar fàcilment a través de l'anàlisi de freqüències.[3] A causa de la seva manca absoluta d'idoneïtat per a mantenir un secret veritable, ROT13 s'ha convertit en un eslògan per referir-se a qualsevol sistema de xifrat clarament dèbil: un crític podria afirmar que «el sistema DES de 56 bits és avui en dia poc millor que ROT13». En una broma sobre termes criptogràfics reals com «doble DES», han sorgit expressions com «doble ROT13», «ROT26» o «2ROT13» amb intenció humorística, incloent-hi un article acadèmic de paròdia «Sobre l'algoritme de xifrat 2ROT13».[8] Com que aplicar ROT13 a un text ja xifrat amb ROT13 restaura el text pla original, ROT26 és equivalent a no xifrat en absolut. Per extensió, triple ROT13 (usat de broma com a analogia del 3DES) és equivalent a un ROT13 regular.

El desembre de 1999, es va trobar que Netscape Communicator utilitzava ROT13 com a part d'un esquema insegur per emmagatzemar contrasenyes de correu electrònic.[9] El 2001, programador rus Dimitry Sklyarov va demostrar que un venedor de llibres electrònics, New Paradigm Research Group (NPRG), utilitzava ROT13 per xifrar els seus documents; s'ha especulat que NPRG podria haver confós l'exemple d'implementació de ROT13 —proporcionat a l'equip de desenvolupament de programari d'Adobe eBook— com un sistema de xifrat seriós.[10] Windows XP utilitza ROT13 en algunes de les seves claus de registre.[11] També s'ha utilitzat ROT13 en el programa de Unix Fortune per xifrar dites ofensives;[12] en qualsevol cas, el programa ja ha estat eliminat de FreeBSD.[13]

El xifrat ROT13 s'utilitza per a consells xifrats de caches a Geocaching.com.

Jocs de lletres i cultura de la xarxa[modifica | modifica el codi]

Parells de paraules generades amb ROT13
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
AresNerf abjurernowhere

ROT13 ofereix una oportunitat per als jocs de lletres. Quan s'aplica ROT13, algunes paraules es transformen en altres paraules. L'exemple més llarg (en anglès) és el parell de paraules de 7 lletres abjurer i nowhere; també s'ha trobat la parella Chechen i purpura. Altres exemples de paraules com aquestes es mostren a la taula.[14] La parella gnat i tang és un exemple interessant, on són els dos recíprocs ROT13 i (agafats en conjunt) formen un palíndrom.

L'International Obfuscated C Code Contest (IOCCC) de 1989 inclogué una entrada de Brian Westley. El programa de Westley es podia codificar en ROT13 o invertit, i en ambdós casos es compilava correctament. El seu funcionament, en executar-se, era o bé dur a terme la codificació ROT13, o revertir-la.[15]

El grup de discussió alt.folklore.urban va encunyar una paraula (furrfu) que era la codificació ROT13 de la freqüent exclamació sheesh. «Furrfu» va evolucionar a mitjans de 1992 com una resposta a les publicacions que repetien llegendes urbanes a alt.folklore.urban, després que alguns participants es queixessin que «Sheesh!» s'utilitzava excessivament en resposta als nouvinguts.[16]

En català no s'han estudiat jocs de lletres similars tot i que és probable que també n'hi hagi.

Variants[modifica | modifica el codi]

ROT5[modifica | modifica el codi]

ROT5 és una pràctica similar a ROT13 que s'aplica a dígits numèrics (de 0 a 9). ROT13 i ROT5 es poden utilitzar conjuntament en el mateix missatge.

ROT47[modifica | modifica el codi]

ROT47 és un derivat de ROT13 que, a més de codificar les lletres bàsiques, també s'encarrega de fer-ho amb els números i símbols més comuns. En lloc d'utilitzar la seqüència A-Z com a alfabet, ROT47 utilitza un conjunt més ampli de caràcters del codi de caràcters comú conegut com a ASCII. En concret, els caràcters imprimibles de 7 bits, excloent l'espai, des del decimal 33, !, al 126, ~ (94 en total), presos en l'ordre dels valors numèrics dels seus corresponents codis ASCII, són girats 47 posicions. Per exemple, el caràcter A s'assigna a p, mentre que a s'assigna a 2. L'ús d'un alfabet més gran produeix una ofuscació més completa que la de ROT13; per exemple, un número de telèfon com +1-415-839-6885 no és evident a primera vista del text obfuscat Z`\c`d\gbh\eggd. D'altra banda, com que ROT47 introdueix números i símbols en la barreja sense fer cap discriminació, és més obvi que el text ha estat xifrat.

Exemple:

Tots els éssers humans neixen lliures i iguals en dignitat i en drets.

es codifica com a

%@ED 6=D /DD6CD 9F>2?D ?6:I6? ==:FC6D : :8F2=D 6? 5:8?:E2E : 6? 5C6ED]

memfrob()[modifica | modifica el codi]

La biblioteca de C de GNU, un conjunt de rutines estàndard disponibles per al seu ús a la programació informàtica, conté una funció, memfrob(),[17] que té un propòsit similar a ROT13, tot i que està dissenyada per funcionar amb dades binàries arbitràries. La funció opera mitjançant la combinació de cada byte amb el patró binari 00101010 (42) mitjançant l'operació de disjunció exclusiva (XOR). Això produeix un xifratge XOR simple. De la mateixa manera que ROT13, memfrob() és autorecíproca, i proporciona un nivell de seguretat semblant, és a dir, pràcticament nul.

Implementació[modifica | modifica el codi]

Implementacions en Unix[modifica | modifica el codi]

El ROT13 i ROT47 són prou senzills d'implementar utilitzant l'aplicació tr de la terminal d'Unix. Per xifrar la cadena «Tots els éssers humans neixen lliures i iguals en dignitat i en drets» utilitzant ROT13:

$ # Converteix les majúscules A-Z a N-ZA-M i les minúscules a-z a n-za-m
$ echo "Tots els éssers humans neixen lliures i iguals en dignitat i en drets" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
Gbgf ryf éffref uhznaf arvkra yyvherf v vthnyf ra qvtavgng v ra qergf
$ tr 'A-Za-z' 'N-ZA-Mn-za-m' <<<"Tots els éssers humans neixen lliures i iguals en dignitat i en drets"
Gbgf ryf éffref uhznaf arvkra yyvherf v vthnyf ra qvtavgng v ra qergf

I per xifrar la mateixa cadena utilitzant ROT47:

$ echo "Tots els éssers humans neixen lliures i iguals en dignitat i en drets" | tr '\!-~' 'P-~\!-O'
%@ED 6=D éDD6CD 9F>2?D ?6:I6? ==:FC6D : :8F2=D 6? 5:8?:E2E : 6? 5C6ED

i

$ tr '\!-~' 'P-~\!-O' <<<"Tots els éssers humans neixen lliures i iguals en dignitat i en drets"
%@ED 6=D éDD6CD 9F>2?D ?6:I6? ==:FC6D : :8F2=D 6? 5:8?:E2E : 6? 5C6ED

També es pot implementar el xifratge ROT13 utilitzant sed:

sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm

Implementacions en C[modifica | modifica el codi]

Una possible implementació en C, per a codificació ASCII, seria la següent:

char* rot13(char *p)
{
    size_t i;
    char c;
 
    for (i = 0; p[i] != '\0'; ++i) {
        switch (p[i]) {
            case 'A' ... 'Z':
                c = 'A'; //Escull l'alfabet de majúscules.
                break;
            case 'a' ... 'z':
                c = 'a'; //Escull l'alfabet de minúscules.
                break;
            default:
                continue;
        }
 
        /*  p[i] - c               : Aconsegueix l'índex a l'alfabet. Ex: A->0,  Z->25, N->13
         *  p[i] - c + 13          : Mou l'índex 13 posicions.        Ex: A->13, Z->38, N->26
         * (p[i] - c + 13) % 26    : Rota les posicions.              Ex: A->13, Z->12, N->0
         * (p[i] - c + 13) % 26 + c: Converteix l'índex a l'alfabet.  Ex: A->N,  Z->M,  N->A
         */
 
        c = (p[i] - c + 13) % 26 + c;
        p[i] = c;
    }
 
    return p;
}

En aquesta implementació s'obvien les lletres que no són a l'alfabet ASCII.

Implementacions en Visual Basic[modifica | modifica el codi]

Una possible implementació de ROT47 en Visual Basic 6 és la següent:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
 
Public Function Rot47(ByVal Text As String) As String
    Dim n() As Integer, max As Long, k As Long, t As Integer
 
    If Text <> "" Then
        max = Len(Text)
        ReDim n(0 To max - 1)
        Call CopyMemory(ByVal VarPtr(n(0)), ByVal StrPtr(Text), 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(Text), ByVal VarPtr(n(0)), max * 2)
        Erase n
    End If
 
    Rot47 = Text
End Function

Cal notar que es passa la cadena de text a una matriu per guanyar en velocitat de càlcul i finalment es desa en la cadena de text. Igualment cal notar que es passa a una matriu d'enters a causa de la codificació de 2 bytes per caràcter; si s'opera amb 1 byte per caràcter s'ha d'utilitzar una matriu de bytes i copiar només max bytes i no max * 2 bytes.

Usant l'editor de text Vim[modifica | modifica el codi]

En l'editor de text Vim, es pot aplicar ROT13 a un text seleccionat amb l'ordre:[18]

g?

Referències[modifica | modifica el codi]

  1. Massich Vall, Francesc. Disseny, planificació, realització i anàlisi d'un taller de matemàtiques adreçat a alumnat de secundària (PDF). Barcelona: Departament de Matemàtica Aplicada i Anàlisi, Universitat de Barcelona, 21 de juny de 2013, p. 20 [Consulta: 14 d'octubre de 2014]. 
  2. Horrocks, Bruce. «UCSM Cabal Circular #207-a» (en anglès). Usenet group uk.comp.sys.mac (Message ID UZ36hgCSoh$+EwqG@nodomain.nodomain.us), 28 de juny de 2003. [Consulta: 17 de setembre de 2007].
  3. 3,0 3,1 3,2 3,3 Schneier 1996, p. 11.
  4. S'han trobat usos primerencs de ROT13 a l'arxiu USENET de Google amb data de 8 d'octubre de 1982, escrits al grup de notícies net.jokes:
  5. 5,0 5,1 5,2 Raymond, Eric S. (ed.). «ROT13» (en anglès). The Jargon File, 4.4.7, 29 de desembre de 2003. [Consulta: 19 de setembre de 2007].
  6. Ferner, Matt. «How to Hide Email Addresses From Spam Bots» (en anglès). PracticalEcommerce. [Consulta: 12 de juny de 2014].
  7. Kahn 1997.
  8. «On the 2ROT13 Encryption Algorithm» (PDF) (en anglès), 1 d'abril de 2005. [Consulta: 28 d'octubre de 2014].
  9. Hollebeek, Tim; Viega, John. «Bad Cryptography in the Netscape Browser: A Case Study» (en anglès). Reliable Software Technologies. [Consulta: 28 d'agost de 2014].
  10. Perens, Bruce. «Dimitry Sklyarov: Enemy or friend?» (en anglès). ZDNet News, 1 de setembre de 2001. [Consulta: 3 de febrer de 2011].
  11. Ferri, Vic. «The Count Keys in the Windows Registry» (en anglès). ABC: All 'Bout Computers, 4 de gener de 2007. [Consulta: 20 de setembre de 2007].
  12. «offensive fortunes» (en anglès). Database Administrator, 18 de setembre de 2007. [Consulta: 1 de juliol de 2014].
  13. «Log of /head/games/fortune/datfiles/Makefile» (en anglès). jhb, 12 de març de 2013. [Consulta: 1 de juliol de 2014].
  14. De Mulder, Tom. «ROT13 Words» (en anglès). Furrfu!. [Consulta: 19 de setembre de 2007].
  15. Westley, Brian. «westley.c». IOCCC, 1989. [Consulta: 13 d'agost de 2007].
  16. «Furrfu» (en anglès). Foldoc, 25 d'octubre de 1995. [Consulta: 13 d'agost de 2007].
  17. «5.10 Trivial Encryption» (en anglès). The GNU C Library Reference Manual. Free Software Foundation, 3 de desembre de 2006. [Consulta: 20 de setembre de 2007].
  18. Best of VIM Tips, gVIM's Key Features zzapper (en anglès). 

Bibliografia[modifica | modifica el codi]

Vegeu també[modifica | modifica el codi]