Haxcra27

Embed Size (px)

Citation preview

  • 8/14/2019 Haxcra27

    1/68

  • 8/14/2019 Haxcra27

    2/68

    P I D E L O S N U M E R O S AT R A S A D O S EN - -> WWW.HACKXCRACK.COM

    TELFONO DE ATENCIN AL CLIENTE:977 22 45 80Peticin de Nmeros atrasados y Suscripciones (Srta. Genoveva)HORARIO DE ATENCIN:DE 9:30 A 13:30

    (LUNES A VIERNES) Copyright Editotrans S.L.NUMERO 26 -- PRINTED IN SPAINPERIOCIDAD MENSUALDeposito legal: B.26805-2002Cdigo EAN: 8414090202756

    PP

    A A

    SS

    OO

    PP A S O A S O aaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

    Quieres insertar publicidad en PC PASOA PASO? Tenemos la mejor relacinprecio-difusin del mercado editorial enEspaa. Contacta con nosotros!!!

    EDITORIAL: EDITOTRANS S.L.C.I.F: B43675701PERE MARTELL N 20, 2 - 143001 TARRAGONA (ESPAA)Director EditorialI. SENTISE-mail [email protected] de la publicacinLos Cuadernos de HACK X CRACK.Nombre Comercial de la publicacnPC PASO A PASOWeb : www.hackxcrack.comDireccin: PERE MARTELL N 20, 2 - 1.

    43001 TARRAGONA (ESPAA)IMPRIME:I.G. PRINTONE S.A. Tel 91 808 50 15DISTRIBUCIN:SGEL, Avda. Valdeparra 29 (Pol. Ind.)28018 ALCOBENDAS (MADRID)Tel 91 657 69 00 FAX 91 657 69 28WEB: www.sgel.es

    Esta es, posiblemente, una de las editoriales ms importantes desde que finiciado el Proyecto Hack x Crack.

    Desde que esta revista sali al mercado, muchos han sido los problemas qhan sido superados para estar cada mes en tus manos, pero esta vez ha sitoda una odisea. Por qu? La verdad, porque a veces las fuerzas falta

    Hasta ahora el trabajo ha recado sobre muy, muy, muy pocas personas, y lleun momento que es imposible abarcarlo todo como muy bien sabis nuestrolectores, hay temas muy abandonados (Web, Servidores de prcticas Hay muchas promesas no cumplidas, no hay tiempo real para cumplirlas y eha llegado a socavar los cimientos del proyecto. Hay una excepcin en esescena que es el --Foro de Hack x Crack--, que gracias a sus administradory moderadores, hoy es mucho ms que un foro.

    Ante la imposibilidad de seguir gestionando la revista de esta forma, el ProyeHack x Crack est cambiado sus cimientos se ha creado un ncleo Gestin (formado por personas del Foro) que intentar, poco a poco, retomlos objetivos iniciales y gestionar muchos aspectos de la revista, desde la Whasta el filtrado de textos que sern publicados.

    Esperamos que con la nueva lnea iniciada, este proyecto multiplique sus fuery esto se vea reflejado en todas las reas. Para empezar hemos empezadomodificar la maquetacin, aspecto muy criticado por nuestros lectores. Peesto es solo la punta del iceberg, necesitaramos un par de pginas para explilos cambios que se han iniciado as que psate por el foro y podrs vivir tiempo real estos cambios, esta nueva poca.

    Preprate para el prximo nmero y los siguientes, porque los cambios ndejarn de sucederse. El Proyecto HXC pasa a ser un proyecto abierto y eoxgeno necesario para crecer ya ha empezado a llegar gracias a la colaboracidesinteresada de personas que creen firmemente en HXC.

    Ahhh se nos olvidaba algo importantsimo: la revista pasa a ser BIMESTRAEsperamos que todos los cambios den su fruto y poder volver a salmensualmente, pero no mataremos la semilla plantada ahogndola en abonartificiales cuando PC PASO A PASO / Los Cuadernos de Hack x Crackvuelva a disfrutar de una tirada MENSUAL ser porque los cimientos dProyecto finalmente se habrn asentado. Un abrazo a todos!!

  • 8/14/2019 Haxcra27

    3/68

    por Moleman (AKA Hctor Monlen)

    Bienvenidos a este taller de Python. En unos cuantos artculos espero ensearos a programar eneste lenguaje que personalmente me apasiona, y espero que dentro de poco a vosotros tambin.

    No me enrollo ms y vamos al grano!!!

    3/68

    Taller de Python "Episodio 1"

    Bien, el primer paso es descargarse el intrprete de Pythonsi es que no lo tenis ya.

    Por si no lo sabis Python es un lenguaje interpretado, esdecir, lo que se programa es un script que luego se le pasa

    al intrprete que lo ejecutar. Esto permite hacer rpidasmodificaciones del programa al no tener que compilar cadavez, como ocurre por ejemplo con el lenguaje C.

    (Los que sepis algo de C notareis que la sintaxis se pare-ce bastante. No es una coincidencia )

    Los Linux Users deberais tener el intrprete instalado pordefecto. Podris comprobar si lo tenis simplemente

    ejecutando en una consola:

    Shadowland:~$ python

    Python 2.3.2 (#2, Oct 6 2003, 08:02:06)

    [GCC 3.3.2 20030908 (Debian prerelease)] on linux2

    Type "help", "copyright", "credits" or "license" for more information.

    >>>

    El ">>>" es el prompt del intrprete esperando a que unaorden sea introducida. Ms adelante veremos esto en msdetalle.

    Para salir simplemente pulsad Ctrl+D.

    Si no lo tenis, podis descargaros las fuentes para compi-lar (para Unix & Linux en general y para Mac OS X) de:

    http://www.python.org/ftp/python/2.4/Python 2.4.tgz

    Para sistemas Windows hay un setup aqu:

    http://www.python.org/ftp/python/2.4/python 2.4.msiY aqu un instalador para Mac OS X (si no queris compi-larlo):

    http://ftp.cwi.nl/jack/python/mac/MacPython OSX 2.3 1.dmg

    (recomendado leerse antes la documentacin del instalador enhttp://homepages.cwi.nl/~jack/macpython/download.html )

    Existen en Python los siguientes operadores aritmticos(por orden de prioridad, de 1 a 4):

  • 8/14/2019 Haxcra27

    4/68

    4/68

    Los operadores lgicos son, por orden de prioridad:

    Los operadores de comparacin tiene todos la misma prio-ridad y son:

    La prioridad conjunta de todos ellos se define de mayor amenor, as:

    1. Aritmticos2. Comparacin3. Lgicos

    Hay que tener cuidado con las operaciones que aniden mu-chos operadores de distintos tipos, ya que el orden de pre-ferencia puede hacer que la operacin no salga como de-biera. Para paliar el problema mientras cogis prctica,siempre podis usar los parntesis como separadores deoperacin, verbi gratia:

    2*3+(4-3)/((4-5)**3)

    Os pondr unos ejemplos de este tipo de operaciones:

    Shadowland:~$ pythonPython 2.3.4 (#2, Sep 24 2004, 08:39:09)[GCC 3.3.4 (Debian 1:3.3.4-12)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> 2+35>>> 4-22>>> 5*210>>> 2**38>>> 4>5False

    >>> 5==5True>>> 2*3+(4-3)/((4-5)**3)5>>>

    Espero que vayis comprendiendo como funciona. Los va-lores True y False son valores que representan verdaderoy falso respectivamente. En Python es lo ms parecido que

    hay a datos booleanos (esto debera ir en el punto de lostipos de datos, pero no tiene mayor complicacin).

    Existen ms tipos de operadores, pero supongo que esmejor ms adelante cuando salga una ocasin de usarlos,ya que su complejidad es bastante ms elevada, como porejemplo los operadores >> y >> a=5>>> print a5>>>

    Como vemos, hemos asignado el valor entero 5 a la variable.

    Si hacemos:

    >>> b=5.0>>> print b5.0>>>

    Lo que estamos haciendo es asignar un valor flotante (de-cimal) a la variable.(es importante notar que el decimal serepresenta con punto y no con coma)

    En ningn caso hemos declarado el tipo de dato que con-tendr, aunque SI que hay que asignarle un valor antes deusar una variable o Python dar error.

    >>> print pruebaerror Traceback (most recent call last):File "", line 1, in ?

    NameError: name 'pruebaerror' is not defined>>>

    Python es case sensitive por lo que diferencia entremaysculas y minsculas. Tambin hay que tener en cuen-ta unas reglas para los nombres de las variables:

    1. Slo se pueden usar dgitos, letras y el carcter desubrayado. El espacio no est permitido, as como ca-racteres extraos.

    Taller de Python "Episodio 1"

  • 8/14/2019 Haxcra27

    5/68

    5/68

    2. No pueden usarse las palabras reservadas dePython: and, assert, break, class, continue, def,del, elif, else, except, exec, finally, for, from, glo-bal, if, import, in, is, lambda, not, or, pass, print,raise, return, try, while y yield.

    Veamos ahora algunos tipos de datos:

    En Python existen los enteros y los flotantes, como ya he-mos visto. As mismo se pueden usar los valores booleanosTrue y False como ya comentamos antes.

    Existe tambin el tipo de datos cadena . A diferencia delC, donde las cadenas son vectores de caracteres, enPython hasta un nico carcter se considera una cadena.(internamente son vectores, pero a nosotros nos da igualpor el momento. Por algo el Python es de alto nivel )

    Un ejemplo:

    >>> mi_cadena='hola mundo'>>> print mi_cadenahola mundo>>>

    Como podemos ver, las cadenas se delimitan con comillas,da igual si son simples o dobles, aunque si se quierenmostrar cadenas en el texto, es conveniente delimitar lacadena con dobles y mostrar las simples:

    >>> mi_cadena="'hola mundo'">>> print mi_cadena'hola mundo'>>>

    Las cadenas son muy sufridas (ya lo veremos ms adelan-te) y permiten muchos tipos de operaciones con ellas.

    A modo de abreboca, dos operaciones bsicas con cadenasson la concatenacin (con el signo + )

    >>> 'abcd'+'efgh''abcdefgh'>>>

    que sera como una suma entre cadenas, y la repeticin(con el signo * )

    >>> 'a'*10'aaaaaaaaaa'>>>

    que repite la cadena tantas veces como se le indique.

    Tambin se pueden hacer comparaciones entre cadenas.Python las analiza "alfabticamente" para compararlas:

    >>> 'hola'>>

    El resultado es verdadero porque la H va antes que la J.

    Veamos otro ejemplo:

    >>> 'Hola'>>

    Que ha pasado aqu? Por qu dice que es verdadero? Muysencillo. Realmente Python compara basndose en elcdigo ASCII y la 'H' tiene un cdigo "inferior" a la 'h'. Poreso el resultado da True.

    Ms adelante le meteremos mano a tratamientos avanza-dos sobre los datos, pero por el momento con esto nosbasta.

    Bien, vamos a escribir nuestro primer programa en Python.Hasta ahora hemos estado trasteando con el intrprete,pero ya es hora de ponernos serios. Que no os asuste, yaque este tema lo explicaremos en base al programa, y aalgunas modificaciones que le iremos introduciendo, altiempo que veremos en la prctica muchos conceptos deltema anterior. Adems este mismo programa nos servirpara explicar temas de los artculos siguientes, como tra-tamiento de cadenas y listas, sockets,...

    Bueno, primero hay que explicar que hace el programa, yluego iremos desglosando lnea a lnea segn vayamosviendo como funciona.

    Este programa bsicamente se conecta a Google para rea-

    lizar la bsqueda que le pongas y te pasa el resultado de-bidamente formateado y slo mostrando el nmero de re-sultados que se le indique.

    Complicado? Puede, pero slo debido a que an no sabisque hace cada cosa. Tranquilos y tiempo al tiempo.Adems es un programa que podis usar sin problemas yes un ejemplo tan bueno como cualquier otro, y desde lue-go mucho mejor que el tpico "hola mundo" que se suelehacer, verdad?

    Los programas se pueden ejecutar en cualquier sistema,tanto Windows, como Linux.

    En Windows bastar con hacer doble click sobre l (podiscrear el programa con el notepad o con el entorno idle delintrprete, o con cualquier editor que no formatee el textocomo por ejemplo el Word del Office. Debis guardar elprograma como .py . Os recomiendo el notepad), con uninconveniente: no veris el resultado porque cuando elprograma termine, la ventana de shell se cerrar.

    Taller de Python "Episodio 1"

  • 8/14/2019 Haxcra27

    6/68

    6/68

    Esto se soluciona ejecutando el programa desde una ven-tana de comandos:

    1. En Windows 9x, escribiendo: python programa.py

    2. En Windows 2000 o XP, escribiendo simplemente:programa.py

    O bien aadiendo una pausa al final del programa si estis

    empeados en ejecutarlo con doble click, pero esto ya loexplicare ms adelante. Es decir, de momento usad la ven-tana de comandos.

    En Linux, se puede ejecutar de dos formas:

    1. Como en Windows, desde una shell escribiendo:python programa.py

    2. Poniendo en la primera lnea del programa:#!/usr/bin/env python

    Esta lnea se encarga de buscar el intrprete en el siste-ma y puede ejecutarse el script como si fuera un progra-

    ma normal y corriente en consola, es decir: ./progra-ma.py(tenis que darle permisos de ejecucin, que no se os ol-vide)

    Bien, vamos a ejecutarlo a ver que pasa (yo usare en laspruebas, el primer mtodo en Linux, pero por nada en parti-cular, aunque el segundo mtodo es mejor y recomendable):

    Shadowland:~/python$ ./google.py

    Busqueda: hackxcrack Numero de resultados: 5

    http://www.hackxcrack.com/phpBB2/index.php

    http://dragonjar.nolimites.net/HTM/DragoN.php?subaction=showfull&http://www.forohxc.com/Docs/Seguridad/http://www.forohxc.com/Docs/Seguridad/http://www.hackemate.com.ar/ezines/hackxcrack/Shadowland:~/python$

    Como podis ver, para ejecutarlo simplemente tenemosque teclear python y el nombre del programa.

    El programa nos pide que introduzcamos la bsqueda yluego el numero de resultados que queremos ver. Fcil,verdad? Y despus nos muestra los resultados de nuestrabsqueda.

    Enfermera! Guantes y bistur que vamos a proceder a laautopsia... paso por paso.

    Cdigo del programa:

    #!/usr/bin/env python

    import httplibURL= 'www.google.com'COD_BUSQUEDA= '/search?num=100&q='

    Taller de Python "Episodio 1"

    CABECERA= ' ... \n
    'FIN= ' ' NUM_RESULTADOS= 10MAX_RESULTADOS= 50

    def formateaQuery(query):from string import joina = query.split()return join(a, '+')

    def google(query=None, n=None):if n is None:

    n = NUM_RESULTADOSif query is None:

    print "No se ha efectuado bsqueda"return - 1

    bsqueda = run (query,n)if bsqueda == -2:

    print 'Tu bsqueda para %s no ha arrojado resultados.' % (query.replace('+'return

    elif bsqueda == -1:print 'No se ha podido efectuar la conexin'return

    for x in bsqueda:print x

    def run(query,n):try:

    conn = httplib.HTTPConnection(URL)conn.request ("GET", COD_BUSQUEDA + formateaQuery(query))r = conn.getresponse()

    except:print 'No se ha podido efectuar la conexin'return -1

    if r.reason == 'OK':data = r.read()

    else:return -1

    conn.close()aux = data.split(CABECERA)aux.pop(0)if len(aux) == 0:

    return -2bsqueda = []i = 0while n != 0 and i < MAX_RESULTADOS:

    try:a = aux[i].split(FIN,2)[0]if a != '':

    busqueda.append('http://'+a)n -= 1

    except:pass

    i += 1return bsqueda

    query=raw_input('Bsqueda: ')n=int(raw_input('Numero de resultados: '))google(query,n)

  • 8/14/2019 Haxcra27

    7/68

    7/68

    Lectura de datos desde el teclado

    En Python, la funcin predefinida que se encarga de recibir

    datos del teclado es raw_input() .Esta funcin detiene la ejecucin del programa en esperade que el usuario introduzca datos por el teclado hasta re-cibir un retorno de carro.

    Veamos nuestro programa de ejemplo:

    query=raw_input('Bsqueda: ')n=int(raw_input('Numero de resultados: '))

    Como podemos observar, l l amamos a l a func inraw_input() y almacenamos el resultado en una variable:

    query=raw_input()

    raw_input() permite el paso de parmetros en forma decadena. Para los que conocen otros lenguajes, en especialC, sabrn que para mostrar un mensaje solicitando datos,primero se llama a la funcin de mostrar el mensaje y lue-go se llama a la funcin que lee los datos.

    En C sera as:

    printf("Dame el dato:");scanf("%c",&dato);

    Cuya traduccin directa al Python sera:

    print 'Dame el dato:'dato=raw_input()

    Pero (siempre hay un pero) esto no lo hace nadie. Es undesperdicio de la potencia de Python y de recursos del in-trprete.

    La forma ms correcta de hacerlo sera:

    dato=raw_input('Dame el dato:')

    Como podis ver, raw_input() permite introducir el mensa-

    je a mostrar por pantalla dentro de si mismo, lo cual acor-ta y clarifica el cdigo, sin contar con que es mucho mselegante.

    Adems posee la potencia de los lenguajes de alto nivel.Lee cualquier cantidad de datos, a diferencia de por ejem-plo, el C, donde para leer una cadena habra que declararun vector de caracteres y luego con un getchar() y un bu-cle ir leyendo.

    Podris observar tambin que no declaramos que tipo devariable usamos para contener los datos recibidos deraw_input(). Python lo hace automticamente, y para ser

    ms exactos, la variable es de tipo cadena, porqueraw_input() lee cualquier cosa que se le pase como unacadena de texto.

    Tambin podis observar la funcin int(). Esta funcintransforma en tipo entero el valor que se le pase. Es decir,si por ejemplo se le p asa una cadena de nmeros, lotransformara en un numero entero.

    En nuestro programa:

    n=int(raw_input())

    lo que significa que (de dentro a fuera), primero se ejecutael raw_input() con el que se obtiene una cadena y luegose transforma en un entero que se almacena en la variablen.

    Una forma ms clara seria:

    n=raw_input()aux=int(n)

    n=aux

    Bien, ya sabemos como introducir datos. Ahora veremoscomo mostrar datos.

    Mostrar datos por pantalla

    Veamos otros trozos de nuestro programa:

    print 'No se ha podido efectuar la conexin' .....

    print x

    ..... print 'Tu bsqueda para %s no ha arrojado resultados.' % (query.replace('+',' '))

    La funcin que muestra datos por pantalla, como ya ha-bris deducido es print . Como veis, lo que se va a impri-mir se debe introducir entre comillas, ya que es una cade-na. Si no se hace as Python dar error.

    Y "x? No est entre comillas?

    No, porque x no es una cadena, sino una variable previa-mente declarada y con un valor almacenado. Si a print lepasamos un parmetro sin comillas, lo interpreta comouna variable y muestra el contenido de dicha variable porpantalla. De ah que si se escribe un texto sin poner las co-

    millas de error. Python lo interpretara como una variablee intentar mostrar su valor por pantalla, pero como dichavariable no existir (a no ser que haya una coincidenciamuy extraa), dar error:

    print holaTraceback (most recent call last):File "", line 1, in ?

    NameError: name 'hola' is not defined

    Como veis Python se queja de que la variable "hola" noexiste. Error nuestro ya que lo que queramos hacer era

    Taller de Python "Episodio 1"

    print 'No se ha podido efectuar la conexin'..... print x..... print 'Tu bsqueda para %s no ha arrojado resultados.' % (query.replace('

  • 8/14/2019 Haxcra27

    8/68

    8/68

    mostrar la cadena 'hola' por pantalla, pero no pusimos lascomillas.

    print tambin permite el paso de varios parmetros as como operar con las cadenas dentro de l. Los parmetrosvan separados por comas. La coma hace que se considerenpor separados y a efectos de impresin aparece como unapulsacin de la tecla espacio en pantalla.

    Como dijo alguien una vez, "se hace camino al andar..."

    Probemos el print :

    (usaremos de nuevo el intrprete ya que es ms rpidoque editar un programa)

    >>> a=12>>> b='hola que tal...'>>> print 'probando',a,'\n',b,'\n\n' probando 12hola que tal...>>>

    Hemos creado dos variables, "a" y "b" y les hemos metidoun entero y una cadena respectivamente.

    Despus hemos usado print para imprimir un mensaje,unos cuantos intros (la \n es el intro) y los contenidos delas variables.

    Sencillo, verdad?

    print tambin permite usar la concatenacin y larepeticin (teniendo en cuenta que son operaciones dispo-nibles SLO para cadenas):

    >>> print 'probando otra vez'+b*5

    probando otra vezhola que tal...hola que tal...hola quetal...hola que tal...hola que tal...>>>

    Hemos imprimido una cadena y luego una cadena conteni-da en una variable repetida cinco veces, usando el "*". El"+" hace que se imprima junto. Si os fijis no aparece unespacio entre "vez" y "hola". Como ya dije antes, la comade separacin imprime un espacio. Si quisiramos queusando la concatenacin (+) apareciera un espacio entre"vez" y hola" tendramos que ponerlo explcitamente den-tro de la cadena, tal que as: "probando otra vez " (veis elespacio?)

    Pero fijaos que todo son cadenas, incluyendo lo que con-tiene la variable.

    Si intentramos imprimir tambin la variable "a" de estaforma:

    >>> print 'probando otra vez'+a+b*5Traceback (most recent call last):File "", line 1, in ?

    TypeError: cannot concatenate 'str' and 'int' objects

    Python nos avisa que no puede usarse la concatenacincon enteros y cadenas.

    La forma correcta sera:

    >>> print 'probando otra vez',a,b*5 probando otra vez 12 hola que tal...hola que tal...hola quetal...hola que tal...hola que tal...>>>

    Pero ya tenemos ah otra vez el maldito espacio. Y si no loqueremos?

    Fcil, usaremos la funcin str()

    >>> print 'probando otra vez'+str(a)+b*5 probando otra vez12hola que tal...hola que tal...hola quetal...hola que tal...hola que tal...>>>

    Ya no salen espacios!!!

    str() convierte a cadena cualquier cosa que se le pase co-mo parmetro (tened en cuenta y recordad de ahora enadelante que un parmetro puede ser tanto explcito, po-niendo los datos a pelo, como variables, donde lo que seconvierte es su contenido). En este caso, convierte el con-tenido de "a" en una cadena, o sea, convierte el entero 12en la cadena de texto '12'. Es como el inverso de lafuncin int() que hemos mencionado antes.

    Slo nos queda explicar una ltima forma de usar lafuncin print: las cadenas de formato.

    Las cadenas de formato son una forma de poder represen-tar valores de variables dentro de una cadena sin tener

    que hacer uso de lo antes explicado, aunque todo es com-plementario y podis usar lo que queris a la hora de im-primir por pantalla.

    En nuestro programa:

    print 'Tu bsqueda para %s no ha arrojado resultados.' % (query.replace('+',' '))

    Un ejemplo simple de formato:

    >>> a=134>>> b=12.5>>> c='hola caracola'

    >>> print 'El valor de a es %d, el de b %f y el de c %s' %(a,b,c)El valor de a es 134, el de b 12.500000 y el de c hola caracola>>>

    Aqu podemos ver los tres tipos ms comunes (hay otros)de indicadores de cadenas de formato: %d, %f y %s. Elprimero sirve para enteros, el segundo para flotantes y eltercero para cadenas.

    Tenemos tres variables, una con un entero, otra con unflotante y la tercera con una cadena. Se meten los carac-teres de formato dentro de la cadena a imprimir y luegose hace uso del operador % para imprimir por orden los

    Taller de Python "Episodio 1"

    print 'Tu bsqueda para %s no ha arrojado resultados.' % (query.replace('+

  • 8/14/2019 Haxcra27

    9/68

    9/68

    Taller de Python "Episodio 1"

    parmetros que se le pasen, en este caso las tres variables(si slo se pasa un parmetro los parntesis son opciona-les).

    En nuestro programa lo que le pasamos a la cadena deformato %s es la variable query formateada (como la for-mateamos lo veremos en el siguiente articulo junto conmuchas otras formas de tratamiento).

    Bueno, espero haberme explicado bien ya que ahora pasa-remos al siguiente punto del tema: el control de flujo delprograma.

    Bien, con lo que sabemos hasta ahora podramos hacerprogramas ms o menos complejos pero serian lineales,ejecutados de arriba a abajo, sin posibilidad de elegir queejecutar y que no. Esto se solventa con las instrucciones

    de control de flujo, es decir, los condicionales y los bucles.

    Un apunte ms antes de meternos en materia. En Pythonlas instrucciones se separan con intros, es decir, que a di-ferencia de otros lenguajes de programacin, como porejemplo el C que separa las instrucciones con punto y co-ma y puedes llegar a escribir el programa en una sola lnea(cosas ms raras se ven), en Python es obligatorio separarlas instrucciones con intros. Tambin hay otra obligacinque tiene que ver con los bucles y condiciones, y que aho-ra veremos.

    Entremos en tema...

    if...elif...elseLa estructura if permite introducir condiciones en laejecucin del cdigo del programa. Su sintaxis es:

    if condicin:instruccininstruccininstruccin...

    [continua el programa]

    Analicemos brevemente la teora. Como vemos la sintaxis

    es simple. Primero va el if con su condicin y finaliza condos puntos (los dos puntos son importantes. Si no se po-nen Python dar error). A continuacin vienen las instruc-ciones que se ejecutaran SI la condicin es verdadera. Encaso contrario no se ejecutaran. Y como sabemos que eslo que va dentro del if y lo que no? Fcil, es la otra"obligacin" del Python: las tabulaciones.

    Python reconoce las nuevas instrucciones mediante los in-tros y adems usa las tabulaciones para diferenciar si es-tas estn dentro o fuera de un bucle, una condicin, unafuncin,....

    Veamos un ejemplo en nuestro programa:

    if r.reason == 'OK':data = r.read()

    else:

    Como podemos ver primero va el if seguido de la condicina evaluar, en este caso si el contenido de "reason" es igual

    a la cadena 'OK' y finalizando con los dos puntos (aqu escuando tenis que recordar todos los operadores que ex-plicamos al principio del articulo, es decir, los decomparacin, lgicos y dems)

    Despus lo que hacemos es tabular las instrucciones quequeremos que vayan dentro del if (en este caso slo una)y cuando finalicemos las tabulaciones el if habr finalizado.

    Os pondr otro ejemplo ms simple y clarificador. Que pa-sa si intentamos dividir entre cero? Que no tiene solucin,y si intentamos hacerlo en un lenguaje de programacin,el que sea, dar error. En python:

    Shadowland:~$ pythonPython 2.3.4 (#2, Sep 24 2004, 08:39:09)[GCC 3.3.4 (Debian 1:3.3.4-12)] on linux2

    Type "help", "copyright", "credits" or "license" for more information.

    >>> 7/0Traceback (most recent call last):File "", line 1, in ?ZeroDivisionError: integer division or modulo by zero

    Si intentamos dividir un numero entre cero da error. Bien,supongamos que tenemos este trozo de cdigo:

    a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:')) print a/b

    Sencillo, y si lo ejecutamos nos pide dos nmeros y divideel primero entre el segundo. Pero que pasara si el segun-do numero fuera un cero. Que nos dara error como arriba.Como solucionarlo? Dicindole al python que si el segundonumero es un cero, que no ejecute la divisin, as:

    a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:'))

    if b!=0: print a/b

    As el programa slo ejecutara la divisin si el segundo nu-mero es distinto (el operador != ) de cero. Fcil.

    Pasemos a la segunda parte del condicional: else

    El programa de divisin funciona pero no es muy eficaz ymucho menos elocuente. Si, evita la divisin entre ceropero no nos permite mostrar un mensaje diciendo que ladivisin entre cero no esta permitida. Veamos por que:

  • 8/14/2019 Haxcra27

    10/68

    10/68

    Si le aadimos

    a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:'))if b!=0:

    print a/b print 'La divisin por cero no esta permitida

    Aunque la divisin sea correcta y el if se ejecute porque elsegundo numero no sea cero, el print del final se ejecutaraigual. Esto se podra solucionar as:

    a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:'))if b!=0:

    print a/bif b==0:

    print 'La divisin por cero no esta permitida'

    Es correcto pero ni es elegante, ni eficiente. Python tiene

    que evaluar dos condiciones cuando no es necesario. Paraeso existe el else:

    a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:'))if b!=0:

    print a/belse:

    print 'La divisin por cero no esta permitida'

    El else lo que hace es darle una segunda opcin, o mejordicho una opcin por defecto, es decir, que si el if no es

    verdadero, se ejecuta el else. Si el if es verdadero el elseno se ejecuta ni se procesa ni nada. consume menos re-cursos, es ms bonito y elegante, etc, etc...

    Si lo traducimos a lenguaje humano bsicamente seria co-mo si hiciramos:

    SI b DISTINTO_DE 0 HAZ:......

    SINO HAZ:....

    La sintaxis del else es sencilla:

    if:....

    else:instruccininstruccin....

    [continua programa]

    Que nos queda? Que es ese elif que has puesto antes enel titulo del apartado? Tranquilos, que ahora voy a ello.

    Veamos nuestro programa google.py:

    if bsqueda == -2: print 'Tu bsqueda para %s no ha arrojado resultados.' % (query.replace('+',' '))

    returnelif bsqueda == -1:

    print 'No se ha podido efectuar la conexin'return

    Pero si es como un if!!!! Evala una condicin y si es ver-dadera ejecuta el cdigo de dentro!!!

    FALSO!

    Os lo explicare con nuestro programa de divisin.Imaginemos que por una extrao y retorcido motivo de lafsica cuntica del universo (pedazo de frase sin sentidoverdad? ), queremos que nuestro programa de divisinadems de impedir la divisin entre cero tambin impidala divisin cuando los dos nmeros son iguales (muyextrao pero es un ejemplo, as que no os quejis). Comolo haramos?

    Vamos a cambiar la estructuracin de la condicin pero esel mismo programa:

    a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:'))if b==0:

    print 'La divisin por cero no esta permitida'else:

    if a==b:

    print 'Los dos nmeros son iguales y no vamos a dividirlos'

    else:

    print a/bEsto es lo que se conoce como if anidados, pero es horriblea la vista aunque no os lo creis. El cdigo funciona y selee ms o menos bien pero es porque hay pocas condicio-nes anidadas unas dentro de otras, pero ahora imaginaos50 if unos dentro de otros. Tendiendo en cuenta que hayque tabular ms cada vez que se crea un nuevo if al finalno se podra leer de la lnea tan larga que saldra slo abase de tabulaciones.Solucin: elif

    Sintaxis de elif:

    if condicin:...elif condicin:

    ....elif condicin:

    ....else:

    ...

    Pueden ponerse tantos elif como se necesiten. elif equivale alas instrucciones else if unidas en uno. Veamos ahora el pro-grama de la divisin hecho con elif:

    Taller de Python "Episodio 1"

    if bsqueda == -2:print 'Tu bsqueda para %s no ha arrojado resultados.' % (query.replacereturn

    elif bsqueda == -1:print 'No se ha podido efectuar la conexin'return

    a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:'))if b==0:

    print 'La divisin por cero no esta permitida'else:

    if a==b:print 'Los dos nmeros son iguales y no vamos a dividir

    else:print a/b

  • 8/14/2019 Haxcra27

    11/68

    11/68

    a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:'))if b==0:

    print 'La divisin por cero no esta permitida'elif a==b:

    print 'Los dos nmeros son iguales y no vamos a dividirlos'else:

    print a/b

    Bastante ms legible y claro. El else con el if dentro de else ha transformado en un elif y nos ahorramos tabulacio-nes y ganamos en claridad de cdigo y en optimizacin.

    Un apunte extra: elif nos facilita enormemente la creacinde mens de seleccin. Os lo dejo como ejercicio, que sino os malacostumbrais

    Pasemos a la siguiente estructura de control: el bucle

    while

    Como podemos hacer que una parte de nuestro cdigo seejecute continuamente hasta que nosotros queramos?Usando un bucle, y eso es lo que es el while .

    Su sintaxis es:

    while condicin:instruccininstruccin......

    [continua programa]

    Veamos un ejemplo en nuestro programa google.py:

    while n != 0 and i < MAX_RESULTADOS:try:

    a = aux[i].split(FIN,2)[0]if a != '':

    busqueda.append('http://'+a)n -= 1

    except:pass

    i += 1

    Vale es un poco complejo al principio pero no demasiado.Paso por paso.Cuando python llega al while evala la condicin y si escierta ejecuta todo lo del bucle y vuelve al while para vol-ver a evaluar y seguir haciendo hasta que la condicinsea falsa. En este caso la condicin es que la variable nsea distinta de cero (n!=0) Y (and) que la variable i seam e n o r q u e l a v a r i a b l e M A X _ R E S U LT A D O S(i

  • 8/14/2019 Haxcra27

    12/68

    12/68

    for ... in ...

    El problema del bucle while es que siempre tiene que tenerun incremento o algo que haga que la condicin sea falsapara poder pararlo cuando nos interese, y aunque en mu-chas ocasiones lo usaremos, en otras no es tan recomen-dable. Para esas ocasiones existe el bucle for in (PARACADA elemento EN conjunto HACER).

    El bucle for in es autoincremental, es decir que no hacefalta ponerle un incremento como al while (lo que tambintiene sus pros y sus contras, pero eso se ve con la prcticay la prueba error), y su sintaxis es:

    for variable in serie:instruccininstruccin....

    [continua programa]

    Veamos el ejemplo en nuestro google.py:

    for x in bsqueda:print x

    Simple y claro. Para cada valor de la variable x en el con- junto bsqueda imprime en pantalla el valor de x.Nuevamente observamos que en python las variables notienen que ser declaradas hasta que vayan a usarse. Engoogle.py la lista "bsqueda" existe ya y se ha formateadoy se han hecho operaciones con ella, pero la variable x noexiste y se crea exclusivamente para ser usada por el for,ya que el for in necesita una variable que sea la que se"incrementa", y aqu es la "x"

    Otro ejemplo en un programa simple. Vamos a cambiarnuestro antiguo contador hecho con un while por un conta-dor hecho con un for in:

    #contador2.pyfor i in range(0,10):

    print i

    Ejecutmoslo:

    Shadowland:~/python$ python contador2.py0123456789Shadowland:~/python$

    Hace lo mismo pero podis ver que el programa ya no de-clara i=0 antes ya que el for in declara la i y le asigna si

    primer valor, y tampoco aparece el incremento de i porqueel for in la autoincrementa. Y que es ese range(0,10) queha puesto ah?

    Existe una funcin que se usa mucho en un for in cuandotratas con rango de nmeros: es la funcin range().

    range() lo que hace es crear un "conjunto" de valores con

    los nmeros que haya entre un valor inicial y un valor finalmenos uno. Es decir, que si ponemos range(0,10) estamoscreando un conjunto con los valores 0 al 9 (el 10 no se usaporque el ultimo valor no lo coge. Recordad: valor finalmenos uno), que es lo que usara el for in para asignar eincrementar a la variable i.

    Difcil? Espero que no, aunque la dialctica no es lo mio

    Bueno, slo nos queda una estructura por tratar. En unprincipio pens en no incluirla ya que os podra confundirun poco pero bueno, estis para aprender, as que:

    try ... exceptEsta estructura se utiliza p ara la condiciones de error.Estoy loco? No, veamos... Es como un if slo que no se leindica una condicin para que se ejecute, sino que pythonejecutara el try y no har caso del except a no ser quepython de un en la ejecucin de las instrucciones dentrodel try. Veamos su sintaxis y luego veremos un par deejemplos:

    try:instruccininstruccin.....

    except:instruccininstruccin....

    [continua el programa]

    En nuestro google.py:

    try:conn = httplib.HTTPConnection(URL)conn.request ("GET", COD_BUSQUEDA + formateaQuery(query))

    r = conn.getresponse()except:

    print 'No se ha podido efectuar la conexin'return -1

    El programa intentara crear una conexin a Google y si fa-lla entonces se ejecuta el except avisndonos de ello.

    Un ejemplo sencillo, y sin sockets que los veremos en otroarticulo (tiempo al tiempo). Volvamos a nuestro programade divisin (versin if else sin elif). Tenamos:

    Taller de Python "Episodio 1"

  • 8/14/2019 Haxcra27

    13/68

    13/68

    a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:'))if b!=0:

    print a/belse:

    print 'La divisin por cero no esta permitida'

    Con try y except quedara as:

    a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:'))try:

    print a/bexcept:

    print 'La divisin por cero no esta permitida'

    Cuando debemos usar try except? Cuando sepamos quepython puede darnos un error y as ahorrarnos unacondicin que puede ser difcil de escribir, adems de inne-cesaria. En este caso, si sabemos que python da error

    cuando se divide por cero, porque usar un if para compro-bar si el divisor es cero? Nosotros los intentamos igual conel try y si resulta que hemos introducido un cero como di-visor y python se queja, entonces se ejecutara el except yen vez de fallar el programa, se ejecutara lo que haya den-tro del except, en este caso el print avisndonos de queestamos dividiendo por cero.

    Copiado y archivado? Eso espero

    Y hemos llegado al ultimo punto de este Quick & Dirty Python Article n1

    Python posee mltiples mdulos importables con funcionesque nos facilitan la tarea de programar. Hemos visto algu-nas que vienen por defecto como int(), str(), range(),...pero muchas otras tienen que ser importadas para serusadas, como por ejemplo la funcin de raz cuadradasqrt()

    Esta funcin esta presente en el modulo math que es unalibrera de funciones matemticas. Otras funciones que po-see son por ejemplo: seno, coseno, tangente, etc...

    Hay tres formas de importar funciones en python:

    1. from modulo import funcin2. from modulo import *

    3. import modulo

    La primera forma sirve para importar una funcin concretade un modulo. Veamos un programa que hace raz cuadra-da:

    from math import sqrt print sqrt(9)

    La salida de este programa, que hace la raz cuadrada de9, seria 3.0 (con decimales porque la funcin sqrt transfor-ma el dato a flotante si no lo era).

    La segunda forma sirve para importar todas las funcionesdisponibles en el modulo en cuestin. Se usa cuando sabesque vas a usar muchas funciones del modulo y es extre-madamente largo definirlas todas una a una con el primer

    mtodo, o cuando sabes que vas a usar funciones pero nosabes cuantas y as te ahorras tener que modificar el pro-grama una y otra vez aadiendo funciones al import.

    La tercera forma es similar a la segunda con una pequeadiferencia. En vez de importar todas las funciones presen-tes en el modulo, lo que hace es (al menos eso creo por-que no lo he encontrado en ningn sitio) crear una especiede PATH de bsqueda de forma que si llamas a una funcinque no esta por defecto en python, este la busca en las li-breras que hayas importado, aunque hay que especificr-selo as:

    Si hacemos

    import math

    para usar la funcin sqrt() tendremos que usarla as

    math.sqrt()

    Como veis, esta forma difiere un poco de las otras dos enla forma de utilizacin. Cual usar? Pues la que querissiempre que os sintis cmodos. Evidentemente si slovais a usar una funcin externa, el primer mtodo es elidneo, pero si vais a usar varias, depender de que mto-do os guste ms. Yo suelo usar el segundo y el tercerosegn mi experiencia y comodidad. Vosotros mismos

    Como hacer una relacin de mdulos y funciones seria de-masiado largo... no lo haremos. No obstante en la ayudade Python, bajo el epgrafe Library Reference, encontrareislos mdulos principales y las funciones que contiene cadauno. Adems os invito a preguntarme en el foro cualquierduda que tengis.

    Y con esto y un bizcocho, hasta el prximo articulo a lasocho

    Y como colofn os voy a poner un ejercicio para que prac-tiquis y veis que os da error y que no, etc, etc...

    Tambin os invito a que me preguntis las dudas que ten-gis acerca del ejercicio, y del resto del articulo, y si nome estropea los artculos posteriores (que si no pierdo be-neficios ) os contestare gustoso.

    Ejercicio:

    Hay una mxima que dice:

    Los programadores estn en conflicto constante conel Universo. Los programadores intentando crear mayores y mejores programas a prueba de idiotas y el Universo creando mayores y mejores idiotas.

    Taller de Python "Episodio 1"

  • 8/14/2019 Haxcra27

    14/68

    14/68

    Mi antiguo profesor me deca: "Un programa slo es unbuen programa si su numero de errores t iende a ce-ro. De aqu deducimos que Microsoft no hace buenosprogramas..."

    Dejando de lado la evidente fobia que tenia mi profesorhacia la empresa americana que todos conocemos y ama-mos / odiamos, tenia razn. Nunca podis saber quien vaa acabar usando un programa escrito por vosotros. Aunquelo escribis para uso propio, alguna vez se lo dejareis a unamigo, y ah se acabo el uso propio. De ah a verlo en lamula o en una web del estilo de Softonic o similar hay unpaso.

    Bien, el ejercicio consiste en coger el programa que os voya poner y modificarlo para evitar que falle de ninguna ma-nera, ya sea por introducir datos invlidos o por cualquierotra razn. Y as adems practicareis todo lo visto.

    Mejoradlo todo lo que podis. El programa funciona perfec-tamente pero se puede conseguir que falle muy fcilmen-te. Para los ms observadores, si, lo reconozco. Es unacalculadora! Pero bueno, tarde o temprano tenia que apa-recer verdad? Adems slo es un ejercicio para practicary si contis con el google.py creo que podrais disculpar-me, no?

    Pues eso es todo. Espero que hayis disfrutado con el arti-culo y que continuis. En la siguiente revista ms.

    PD: se me olvidaba. Los comentarios en el cdigo se po-nen as

    #esto es un comentario

    con el smbolo almohadilla " # " delante.Saludos...

    ejercicio.py

    #!/usr/bin/env pythonimport mathopcin=0while opcin!=6:

    print 'Calculadora de prueba v1.0 (by Moleman)\n'print '1. Sumar'print '2. Restar'print '3. Multiplicar'print '4. Divisin entera'print '5. Raz cuadrada'print '6. Salir'opcin=int(raw_input('Escoge el numero de opcin: '))

    if opcin==1:a=int(raw_input('\nPrimer numero: '))b=int(raw_input('\nSegundo numero: '))print '\nResultado:',a+b,'\n\n'

    elif opcin==2:a=int(raw_input('\nPrimer numero: '))b=int(raw_input('\nSegundo numero: '))print '\nResultado:',a-b,'\n\n'

    elif opcin==3:a=int(raw_input('\nPrimer numero: '))b=int(raw_input('\nSegundo numero: '))print '\nResultado:',a*b,'\n\n'

    elif opcin==4:a=int(raw_input('\nPrimer numero: '))b=int(raw_input('\nSegundo numero: '))print '\nResultado:',a/b,'\n\n'

    elif opcin==5:a=int(raw_input('\nNumero: '))print '\nResultado:',math.sqrt(a),'\n\n'

    elif opcin==6:print ' \nGracias por volar con aerolneas

    M o l e m a n . . . e s t o o o , p o r u s a r l aCalculadora v1.0\n\n'

    else:print '\nOpcion incorrecta. Vuelve a probar...\n\n'

    Taller de Python "Episodio 1"

    Agradecimientos a HpN, HxC y a mi mujer porsoportarme continuamente (va por ti Marta)

  • 8/14/2019 Haxcra27

    15/68

    Bienvenidos al Taller de Criptografa. Si habis seguido la revista de forma regular, recordarissin duda artculos como el de envenenamiento de cach ARP de moebius, el de sniffers delnmero anterior y muchos otros que, de una u otra forma, nos han recordado lo precaria quees la seguridad de nuestros datos, especialmente en el mbito de redes locales: cualquiera conunos mnimos conocimientos tcnicos y un poco de paciencia puede leer nuestros correos comosi tal cosa, robar contraseas... Por supuesto, todo esto puede evitarse con un diseo de red(tanto de poltica como de componentes fsicos y su diseo lgico) adecuado... pero siempredepende de otros (a no ser que seamos el administrador de esa red, claro) y hoy en da acce-demos a muchos datos sensibles a travs de Internet y esas conexiones se realizan desde mu-chos sitios, no solamente desde nuestra casa. Qu podemos hacer como simples usuarios desdenuestro terminal? Por supuesto, echar mano de la criptografa.

    Qu es lo que hace de la criptografa un mtodo de proteccin de nuestra informacin tan bue-no? Aunque la respuesta a esta pregunta tan sencilla es muy compleja... pero podemos extraeruna primera idea muy importante: la criptografa se sirve de la infraestructura lgica y fsicaque los ordenadores nos brindan para proteger la informacin en s. Otros mtodos (IDS,Firewalls, diseos de red...) se basan en modificar de una u otra forma esa misma infraestruc-tura, pero dejando la informacin inalterada. El principal problema de esta segunda opcin esque resulta tcnicamente ms costosa, y que una vez encontremos una debilidad en estos sis-temas de proteccin, la informacin estar igual de expuesta que si no existieran. Al cifrar nues-tros datos, estamos usando un mtodo de proteccin de la informacin en s, que es matemti-camente muy complejo y poderoso, pero que de cara al usuario es transparente y sencillo deusar.

    En este Taller de Criptografa iremos viendo poco a poco cmo manejar este poderoso recursoque es la criptografa, y aprenderemos a incorporar sus funcionalidades a nuestras tareas coti-dianas con el ordenador. La forma en que aprenderemos todo esto ser eminentemente prctica,donde no faltarn las explicaciones tcnicas, por supuesto, pero intentaremos que stas aparez-can cuando sea necesario para la comprensin de nuestras prcticas... y por supuesto, paso apaso.

    15/68

    TALLER DE CRIPTOGRAFA El sistema PGP

  • 8/14/2019 Haxcra27

    16/68

    16/68

    Un concepto muy importante que genera confusin y queconviene aclarar desde el principio es la diferencia entrecodificacin y encriptacin o cifrado. El hecho de codificaruna informacin supone transformar esa informacin a unarepresentacin equivalente, de forma que el significado dela informacin en su representacin original y en su

    representacin transformada sea el mismo. El proceso in-verso de la codificacin es la decodificacin y puede reali-zarse de forma directa y transparente. Ambos procesospueden ser descritos mediante algoritmos (que general-mente suelen ser pblicos o conocidos) de forma que cual-quier persona pueda transformar una informacin en susdistintas representaciones.

    Entendemos por algoritmo una descripcin precisa de unasucesin de instrucciones que permiten llevar a cabo untrabajo en un nmero finito de pasos.

    Cuando hablamos de cifrado, nos referimos igualmente auna transformacin que tiene por fin generar unarepresentacin equivalente de la informacin, pero con unagran diferencia: en el proceso o algoritmo de cifrado inter-viene un elemento llamado clave (del que ms adelantehablaremos) y que resulta imprescindible para poder rea-lizar el proceso de cifrado, descifrado o ambos. De estaforma, una informacin cifrada no puede ser reconstruidasi no se conoce, adems del algoritmo, la clave (o claves)criptogrficas que protegen la informacin.

    Imaginemos que tenemos un texto escrito en castellanocon todos sus caracteres en minscula. Si nosotros decidi-mos, en un alarde de creatividad ( ), escribir de nuevoese texto pero con todos sus caracteres en letras

    maysculas, habramos realizado una codificacin del mis-mo en maysculas. Cualquier persona que conozca el alfa-beto, aunque fuera incapaz de entender lo que dice, seracapaz de decodificarla de nuevo a minsculas.

    Ahora imaginemos que ese mismo texto lo traducimos aalgn otro idioma, por ejemplo a francs. En este caso latransformacin de la informacin la realizamos a travs deun diccionario castellano francs, que actuara como clave,y obtenemos un texto cifrado en francs. Si alguien quisie-ra recuperar la informacin original en castellano, necesi-tara un diccionario francs castellano para descifrar lainformacin.

    Ya, ya s que si hablas francs y castellano no necesitasdiccionario, se trata nicamente de un ejemplo para queentendamos de forma intuitiva la diferencia entre codificary cifrar.

    Cuando hablamos de criptosistemas informticos, nos referi-mos al texto original (el texto legible ) como texto en claro.El texto una vez cifrado se denomina criptograma.

    El proceso para convertir texto en claro a criptograma eslo que conocemos como cifrado o encriptacin, y el proce-so que convierte criptogramas en textos en claro lo llama-mos descifrado o desencriptacin.

    Echemos la vista atrs, concretamente al ao 1991 enEstados Unidos. El boom informtico estaba en plenoapogeo, los nuevos y potentes (por aquel entonces, claro)80486DX de 32 bits y con cach de nivel 1 incorporada lle-varon a los ordenadores personales una potencia hasta en-tonces desconocida, y posibilitaron que cierto tipo de apli-

    caciones que hasta entonces no haban llegado al mercadodomstico lo hicieran. Uno de ellos la criptografa.

    Cuando los rumores sobre posibles leyes para prohibir lacriptografa comenzaban circular, un programador llamadoPhilip Zimmermann program un software gratuito quemezclaba los mejores algoritmos de cada tipo (ms ade-lante hablaremos sobre esto) y permita a cualquiera conun ordenador personal hacer uso de una criptografa muypoderosa, equiparable a la de cualquier gobierno. ste pro-grama se llam PGP, acrnimo de Pretty Good Privacy, yhoy en da sigue siendo el referente en su campo.

    La historia de PGP es muy curiosa, y os animo a leer mssobre ella... aunque ste no es el sitio. Estoy seguro quegoogle os puede echar una mano.

    En esta primera parte del taller de criptografa vamos a va-lernos de PGP bajo Windows (aunque tambin puede serseguido desde Macintosh) para aprender a usar y com-prender la criptografa. Ms adelante veremos otraimplementacin del estndar OpenPGP que es casi tan fa-mosa, tiene versiones para casi cualquier sistema operati-vo y adems es software libre: GnuPG.

    OpenPGP es el estndar que surgi a partir de PGP, y quemarca las pautas de compatibilidad que permiten a las dis-

    tintas implementaciones ser completamente compatibles.Podis consultar la descripcin de este estndar en el RFC2440 que podis encontrar en:

    ftp://ftp.rfc editor.org/in notes/rfc2440.txt

    Lamentablemente no he encontrado ninguna traduccin deeste RFC al castellano.

    Aunque histricamente desde casi sus inicios han existidodos versiones de PGP (la internacional, centralizada en elsitio http://www.pgpi.org/ y la estadounidense de la PGPCorporation http://www.pgp.com/ ), hoy en da prctica-mente todo el mundo usa la versin PGP estndar. Aunquela PGP Corporation ha crecido muchsimo, siguen fieles auna de sus mximas desde sus inicios: ofrecer una versingratuita de PGP para uso individual, educacional y en ge-neral cualquier actividad sin nimo de lucro. En el momen-to de escribir este artculo la ltima versin es la 8.1, quepodemos descargar de este enlace:

    http://www.pgp.com/downloads/freeware/

    TALLER DE CRIPTOGRAFA El sistema PGP

  • 8/14/2019 Haxcra27

    17/68

    17/68

    Otra de las mximas de PGP (que no siempre han mante-nido, por cierto, pero por suerte actualmente s est vigen-te) es ofrecer el cdigo fuente de PGP para que cualquierpersona pueda examinarlo. Si sois los ms paranoicos devuestro barr io y tenis buenos conocimientos deprogramacin, podis echar un vistazo al cdigo en el si-guiente enlace:

    http://www.pgp.com/downloads/sourcecode/index.htmlSi decides bajarte el cdigo fuente de PGP, es MUY impor-tante que leas la licencia a la que dicha descarga est su-

    jeta.

    Una vez bajado, procederemos a instalarlo. Las pantallasque veremos durante la instalacin son las siguientes:

    1) Welcome. Pantalla de bienvenida.

    2) License Agreement. Debis leer y aceptar (o no, encuyo caso no podris instalar el software) la EULA dePGP.

    3) Read Me. Es conveniente que al menos echis unvistazo al leme del programa.

    4) User Type. Esta es la primera pantalla interesante...seleccionaremos la opcin No, I'm a New User y con-tinuaremos.

    5) Install Directory. Seleccionamos el directorio deinstalacin que queremos usar.

    6) Select Components. En esta pantalla podremos con-figurar los distintos componentes adicionales de PGPque podemos instalar, tales como plugins para softwarede uso comn, PGPdisk (solamente para versiones re-gistradas) y dems. Si queris instalar alguno, podishacerlo, pero no vamos a utilizarlos, al menos por elmomento.

    7) Start Copying Files. Veremos un resumen de lo quese va a instalar, y si estamos de acuerdo con todo, pro-cedemos a su instalacin.

    8) Install Complete. Una vezfinalizada la instalacin es ne-cesario reiniciar el ordenadorpara que el software se carguecorrectamente.

    Una vez reiniciado el ordenador,PGP iniciar automticamente elasis tente de claves (PGP KeyGeneration Wizard) mediante elcual crearemos nuestro par declaves nico y personal. Pulsamosen el botn Expert (acaso nonos gusta exprimir todo al mxi-mo? ) y estaremos ante el menpormenorizado de generacin declaves.

    Recordemos lo que sabemos sobre claves criptogrficas:son el elemento ms importante de un criptosistema, sualma. Gracias a las claves, un mismo algoritmo de cifradopuede ser usado por multitud de personas sin que el crip-tosistema coincida. La clave sera el diccionario que nospermitira pasar de texto en claro a criptograma y vicever-sa.

    En el campo Full Name introducimos nuestro nombre (onick) y en Email address nuestra direccin de correoelectrnico. Hasta aqu todo bien, pero llegamos al campo

    Key Type y nos encontramos tres opciones: DiffieHellman/DSS, RSA y RSA Legacy. Son los distintos tiposde algoritmos que PGP nos brinda para generacin de cla-ves asimtricas... es el momento de hablar de ellas.

    Imaginemos que no disponemos de un diccionario castella-no francs/francs castellano y que nicamente tenemosuno castellano francs y otro francs castellano. Cuando

    nosotros traduzcamos nuestro texto de castellano a fran-cs necesitaremos uno de los diccionarios, y cuando que-ramos realizar el proceso inverso necesitaremos el otro.Este sera el concepto de claves de cifrado asimtricas.

    En un algoritmo criptogrfico asimtrico existen dos clavescomplementarias, de forma que lo que una cifra puede serdescifrado por la otra y viceversa. A una de ellas le deno-minaremos clave pblica o de cifrado, y a la otra clave pri-vada o de descifrado. Dado que ambas claves deben sercomplementarias, ambas se generan en el mismo momen-to y ambas son necesarias para que el criptosistema fun-cione. Ms adelante veremos el funcionamiento concreto

    de las claves asimtricas.Existen muchos algoritmos asimtricos basados en diver-sos problemas matemticos, pero PGP nos ofrece dos po-sibilidades:

    DH/DSS (Diffie Hellman/Digital Standard Signature). Estealgoritmo se basa en el problema matemtico del logarit-

    mo discreto del grupomul t ip l i ca t ivo de uncampo finito (obvia-mente no necesitis sa-ber qu demonios sig-nif ica es to ) y fueideado por Dress. W.Diffie y M.E. Hellman en1976 (podis consultarel documento [DIH76]para ms referencias),a u n q u e n o t u v oimplementacin com-putacional hasta 1985,cuando ElGamal logrdemostrar que sta eraposible en su documen-to [ELG85]. En 1991 el

    TALLER DE CRIPTOGRAFA El sistema PGP

  • 8/14/2019 Haxcra27

    18/68

    18/68

    NIST propuso DSS como ampliacin a DH para convertirloen un criptosistema completo (DH careca de un sistemade firma... ms adelante hablaremos de las firmas cripto-grficas). As naci DH/DSS.

    RSA (Rivest Shamir Adleman). Este algoritmo fue ideadoen 1978 por Ron Rivest, Adi Shamir y Leonard Adleman ydescrito en el documento [RSA78]. Basa su potencia en el

    problema matemtico de la factorizacin entera (no, tam-poco es necesario entender eso). El algoritmo fue patenta-do, pero la patente expir en el ao 2000, por lo que hoyen da puede ser usado libremente.

    Aunque suene casi a ciencia ficcin, existe un algoritmopara computadores cunticos que ha sido probado y de-mostrado por IBM y que permitira reducir enormementela complejidad del problema de la factorizacin entera.ste algoritmo es conocido como Algoritmo de Shor yaunque facilitara enormemente la ruptura de claves RSA,seguira siendo un problema muy complejo para clavesgrandes... y requerira un ordenador cuntico bastante po-tente. Podis saber ms sobre el algoritmo de Shor en:

    http://en.wikipedia.org/wiki/Shor's_algorithm

    Si os estis preguntando porqu he dicho que PGP ofrecedos posibilidades cuando en realidad en nuestro men degeneracin de claves podemos elegir tres... pues entonceses que estis bastante atentos . En realidad solamentehay dos posibilidades: DH/DSS y RSA. La tercera opcin(RSA Legacy) es una versin vieja de RSA que solamentese usa para mantener compatibilidad con claves de versio-nes antiguas de PGP, pero que a nosotros no va a intere-sarnos, puesto que no implementa claves de revocacin,mltiples subclaves y otros aspectos que el RSA actual s soporta.

    As pues, tenemos que decidir qu algoritmo elegimos. Esoes una decisin que dejo en vuestras manos, aunque s di-r que tradicionalmente (y debido a la patente que hastael ao 2000 atenazaba al algoritmo RSA) se ha usadoDH/DSS, y que de hecho es el que ms gente usa... y tam-bin dir que yo uso RSA. Pero cada cual que elija el quems rabia le d, es indiferente para el seguimiento de estetaller.

    En Key size debemos indicar el tamao de la clave quedeseamos generar. Cuando ms grande sea nuestra clave,muchsimo ms compleja resultara de romper en un mo-mento dado. Tanto RSA como DH soportan claves de hasta4096 bits, aunque cabe destacar que DSS, el algoritmo defirma de DH, solamente soporta hasta 1024, por lo que so-lamente podremos crear claves DH/DSS de como mucho4096/1024 bits. Mi recomendacin de friki paranoico esque elijis los 4096 bits.

    Como curiosidad: la relacin que guarda el tamao de laclave con la complejidad de sta es exponencial, pues da-da una clave cualquiera, al aumentar un bit el tamao dela misma, duplicaramos su complejidad. As, una clave de1025 bits es el doble de compleja que una de 1024. Podisechar las cuentas de cmo de compleja es una clave de4096 bits...

    Ahora nos encontramos con el campo Key expiration ,donde podremos indicar, si la deseamos, la fecha de cadu-cidad de nuestra clave. sto puede resultar til cuandoqueremos definir claves por un perodo de tiempo, porejemplo. En nuestro caso no nos interesar, aunque si al-guien quiere utilizar esta opcin, no alterar el desarrollode las prcticas. Por fin, pulsamos siguiente.

    Nos encontramos en la pantalla de creacin del passphrase(que es a password lo que frase a palabra). Debemos defi-nir la contrasea que proteger las acciones que nuestraclave privada es capaz de realizar. Como bien sabemos,una cadena siempre se rompe por su eslabn ms dbil,por lo que una clave de 4096 bits que caiga en manos in-apropiadas y con un passphrase predecible deja todo elcriptosistema al descubierto.

    Mi recomendacin es que usis una contrasea SEGURA.

    Al menos de 8 10 caracteres de largo, con letrasmaysculas, minsculas, nmeros y si es posible smbolos.La ma es de 25 caracteres, y cuando te acostumbras noes tan incmodo.

    Al pulsar siguiente empieza el proceso de generacin de laclave propiamente dicho, tras el cual la clave es completa-mente utilizable.

    El proceso de generacin de la clave tiene un componentealeatorio que viene dado por la entropa que introduce elusuario en el sistema: movimientos del ratn, uso de losperifricos de entrada/salida... esto es as porque los orde-nadores NO pueden generar nmeros autnticamentealeatorios (nicamente pseudoaleatorios), lo que hara queuna clave generada nicamente por el ordenador pudieraser predecible.

    Antes de meternos en faena, vamos a echar un vistazo alas opciones de PGP pulsando con el botn derecho en elicono PGPtray y seleccionando Options .

    En la pestaa General vemos en primer lugar las opcio-nes estndar, donde si queremos podremos aadir una l-nea de comentario a los mensajes o ficheros generadoscon PGP. En el apartado Single Sign On tenemos laopcin de guardar en cach los passphrases del usuario,con el fin de evitar tener que estar teclendolos una y otravez. Por defecto esta opcin est activada. Pues bien, re-comiendo ENCARECIDAMENTE desactivar esta opcin, porevidentes motivos de seguridad. El apartado de FileWiping lo dejamos descansar... de momento, porque esMUY interesante y ms adelante hablaremos de l.

    TALLER DE CRIPTOGRAFA El sistema PGP

  • 8/14/2019 Haxcra27

    19/68

    19/68

    En la pestaa Files podemos elegir la localizacin quequeremos para nuestro anillo de claves.

    En los sistemas OpenPGP las claves, subclaves y firmas seorganizan en un sistema llamado anillo de claves y quepermite la interaccin de unas con otras (identificacin defirmas, revocacin de elementos...) as como el uso simul-tneo de las mismas (por ejemplo, cifrar un archivo a var-

    ios destinatarios).La pestaa Email nos permite configurar diversos aspec-tos del comportamiento de PGP con los MUAs (Mail UserAgents), pero de momento este men no lo tocaremos,pues el tema de PGP y correo electrnico corresponde aotro artculo. En la pestaa HotKeys podemos definir ata-

    jos de teclado para diversas operaciones comunes dePGP... si sois un poco vagos quiz os guste definir unoscuantos atajos, pero yo personalmente no uso ninguno.

    En la pestaa Servers encontramos los diversos servi-dores de claves PGP que el programa usar para sincroni-zar las claves, firmas y revocaciones con las de nuestro

    anillo. De esta forma, cuando recibamos un correo de unaclave que no est en nuestro anillo, podremos conectarnos

    en caliente al servidor y obtener esa clave para verificarla autenticidad del mensaje (siempre y cuando el usuariode esa clave haya subido la misma al servidor, claro... perode eso hablaremos ms tarde). La pestaa CA corre-sponde a la configuracin de las Autoridades deCertificacin... eso no lo tocaremos, pues se escapabastante del temario de este artculo.

    Llegamos por fin a la pestaa Advanced , donde ms chicha vamos a encontrar...

    En primer lugar nos encontramos con el apartado Encryp-tion , donde configuraremos las opciones del cifradosimtrico de PGP.

    Qu? Cmo? Pero no habamos quedado que PGP usabaclaves de cifrado asimtricas? T me ests engaando!Po di!

    Tranquilos... tiene su explicacin. En realidad PGP se sirveno de uno ni dos, sino de TRES tipos de cifrado para poderrealizar sus distintas funciones.

    Ms tarde explicaremos el mecanismo concreto que explicaeste aparente contrasentido, aunque como anticipo dirque en realidad todo lo que cifremos con PGP se har conclaves simtricas.

    Y qu es el cifrado simtrico? Imaginemos el ejemplo delos diccionarios... e imaginad que ahora s existe un diccio-nario castellano francs/francs castellano. Sera la nicaclave necesaria para cifrar y descifrar el texto. As pues,en un criptosistema simtrico, la clave es nica y cumplelas funciones de cifrado y descifrado.

    Los criptosistemas simtricos se dividen a su vez en dostipos: los de cifrado de bloque, que cifran el texto en claroen unos bloques con tamao prefijado (por ejemplo 32 bits 64 bits); y los de cifrado de flujo, que cifran de formacontinuada bit a bit o byte a byte.

    Las opciones que encontramos son las siguientes:AES (Advanced Encryption Standard), 2000. Tambin

    conocido como algoritmo Rijndael, es el ganador delconcurso que en 1977 convoc el NIST para definir elnuevo estndar de cifrado simtrico (por ello, al ganarpas a llamarse AES). Fue ideado por los belgasVincent Rijmen y Joan Daemen y puede actuar comoalgoritmo de cifrado de bloques o de flujo. Soportaclaves de hasta 256 bits.

    CAST (Carlisle Adams Stafford Tavares), 1997.Existen dos versiones de este algoritmo: la 128 y la256 (indica el tamao mximo de clave que maneja),y en ambos casos se trata de un algoritmo de cifradoen bloques de 128 bits. El funcionamiento interno deeste algoritmo es uno de los ms complejos (y por tan-to, computacionalmente ms lentos) de entre los quePGP nos brinda.

    TripleDES (Triple Data Encryption Standard), 1995.En realidad TripleDES no es un algoritmo en s mismo,sino que resulta de la aplicacin tres veces con distin-tas claves del veterano algoritmo DES de 1976 (el an-tecesor de AES). Maneja longitudes de clave de hasta168 bits efectivos (ms 24 de paridad), y aunque no esmuy complejo, s es muy rpido en su clculo.

    IDEA (International Data Encryption Algorithm),1990. Se trata de un algoritmo de cifrado en bloquesde 64 bits ideado por Xuejia Lai y L. Massey que sopo-rta claves de longitud de hasta 128 bits. Es importantemencionar que este algoritmo est patentado y la pat-ente an es vigente en Estados Unidos as como enEuropa (motivo por el cual algunas implementacionesOpenPGP, como por ejemplo GnuPG, no lo implemen-tan).

    Twofish, 1998. Este algoritmo es la evolucin de unollamado Blowfish, y fue uno de los finalistas del concur-

    TALLER DE CRIPTOGRAFA El sistema PGP

  • 8/14/2019 Haxcra27

    20/68

    20/68

    so AES del NIST. Twofish es un algoritmo de cifrado enbloques de 64 bits que maneja claves de hasta 256bits. Este algoritmo destaca por ser el ms rpido ensu ejecucin con mucha diferencia, motivo por el cuales bastante usado (por ejemplo en SSH).

    Conviene tener todos activados (en Allowed algorithms ),pero hay que elegir uno preferido... bien, aqu yo reco-

    miendo usar AES, por compatibilidad y por potencia, sibien Twofish me gusta tambin bastante. Las dems opcio-nes de esta pantalla podemos dejarlas como vienen per-fectamente.

    La pestaa PGPdisk solamente podr ser configurada sitienes una versin registrada de PGP, por lo que aqu laobviaremos.

    Ahora que ya tenemos nuestra clave creada y que hemospodido personalizar las opciones de PGP... es el momentode profundizar en la clave.

    Lo primero que tenemos que hacer es acceder al adminis-trador de claves de PGP, lo cual haremos pulsando con elbotn derecho en el icono PGPtray y seleccionando laopcin PGPkeys. Al seleccionar y pulsar con el botn dere-cho del ratn sobre nuestra clave, veremos el men con-textual de la misma. S, s que son muchas cosas... perode momento solamente pulsaremos en Key Properties para poder entrar en detalle.

    La fotografa en PGP es opcional y adems no suele usarsedemasiado. Se puede aadir mediante el men Keys,Add, Photo . La que he incluido en la clave de ejemplo esun pequeo guio a mis amigos del foro hackxcrack... y yade paso, os invito a que os pasis por l si no lo habis he-cho ya. Os aseguro que aprenderis mucho.

    http://www.hackxcrack.com/phpBB2/

    Analicemos los campos que vemos en este men porqueson muy importantes:

    ID: En el campo ID veremos un nmero hexadecimal(0x...) que identifica a nuestra clave y resulta muy tilpara realizar consultas al servidor de claves. Aunquees extremadamente complicado (una posibilidad entrems de cuatro mil millones) es posible que este ID co-incida con el de otra clave, por lo que este campo NOsirve para identificar a la clave de forma unvoca, ysimplemente lo usaremos como referencia.

    Type: El tipo de clave asimtrica que elegimos en el

    momento de la generacin.Size: El tamao de nuestra clave en formato

    xxxx/yyyy donde xxxx representa la longitud de cifradoe yyyy representa la longitud de la firma.

    Created: Fecha de creacin de la clave en cuestin.

    Expires: Fecha de expiracin de la clave. Por defecto,y si no indicasteis explcitamente lo contrario, ser Ne-ver .

    Cipher: Algoritmo preferido de cifrado simtrico.Generalmente ser AES 256.

    Casilla Enabled : Nos permite, cuando es una claveexterna (llamamos clave externa a aquella quenicamente tiene componente de clave pblica, care-ciendo de la privada), desactivar la misma, bien porquehaya caducado, bien porque ya no sea segura, bienporque no deseemos cifrar por equivocacin a esa cla-ve...

    Hay que tener en cuenta que una clave con parte pblicay privada no puede ser desactivada en ningn caso.

    Botn Change Passphrase: Al pulsar sobre este botn,y previa autentificacin mediante el actual passphrase,es posible cambiar el mismo de la clave.

    Fingerprint: Este concepto es uno de los ms importan-tes en PGP. Como ya dijimos, aunque es complicado,es posible que el KeyID de dos claves distintas coinci-da, por lo que necesitamos un mecanismo que permitaidentificar de forma unvoca a cada una de las claves.Este mecanismo es el fingerprint, tambin denominadohuella digital. Antes de continuar, si veis en este campouna serie de palabras, pulsad sobre la casilla Hexade-cimal para verla como $DEITY manda.

    TALLER DE CRIPTOGRAFA El sistema PGP

  • 8/14/2019 Haxcra27

    21/68

    21/68

    Si con el KeyID las posibilidades de coincidencia eran deuna entre cuatro mil millones, con el fingerprint, y depen-diendo del algoritmo usado, son de una entre cifras del or-den del sextilln (1x10^38) o del octilln (1x10^48).

    Y qu es el fingerprint? Simplemente es el hash de la cla-ve pblica... lo cual nos lleva a un poquito ms de teora,en este caso sobre las funciones hash.

    Para entender qu es una funcin hash, vamos a hacer unpoco de memoria... concretamente hasta nuestros tiemposdel instituto. Imaginemos una funcin matemtica de lasde toda la vida, por ejemplo y=x^2.

    La y sera la f(x), es decir, el valor dado en funcin de x.Ahora imaginemos que esa funcin es una mquina quetransforma un valor de entrada que nosotros le damos enun valor de salida. Por ejemplo, si nosotros metemos en lafuncin el valor 2, sta nos devuelve su cuadrado: 4. As ocurrir para cualquier valor de x que nosotros le demos.

    Ahora imaginemos que construimos una funcin que lla-

    maremos la inversa de la anterior y que ser y=raz(x).Esta funcin f'(x) tambin podemos considerarla una m-quina de transformar valores, y se da la propiedad de quesi introducimos en nuestra segunda funcin f'(x) el valorde salida de nuestra primera funcin f(x) obtendremos elvalor que introducimos en la primera. Por ejemplo, f(2)=4y f'(4)=2.

    Hasta ahora bien? Bueno, pues ahora vamos a echarle to-dava un poquito ms de imaginacin. Imaginemos queconstruyo una funcin ms compleja... en la que por elproceso pierda informacin. Por ejemplo, me construyouna funcin en la que elimino el nmero menos significati-vo de la entrada y lo que me quede lo elevo al cuadrado.Consideremos esta nueva funcin que llamar g(x) denuevo una mquina de transformar nmeros. Introducimosel valor 23 y la funcin realiza su algoritmo: elimina el 2 yeleva el 3 al cuadrado. La salida de esta funcin sera 9.La cuestin es... sera posible realizar una funcin g'(x)que fuera la inversa de la anterior? NO, porque en el pro-ceso de la funcin se pierde una informacin que no puedeser recuperada a posteriori. Esto sera una funcin irrever-sible.

    Un ltimo esfuerzo imaginativo... ahora imaginemos queconstruyo una funcin irreversible lo suficientemente com-pleja como para que devuelva una salida bastante grande,lo suficiente como para que no coincida con facilidad dadasdos entradas distintas. Esto permitira resumir distintasentradas a los valores que produce la funcin a partir deellas... y esto sera una funcin hash.

    As pues, toda funcin hash tiene unas propiedadesmatemticas que vamos a explicar de forma sencilla:

    Unidireccional: Una funcin hash es irreversible, ydada una salida de la misma, es computacionalmenteimposible recomponer la entrada que la gener.

    Compresin: Dado un tamao cualquiera de entradapara la funcin hash, la salida de la misma ser de unalongitud fija.

    Difusin: La salida de la funcin hash es un resumencomplejo de la totalidad de la entrada, es decir, se usanTODOS los bits de la misma.

    Resistencia a las colisiones simples: Esta propiedadnos indica que dado un valor de entrada de la funcinhash, es computacionalmente imposible encontrar otraentrada que genere el mismo valor de salida.

    Resistencia a las colisiones fuertes: Esta propiedadnos indica que es computacionalmente muy difcil en-contrar dos valores de entrada que generen un mismovalor de salida.

    En PGP se usan dos tipos de algoritmos hash:

    MD5 (Message Digest 5), 1992. Este algoritmo, evolucindel MD4 (que a su vez lo es del MD2), es uno de los msextendidos en Internet. Fue ideado por el matemtico RonRivest (uno de los padres de RSA) y genera cadenas hashde 128 bits a partir de una entrada de cualquier tamao.

    Si eres usuario de GNU/Linux y alguna vez has descargadouna imagen ISO de Internet, habrs visto que junto a losficheros ISO suelen haber otros ficheros md5 (y a veces,un tercer fichero md5.asc). Ese fichero md5 contiene lacadena MD5 de la imagen ISO y permite comprobar quese ha descargado correctamente o que no ha sido altera-da. El archivo md5.asc es una firma PGP del fichero MD5,de forma que nos aseguramos adems que el fichero MD5ha sido generado por el firmante.

    Existen muchas implementaciones de MD5 para que po-demos usarla de forma cmoda en nuestro sistema. Losusuarios de Linux tienen el paquete md5sum, que va in-cluido con prcticamente cualquier distribucin, mientrasque los usuarios de Windows deben descargar alguna delas implementaciones de Internet, por ejemplo yo re-comiendo sta:

    http://www.fourmilab.ch/md5/

    SHA 1 (Secure Hash Algorithm), 1994. SHA 1 naci demanos del NIST como ampliacin al SHA tradicional. Estealgoritmo, pese a ser bastante ms lento que MD5, es mu-cho ms seguro, pues genera cadenas de salida de 160

    bits (a partir de entradas de hasta 2^64 bits) que son mu-cho ms resistentes a colisiones simples y fuertes. Hoy enda, es el estndar en PGP.

    De esta forma, si deseamos aadir la clave de otra perso-na a nuestro anillo solamente debe proporcionarnos el fin-gerprint de su clave, pues nosotros nos encargaremos debuscar la clave en los servidores pblicos, descargarla yverificar que el fingerprint es el mismo.

    Trust Model: En este campo tenemos dos medidores: elprimero de ellos mide la validez de la clave (por ejemplo,una clave caducada no sera vlida), y el segundo mide

    TALLER DE CRIPTOGRAFA El sistema PGP

  • 8/14/2019 Haxcra27

    22/68

    22/68

    el modelo de confianza que depositamos en esa clave (s-to puede resultar muy til cuando tenemos gran cantidadde claves en nuestro anillo y al recibir un correo deseamossaber de un vistazo cunto confiamos en esa clave). Laopcin Implicit Trust solamente es vlida para claves conparte pblica y privada, es decir, claves que nos pertene-cen completamente aunque no hayan sido generadas ennuestra mquina. Es importante destacar que para poder

    otorgar confianza a una clave debemos haberla firmadopreviamente, pero de las firmas hablaremos ms tarde.

    Hay una pestaa ms dentro del men de propiedades dela clave, la pestaa Subkeys . En ella podemos consultarlas subclaves existentes dentro de la clave principal.Adicionalmente, y en el caso de claves con parte privada,podremos adems aadir nuevas subclaves y recovar o eli-minar las ya existentes.

    En realidad cuando generamos la clave tras la instalacinde PGP, generamos tambin una subclave principal de ci-frado, que es la que veremos en esta ventana. En PGP estasubclave principal (imprescindible para el correcto funcio-namiento de la clave) se genera de forma automtica, pe-ro cuando veamos GnuPG en el siguiente artculo veremosque debemos generarla nosotros mismos a mano... lo cualpuede ser un poco ms engorroso pero tambin nos per-mite afinar hasta el lmite el tipo de clave que queremosusar.

    Si deseamos usar ms de un nombre y/o correoelectrnico en nuestra clave, podemos aadirlos fcilmen-te. Solamente hay que pulsar con el botn derecho sobrela clave y seleccionar Add seguido de Name . PGP nospedir el nuevo nombre y correo que deseamos aadir yse generar automticamente. Para seleccionar cul que-remos que sea el nombre principal de la clave, debemosseleccionarlo con el botn derecho y elegir la opcin Setas Primary Name .

    Vamos a practicar un poco todo lovisto hasta el momento...

    Lo primero que vamos a hacer es ir

    al men de opciones de PGP (yasabis cmo) y al apartado Ser-vers . Una vez ah, tendris dosservidores: ldap://keyserver.pgp.comyldap://europe.keys.pgp.com:11370 .Seleccionad el segundo de ellos ypulsad en el botn Set As Root quehay en el men de la derecha. As cambiaremos nuestro servidor declaves principal.

    El motivo para cambiar nuestro servidor principal a estesegundo es que actualmente la PGP Corporation est rea-lizando importantes cambios en el sistema de su servidorprincipal (el primero) y muchas de las claves no estn dis-ponibles al no haber sido verificadas an por sus respec-tivos dueos. Para no tener problemas con claves que noestn, usaremos el servidor europeo de claves.

    Ahora abriremos PGPkeys y pulsaremos en el men Ser-ver seguido de Search (tambin es posible acceder di-rectamente mediante el atajo ctrl+F). ste es el men debsqueda de claves de PGP. Lo primero que hay que haceres cambiar el servidor donde vamos a buscar las clavesal europeo, y ahora vamos a realizar unas cuantasbsquedas con distintos criterios para familiarizarnos conel manejo de PGP.

    En los criterios de bsqueda seleccionaremos Key ID e is . Introducimos 0x517D0F0E y pulsamos search, traslo cual aparecer un nico resultado en forma de clavepblica a nombre de Linux Kernel Archives VerificationKey .

    Pulsad con el botn derecho sobre la clave y seleccionadla opcin Import to Local Keyring , momento a partir delcual esa clave pasar a formar parte de nuestro anillo declaves. Bien, ahora vamos a comprobar que vosotros y yotenemos la misma clave, para lo cual nos valdremos delfingerprint de la misma:

    C75D C40A 11D7 AF88 9981 ED5B C86B A06A 517D 0F0E

    Si el fingerprint que podis ver enla clave que hay en vuestro anilloes este mismo (que lo ser),significa que la clave es la misma

    para ti y para m.

    Ahora vamos a realizar una se-gunda bsqueda cambiando loscriterios. Ahora usaremos UserID y contains . Introduciremos

    noticias hispasec (aprovechopara mandar un saludo a toda lagente de hispasec por su mag-nfico trabajo) y realizaremos labsqueda. El resultado en este

    TALLER DE CRIPTOGRAFA El sistema PGP

  • 8/14/2019 Haxcra27

    23/68

    23/68

    caso sern cuatro claves RSA legacy.

    Las importaremos todas a nuestro anillo de claves.

    En el momento de escribir este artculo (an en el 2004) labsqueda produce solamente cuatro resultados, con las cla-ves de los aos 2001, 2002, 2003 y 2004. Cuando realicisestas prcticas aparecer una clave ms, la del 2005.

    Ahora podremos ver que nuestro anillo de claves est bas-tante menos solitario de lo que estaba antes. Ahora, borradtodas las claves de noticias hispasec que no estn ya vigen-tes. Para ello, seleccionad todas las claves manteniendo pul-sada la tecla control y luego pulsad con el botn derecho yelegid la opcin Delete . Las teclas tambin pueden ser co-piadas, cortadas o pegadas como cualquier otro tipo de ar-chivo.

    Bien, tenemos ya nuestra clave creada y sabemos cmo po-demos obtener nuevas claves de los servidores, pero cmopueden otras personas obtener nuestra clave? Pues para eso,obviamente, nuestra clave debe estar en el servidor de cla-ves. Para publicar una clave en el servidor de claves, sola-mente hay que pulsar en el botn derecho sobre la clave yseleccionar Sent To y seleccionar a qu servidor enviar lamisma. Si seleccionis Domain Server , se enviar al ser-vidor que tengis configurado por defecto.

    Probad a publicar en el servidor europeo de claves vuestranueva clave recin creada y despus probad a buscarla parapoder estar seguros de que se ha publicado correctamente.Sera bueno que la buscarais por diversos criterios debsqueda, para practicar un poco ms con el motor debsqueda de PGP.

    Otra opcin importante es la de actualizar claves que ya te-nemos en nuestro anillo de claves. Se puede hacer de dosformas: o bien buscando la clave mediante el motor debsqueda de PGP, o bien usando la opcin de actualizacinde PGP.

    Para hacer uso de la opcin de actualizacin de claves dePGP pulsad sobre la clave con el botn derecho y seleccionad

    Update . Aparecer una ventana en la que podremos ver

    la clave y desarrollar el rbol de la misma para poder obser-var el estado en el que se encuentra en el servidor. Si deci-dimos que queremos incorporar los cambios existentes enla clave a nuestro anillo de claves local, debemos pulsar en

    Import y el software automticamente gestionar laimportacin y actualizacin.

    Cmo puede cambiar una clave una vez subida a un servi-dor? Pueden aadirse, eliminarse o revocarse subclaves, fo-tografas, firmas...

    IMPORTANTE: Absolutamente todas las claves que se ex-portan a un servidor de claves y, por tanto, toda clave pu-blicada en un servidor pblico, solamente consta de partepblica. Es imposible exportar un bloque privado a uno de

    estos servidores. Por qu os cuento esto? Porque es MUYimportante que mantengis copias de seguridad de vuestrasclaves privadas de forma local (y a ser posible, no en el mis-mo disco duro) porque si perdis vuestra clave privada, NOpodris recuperarla y NO podris volver a descifrar nada quese cifre a esa clave ni generar ms firmas (cof, cof, queridoamigo mo AcidBorg).

    Y cmo creamos copias de seguridad locales? Mediante laopcin de exportacin de claves. Al pulsar sobre la clave conel botn derecho y seleccionar la opcin Export apareceruna ventana

    donde debemos seleccionar el destino de la clave exportada.Es muy importante fijarse en la casilla Include PrivateKey(s) (marcada en la imagen), pues sta es la opcin quenos permite, al exportar una clave, incluir su parte privaday por tanto realizar una copia de seguridad de nuestra clave.sta opcin est disponible nicamente para claves con partepblica y privada (obviamente) y est desmarcada por de-fecto.

    El fichero generado ser un archivo con extensin .asc quecontendr, en forma de armadura ASCII, la clave exportada(bien sea nicamente la parte pblica o ambas partes).Uhm... un concepto nuevo a introducir: armadura PGP.

    PGP puede generar principalmente tres tipos de ficherosatendiendo a su finalidad: archivos cifrados (.pgp o .asc),archivos de firma (.sig o .asc) y archivos de claves (.asc) .Atendiendo a su forma, los tipos de ficheros son dos: los ar-chivos de armadura ASCII y los archivos MIME/PGP. Cules la diferencia entre ellos? Las armaduras ASCII son fiche-ros .asc de caracteres ASCII (como su propio nombre indica)que son perfectamente legibles que no comprensibles y

    pueden ser fcilmente tratados con un editor de texto plano,son cmodos para trabajar en web con ellos... los ficherosMIME/PGP, por contra, son caracteres que usan lacodificacin MIME y que NO pueden ser ledos con un editorde texto plano (segn qu editor se use, no veremos nadao veremos smbolos extraos).

    Para los que no sepan qu es ASCII (American StandardCode for Information Interchange), se trata de un estndarde representacin numrica de caracteres. El ASCII estndarcontiene 128 smbolos, y el extendido 256. Su uso ya no esmuy habitual, pues ha sido progresivamente sustituido porUNICODE. Para conocer ms sobre la tabla ASCII:

    http://www.asciitable.com/

    TALLER DE CRIPTOGRAFA El sistema PGP

  • 8/14/2019 Haxcra27

    24/68

    24/68

    Los archivos cifrados y de firma pueden adoptar cualquierade las dos formas , mientras que los archivos de clavessiempre sern armaduras ASCII. Mi recomendacin, paracualquier tipo de fichero que deseemos generar, es usararmaduras ASCII. Vamos a ver la pinta que tienen... paraello abrimos con un editor de texto (por ejemplo, el blocde notas) la clave p reviamente exportada. Veremos unagran cantidad de letras ASCII y unas etiquetas de inicio

    y de final que delimitan ambas partes de la clave.-----BEGIN PGP PRIVATE KEY BLOCK-----Version: {versin del software}

    {parte PRIVADA de la clave}-----END PGP PRIVATE KEY BLOCK----------BEGIN PGP PUBLIC KEY BLOCK-----Version: {versin del software}

    {parte PBLICA de la clave}-----END PGP PUBLIC KEY BLOCK-----

    Como vemos, las cabeceras indican cul es el contenidode la armadura ASCII (clave privada y pblica respectiva-mente, pero podran ser otros que ms adelante veremos),y la lnea Version indica qu software hemos usado paragenerar esa armadura (en vuestro caso ser PGP 8.1.0).Los caracteres ASCII representan el contenido de la arma-dura, bien sea la clave como en este caso, un mensaje ci-frado o una firma.El trabajar con armaduras ASCII en lugar de ficherosMIME/PGP nos da una gran flexibilidad al poder tratar elcontenido como texto plano. Si habis visto alguna vez enuna pgina web que hay un enlace a una clave PGP pblica(como por ejemplo en mi web), siempre os encontraris

    con el archivo .asc que puede ser visualizado correctamen-te mediante vuestro navegador web as como guardadode forma directa. Para las claves siempre es as, pero porejemplo si quisiramos publicar en un foro un fichero ci-frado, sera mucho ms cmodo publicar como texto la ar-madura ASCII que andar adjuntando el fichero MIME/PGP(adems, no todos los foros soportan la opcin de adjuntarficheros).

    Bueno, por fin hemos llegado al punto que todos estabanesperando: vamos a cifrar y descifrar archivos usando PGP.Lo primero que necesitamos es un fichero que acte como

    texto en claro (como dijimos anteriormente, llamamostexto en claro en un criptosistema a cualquier elementoque no est cifrado... no obstante, cualquier fichero delordenador est compuesto por ceros y unos, por lo queen realidad no es tan complicada la abstraccin de imagi-narlo como un texto . Podemos seleccionar un ficherocualquiera, pero para que coincida con el ejemplo, crea-remos un fichero llamado texto.txt. En su interior podisescribir lo que queris.

    Ahora pulsamos con el botn derecho sobre el fichero yseleccionamos el men PGP para despus seleccionar

    Encrypt . Nos encontramos con una pantalla donde pode-mos seleccionar(arrastrando ysoltando) la o lasclaves que podrndescifrar el ficherocifrado. Adems,tenemos a nuestradisposicin las si-guientes opciones:

    Text Output:Al marcar estaopcin, esta-mos indicandoal programa que deseamos que genere un fichero de ar-madura ASCII .asc en lugar de un fichero MIME/PGP.pgp. Yo, por comodidad, recomiendo usar este tipo deficheros cifrados, pero si prefers usar MIME/PGP, da ab-solutamente igual.

    Input Is Texto: Mediante esta opcin estamos indicandoa PGP que debe tratar la entrada como si de texto se tra-tara... esto es algo que por el momento no vamos a usar,

    aunque cuando tratemos el tema de cifrado de correoelectrnico veremos que es bastante importante. Por elmomento olvidad esta opcin.

    Wipe Original: Tras cifrar el fichero, borra de forma se-gura el original. Ms adelante hablaremos de esta opcinde PGP con ms detalle.

    Creas que con borrar un fichero era suficiente? No, claro...pero borrarlo y vaciar la papelera de reciclaje TAMPOCO. Lastcnicas y, sobre todo, los fundamentos tericos sobre el bo-rrado seguro de datos son un tema muy interesante perocomplejo... dara para un artculo entero e independiente.Quin sabe...

    Secure Viewer: Si eres un fantico de la criptografa(o un paranoico de tres pares de narices) esta opcin teencantar (eso s, nicamente sirve para ficheros de tex-to). El uso de esta opcin genera dos efectos en el archi-vo... pero que se manifestarn al descifrarlo. El primerode ellos es un aviso eyes only que os recordar a laspelculas de James Bond... el aviso es el siguiente:

    The message you are decrypting is for your eyes only. It isrecommended that this message only be read under themost secure circumstances.

    Que traducido vendra a decir algo como:

    El mensaje que ests descifrando es slo para tus ojos. Serecomienda que este mensaje sea visto nicamente bajo lasc i r c u n s t a n c i a sms seguras.

    De entrada acon-goja un poco,verdad? Puesveris lo que vie-ne ahora... Sipulsamos aceptarnos encontrare-mos con el Se-cure Viewer

    TALLER DE CRIPTOGRAFA El sistema PGP

  • 8/14/2019 Haxcra27

    25/68

    25/68

    de PGP: un visor que no solo es seguro en cuanto a su for-ma de almacenar los datos en memoria, sino que ademses seguro en cuanto a su visualizacin en pantalla. Si usisla opcin Use TEMPEST Attack Prevention Font (que estmarcada por defecto), el texto se visualizar con una fu-ente segura contra los ataques TEMPEST.

    Y... qu es TEMPEST? Es una tcnica de espionaje que

    ralla la ciencia ficcin, pero que os aseguro que es real.Si alguno de vosotros ha ledo la genial novela Criptonomicn de Neal Stephenson, esta tcnica la cono-cer con el nombre de Phreaking Van Eck.

    Todos sabemos que los monitores funcionan medianteaplicacin de corrientes elctricas (en el caso de monitoresCRT, mediante el barrido de electrones; en el caso de TFT,mediante aplicacin de diferencias de potencial a los pix-els), y que las corrientes elctricas generan campos elc-tricos...

    Pues el ataque TEMPEST consiste en detectar de forma re-mota los campos elctricos generados por un monitor

    (podis imaginar que son muchsimo