encriptacion con java

Upload: juan-lopez

Post on 20-Feb-2018

228 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/24/2019 Encriptacion Con Java

    1/22

    http://www.javahispano.com

    new InputStreamReader(System.in)).readLine();nameCallac!.set"ame(username);# else i$ (c instanceo$ %asswordCallac!) &%asswordCallac! passwordCallac! ' (%asswordCallac!)c;

    System.out.print( passwordCallac!.et%rompt() *+ *);System.out.$lush();Strin password ' new ,u$$eredReader(new InputStreamReader(System.in)).readLine();passwordCallac!.set%assword(password.toChar-rray());password ' null;# else & throw new nsupportedCallac!0ception(c1 *nsupported Callac!2ype*); ####

    %uede encontrar todos los archivos necesarios en el archivo ejemplos.jar. %ara instalarlosejemplos copie ejemplos.jar en el directorio 3ue desee y ejecute desde la l4nea decomandos jar 0v$ ejemplos.jar. -lunos ejemplos ya est5n compilados podr5 ver como$uncionan ejecut5ndolos escriiendo run

    captulo 4

    Encriptacin y desencriptacin

    Introduccinn este tutorial1 se intentara 3ue el lector consia una ase s6lida y duradera sore losprincipios de seuida. %or lo tanto aparte de instruir en el uso de una -%I concreta1tami7n intentamos transmitir un conocimiento mas pro$undo. %ara ello no asta condeciresto se hace de tal $orma1 sino 3ue en ocasiones re3uiere 3ue nos adentremos en losaspectos matem5ticos o alor4tmicos de los procesos. ste es el caso del cap4tulo 8.%rimero daremos una visi6n independiente sore la criptora$4a1 y despu7s pasaremos aimplementar alunos ejemplos con 9ava y 9C. Si el lector no esta interesado encomprender los $undamentos de la criptora$4a y pre$iere hacer uso directamente de las

    8 de 9ava Criptoraphy -rchitecture

    herramientas y -%Is puede saltarse la siuiente secci6n.

    criptografaTerminologa y notacinUn poco de historia ...

  • 7/24/2019 Encriptacion Con Java

    2/22

    Las ases $undamentales de la criptora$4a1 $ueron estalecidos por

    Claude Shannon : n un articulo titulado *- mathematical theory o$

    communication * donde introduce las ases de la teoria de la in$ormaci6n.

    icrosystem1 $ue el descuridor en

    ?@AB del concepto de criptora$4a de clave pulica.

    las teor4a de la criptora$4a se asa en las siuientes teor4as matem5ticas (3ue no ser5nanaliadas en este tutorial):

    teor4a de la in$ormaci6n

    teor4a de nDmeros

    teor4a de la complejidad alor4tmica

    teor4a de proailidad estad4stica

    n la iliora$4a 5sica se suele hacer re$erencia a los distintos roles 3ue puede tenerunusuario1 haciendo uso de alRL de personas1 asi 3ue tenemos los siuientes personajescon los 3ue iremos $amiliariando durante esta secci6n. Reparto :

    -lice y ,oCarol ( tercera persona en protocolos de mas de dos usuarios)

    =ave (cuarta persona en protocolos de mas de E usuarios)

    >allory *la mala* (atacante maliciosa)

    2rent ( -ritro de con$iana )

    %ey ( demostrador )

    Fictor (la persona 3ue compruea)

    stos nomres son est5ndares de hecho.

    Conceptos bsicos y tipos de funciones segn sus claes

    Cuando halamos de encriptaci6n deemos tener alunos conceptos claros.8E de http://www.javahispano.com

    !ensa"e # Son los datos 3ue actualmente con conciernen. "ormalmente ser5 un

    te0to plano. =enotado por >

    >ensa"e cifrado # s el mensaje > encriptado. LLamamos al mensaje ci$rado C

    Espacio de mensa"es : Son todos los mensajes posiles1 en la mayoria de los

    casos suele ser in$inito1 pero en otros la lonitud puede estar limitada.

    Espacio de mensa"es cifrado : Lo mismo 3ue el punto anterior pero para

    mensajes ci$rados.

    Espacio de claes Son el conjunto de todas las claves posiles. Se representa por

    la letra G (mayDscula1 la ! minDscula representa una clave en concreta)>atem5ticamente1 la encriptaci6n no es mas 3ue una aplicaci6n desde el dominio de >alrano de C. H la desencriptaci6n es la $unci6n inversa.

    0presamos la encriptaci6n como C ' (>) .

    La desencriptacion como > ' =(C)

    >' =((>)).

  • 7/24/2019 Encriptacion Con Java

    3/22

    n ejemplo de lo anterior : n mensaje > ' *hola*1 una $unci6n de encriptacionescriirla siuiente letra del al$aeto1 H una $unci6n de desencriptado escriir la letra anteriordelal$aeto nos 3uedaria. > '*hola*1 C' =(>) '*ipo*1 > ' =((>)) ' *hola*.

    s importante notar la di$erencia entre un protocolo y un aloritmo en t7rminos decriptora$4a.

    n aloritmo es el conjunto de pasos necesarios para trans$ormar un dato en un

    otro dato.

    n protocolo es el conjunto de todos los pasos entorno al transporte de la

    actividad criptor5$ica. Los protocolos usan necesariamente uno o mas aloritmoscriptor5$icos.n aloritmo de encriptaci6n poderoso 1 no arantia la con$idencialidad del mensaje.%orejemplo suponamos un aloritmo de ci$rado irrompile1 y un d7il protocolo1 si unapersona intercepta el mensaje y rompe el d7il protocolo1 este tendr5 acceso a la clavepara desencriptar el mensaje1 ya 3ue la clave no puede estar encriptada1 lo cual hace alaloritmo de encriptaci6n irrompile inDtil

    Criptosistemas de clae priada $algoritmos sim%tricos&."ormalmente no se suele usar un m7todo tan sencillo de ci$rado1 ya 3ue este es lineal ysolo depende de un $actor ( na entrada siempre produce la misma salida ) . n pasomasall5 es usar una clave para realiar el ci$rado. denot5ndolo asi88 de 9ava Criptoraphy -rchitecture

    0presamos la encriptaci6n como C ' &!#(>) .

    La desencriptacion como > ' =&!#(C)>' =&!#(&!#(>)).

    %ero no es lo mismo ci$rar y desci$rar con dos claves distintas. ntonces > '

    =&!?#(&!#(>)1 donde !? ' ! (mas adelante veremos 3ue esto si se puedecumplir si el ci$rado es asim7trico).stos son los conceptos matem5ticos 5sico para entender la criptora$4a.n ejemplo moderno de este tipo de sistema es el aloritmo =S

    Criptosistemas de clae publica $algoritmos asim%tricos&.%odemos dividir el tipo de encriptaciones seDn usen o no la misma contraseJa1 paraencriptar y desencriptar.

    =ecimos 3ue la encriptaci6n es sim7trica 3ue para desencriptar1 >'=&!#(&!#(>)) .

    Si usamos dos claves distintas entonces no hallamos ante encriptaci6n asim7trica.

    > ' =&!?#(&!#(>). - la llave 3ue usamos para encriptar ( !?) la llamamos*clave pulica* y la clave 3ue se usa para el desci$rado (!) es la *clave privada*Computacionalmente no dee ser posile trans$ormar una clave pulica en privada1veamos por 3ue :

  • 7/24/2019 Encriptacion Con Java

    4/22

    ? Sea !Kprivada la clave privada Sea !Kpulica la clave pulicaE Sea ( ) una $unci6n computacionalmente $actile 3ue trans$orme cual3uier clavepulica en una privada.8 Sea =(!Kprivada) la $unci6n de desencriptaci6n

    B %or de$inici6n1 >' =&!Kprivada#(&!Kpulica#(>))M (!Kpulica) ' !Kprivada1 entonces KKKN =O&!Kpulica# ( ) ' =&(!Kpulica)#() '=&!priv#() 1 esto 3uiere decir 3ue otenemos una $unci6n de desencriptaci6n a partir de laclave pulica. Lo 3ue nos lleva aA ! ' ()*+,pub-$E*+,pub-$!&&. %or lo cual hemos lo hemos reducido a unaencriptaci6nsim7trica l uso de las claves1 esto nos permite hacer pulicas la clave para ci$rar1 con la 3ue losusuarios podran ci$rar1 pero solo a3uellos 3ue posean la clave privada podran desci$rarel

    mensaje. %or lo cual podemos reciir mensajes secretos sin tener 3ue compartir la clave.

    Clae publica s clae priada8B de http://www.javahispano.com

    Las posiilidades de los aloritmos de clave pulica nos permiten varias opciones 3uenopermite los aloritmos de clase privada :

    Servicios de autenti$icaci6n

    $irma diital

    %ulicar una clave de ci$rado1 3ue puede ser distriuida sin riesos.

    %ero los aloritmos de clave privada tami7n tienen sus ventajas.Los aloritmos sim7tricos son mas r5pidos 3ue los de clave pulica1 por lo 3ue en

    mensajes laros es mejor usar uno de clave privada.

    tros tipos de /unciones0isten alunos tipos de $unciones 3ue siendo muy importantes para alunos aloritmosyprotocolos 1 no son $unciones de encriptaci6n en si mismas. Las $unciones de un solosentido son a3uellas 3ue tienen una soluci6n sencilla y de ajo coste computacional1pero3ue re3uieren un ran es$uero realiar la $unci6n inversa.

    Ptro tipo de *$unci6n*1 son las hash. 0as funciones hash no siren para asegurar laconfidencialidad1 sino para asegurar la integridad del mensa"e1 es decir para saer3ueel contenido no ha sido alterado por un atacante.La $unci6n de resumen hash toma un mensaje de 0Kits de lonitud variale1 lotrans$ormaen otro de h its de lonitud $ija ( h 'Q(0)1 este tipo de $unciones deen cumplir lassiuientes condiciones1 si se desean usar para prop6sitos criptor5$icos.

  • 7/24/2019 Encriptacion Con Java

    5/22

    Como la entrada es de lonitud variale1 por lo 3ue necesitara tener mecanismos

    3ue detecte y evite el desordamiento.

    devolver5 una cadena de lonitud $ija h

    para cual3uier entrada1 el *resumen* dee ser sencillo de calcular.

    la $unci6n dee ser de un solo sentido

    colisin dee de ser lo mas di$4cil posile encontrar valores de resumen repetidos 1

    es decir 3ue dado un 0 e y se minimice los casos de Q(0) ' Q(y)podemos hacer dos distinciones en las $unciones hash 1 se puede demostrar

    =7ilmente lire de colisiones 1 cuando e0iste aluna colisi6n

    uertemente lire de colisiones

    Llamamos huella al mensaje resumido1 l caso ideal seria a3uel 3ue camiando un itdela huella del mensaje1 supusiere una alteraci6n del B por ciento de los its del mensajeoriinal.8M de

    9ava Criptoraphy -rchitecture

    2ue hace seguro un protocolo3Feamos tres de$iniciones para poder a$rontar este tema

    Clave

    %assword palara 3ue es conocida por el usuario. 3ue le sirve para autenti$icarse y

    otener permisos. s d7il ante los ata3ues1 por ejemplo los sistemas 3ue usanpassword de M8Kits1 lo cual representa palaras de caracteres. %or desraciamuchas implementaciones usan estos caracteres directamente como clave. La$uera de estos aloritmos reside en suponer 3ue el atacante inora TM8posiilidades se ha escoido. Ptra deilidad es 3ue los password no suelen ser

    escoido al aar. Lo 3ue provoca 3ue la proailidad de 3ue aparecan ciertasletras1 y las posiciones 3ue estas ocupen siuen un patr6n calculale. %or ejemploen un usuario espaJol no suele usar la letra w y mucho menos dos w seuidas. %orlo cual es Dtil usar una $unci6n para crear una nueva clave a partir de la entrada delusuario.

    %assphrase normalmente tiene el mismo uso 3ue el password1 di$erenci5ndose de

    este principalmente en la lonitud1 entre y ? caracteres.La $uera ruta es uno de los m7todos usados para romper los aloritmos. ste m7todoseasa en proar todas las claves posiles hasta dar con la 3ue desci$ra el mensaje. n

    alunos casos se puede reducir el espacio de claves1 a trav7s de un an5lisis del mensaje1pero esto tampoco suele aportar randes ene$icios. l atacante dee saer cuando haotenido el mensaje correcto1 aun3ue esto no suele ser di$4cil. Cuanto mayor sea elnumero de its de la clave1 mayor ser5 el espacio de claves1 esto consiue 3ue el tiempo3ue tarde en romperse el aloritmo por $uera ruta se incremente de $ormae0ponencial.l diccionario espaJol tiene unas ? entradas1 con la capacidad de computo actual

  • 7/24/2019 Encriptacion Con Java

    6/22

    solo se tardar4a unos seundos en comproarlas todas1 como ya comentamos laspersonasno suelen memoriar claves al aar1 sino 3ue usan palaras con un sini$icado especial.

    anlisis criptogrfico.n este punto tami7n deemos entender una serie de conceptos 5sicos1 estascaracter4sticas son heredadas de la estructura de te0to plana.

    Entropa # La entrop4a es el e0ceso de in$ormaci6n suyacente 3ue se encuentra

    dentro del mensaje ci$rado. n ejemplo es la emisi6n codi$icada de Canal 1 elmensaje (la imaen normal) se encuentra dentro de la imaen 3ue vemoscodi$icada1 pero el e0ceso de in$ormaci6n hace imposile distinuir el sonido o laimaen1 ya 3ue esta in$ormaci6n e0cesiva corrompe el $ormato.

    cadencia del lengua"e # La cantidad de in$ormaci6n suyacente 3ue aJade cada8A de http://www.javahispano.com

    caracter aJadido a un mensaje. por ejemplo el espaJol aJade. %odr4a pensar se 3ue

    la cantidad de in$ormaci6n solo depende de cuantos caracteres posee el c6dio-SCII1 pero eso es $also1 ya 3ue tami7n depende de la distriuci6n deproailidad 3ue tiene cada letra. %or ejemplo una letra (la mas comDn en elespaJol) y la letra < no tienen la misma proailidad de aparecer en un mensaje.l prolema se audia por el hecho de 3ue las parejas de letras todav4a son mascomunes1 por ejemplo en espaJol nunca ocurre la pareja w3.Los tipos de ata3ue posiles contra un aloritmo1 depende sore todo 3ue posea elatacante

    Solo con el te0to ci$rado : n este caso normalente el atacante intenta deducir cual

    ser5 el te0to oriinal. "ormalmente usa un ata3ue por $uera ruta contra el espaciode claves.

    >ensaje y mensaje ci$rado : n este caso es mucho mas sencillo hallar las claves

    y asi poder desci$rar otros mensajes.Los aloritmos de ci$rado tienen dos modos de ir realiando estas operaci6n :

    Cifrado del flu"o # ste ci$rado coe el mensaje oriinal y va ci$rando it a it (o

    yte a yte )1 asi el el it(yte) ci$rado depende solo del it (yte) oriinal y de laclave.

    Cifrado por bloues # l aloritmo coe un lo3ue del mensaje oriinal

    (normalmente mas de M8 its )1 el mismo lo3ue de te0to y la misma clave creara elmismo lo3ue ci$rado

    Introduccin a la criptografa con5aaIntroduccin=esde la aparici6n de 9=G ?.8 1 java nos o$rece la posiilidad de traajar con un$ramewor! para criptora$4a incluido en el nDcleo de la 9F>. l $ramewor! 9C(9ava2>

  • 7/24/2019 Encriptacion Con Java

    7/22

    Cryptoraphy 0tension) nos o$rece las siuientes caracter4sticas

    Soporte para ci$rado sim7trico (=S1 RC1 y I=-)

    Soporte para ci$rado sim7trico (RS-)

    Ci$rado por lo3ues o por $lujo

    -loritmos >-C (>essae -uthentication Code)

    unciones de resumen ($unciones hash como >=B y SQ-? )

    Ueneraci6n de claves

    encriptaci6n ,asada en %assword ( %, )1 trans$orma un password en una clave

    rousta mediante procesos aleatorios

    -cuerdo de claves: es un protocolo1 para transmisiones entre dos o m5s partes1

    mediante el cual se pueden estalecer una acuerdo sore las claves de ci$rado sinintercamiar in$ormaci6n secreta9C $ue un $ramewor! opcional hasta la versi6n ?.8 y apareci6 por primera ve con lalleada de 9ava Las clases 5sicas de 9C son

    Cipher

    Las clases Cipher Stream (CipherInputStream1 CipherPutputStream)

    GeyUenerator

    SecretGeyactory

    Gey-reement

    >ac

    =istriuidas en los siuientes pa3uetes

    java0.crypto

    java0.crypto.inter$aces

    java0.crypto.spec

    Integridad de los mensa"esFeamos como podemos de$ender nuestros mensajes1 mediante el uso de $unciones deresumen (hash)1 para ello estudiaremos las di$erentes especi$icaciones 3ue no o$rece9=G?.8 en 9C.-nteriormente ya vimos en 3ue consist4an y 3ue condiciones de4an tener las $uncionesde resumen para ser Dtiles para su uso en proramas de ci$rado. -hora veremos el usode $unciones est5ndar como >=B.

    9=G?.8 nos o$rece los siuientes aloritmos de resumen!(6 y !(7 (3ue son aloritmos de ?Kits )

    89:,; (?MKit )

    89:,67=1 y 89:,7;61 ( BM1 EE1 y B? its1 respectivamente)

    Los mas comDn es usar >=B o SQ-?La clase >essae=iest maneja el resumen de los mensajes. sta clase tiene unconstructor proteido 1 por lo 3ue deemos acceder a ella mediante un m7todo llamado

  • 7/24/2019 Encriptacion Con Java

    8/22

    etInstance (Strin alotithm)1 donde el par5metro representa el alRL del aloritmocon el 3ue deseamos resumir.Feamos un ejemplo sencillo de una clase 3ue crea un resumen ci$rado con una clave

    V?W pulic static yteVW etGeyed=iest(yteVW u$$er1 yteVW !ey) &try &VW >essae=iest mdB ' >essae=iest.etInstance(*>=B*);VEW mdB.update(u$$er);V8W return mdB.diest(!ey);# catch ("oSuch-lorithm0ception e) VBW return null;#-nalic7moslo paso a pasoV?W 3ue le es pasada como par5metro1 el otro par5metro es un array de ytes (podr4a ser

    sustituido sin prolemas por un Strin).VW Creamos una instancia del ojeto >essae=iest.VEW l m7todo update( ) nos sirve para indicarle al ojeto 3ue realiara el resumen cualser5 el Strin o array de ytes a resumir.V8W H el m7todo diest(Secret !ey) se encara de hacer el resumen ci$rado con la clave.VBW devuelve un null por 3ue se produjo un error.

    l siuiente ejemplo muestra por consola1 el resumen del mensaje *hola mundo soy unte0to plano* realiado por SQ- y por >=B asi como los datos del %rovider1 comovemos a3u4 el resumen no se realia ci$rado con una clave.

    pulic class >essae=iest0ample &pulic static void main (StrinVW ars) throws 0ception &i$ (ars.lenth '?) & System.e0it(?); #yteVW te0to%lano ' arsVW.et,ytes(*2*);System.out.println( *Xn* messae=iest.et%rovider().etIn$o() );>essae=iest messae=iest ' >essae=iest.etInstance(*>=B*);messae=iest.update( te0to%lano);System.out.println( *Xnresumen: * );System.out.println( new Strin( messae=iest.diest()1 *2*) );System.out.println(*Xn KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXn*);

    >essae=iest md' >essae=iest.etInstance(*SQ-*);messae=iest.update( te0to%lano);System.out.println( *Xnresumen:* );System.out.println( new Strin( messae=iest.diest()1 *2*) );##Feamos mas a $ondo este ejemplo.

  • 7/24/2019 Encriptacion Con Java

    9/22

    %rimero nos $ijamos en 3ue creamos un Strin con el par5metro 21 esto es por 3uealunos caracteres del resumen pueden dar prolemas al salir por pantalla.? messae=iest.et%rovider().etIn$o() nos da la in$ormaci6n del %rovider Con etInstance otenemos dos instancias una del aloritmo >=B y otra SQ-1 conlas 3ue podremos hace el resumen del mensaje.

    E con update1 introducimos el mensaje 3ue 3ueremos resumir8 diest() realiamos la acci6n de resumen.sta es la salida 3ue me aparece a m41 los datos 3ue pueden camiar son los del%rovider.

    C:X>is%rueasXSeuridadX9CNjava >essae=iest0ample *Qola mundo soy un te0toplano*S" (=S- !ey/parameter eneration; =S- sinin; SQ-K?1 >=B diests;SecureRandom; .B@ certi$icates; 9GS !eystore; %GI Cert%athFalidator; %GICert%ath,uilder; L=-%1 Collection CertStores)resumen:

    +Y+Bh+n+mZh[+KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKresumen:+++18++ +w+aG\A++t+

    Femos 3ue las salidas son di$erentes tanto en contenido como en lonitud1 ? its 3uecodi$ican ?M caracteres para el >=B y ?M its 3ue eneran los caracteres1 sinecesit5semos un resumen mayor (por ejemplo para evitar una colisi6n1 usar4amos SQ-BM o un SQ- de mayor tamaJo)%ara enerar claves adecuadas podemos usar

    Feamos un ejemplopulic class >essae-uthenticationCode0ample &pulic static void main (StrinVW ars) throws 0ception &i$ (ars.lenth '?) & System.e0it(?); #yteVW te0to%lano ' arsVW.et,ytes(*2*);System.out.println( *Xn Uenerando la clave..................* );GeyUenerator !eyUen ' GeyUenerator.etInstance(*Qmac>=B*);SecretGey >=B!ey ' !eyUen.enerateGey();System.out.print( *Clave enerada* );>ac mac ' >ac.etInstance(*Qmac>=B*);

    mac.init(>=B!ey);mac.update(te0to%lano);System.out.println( *Xn>-C: * );System.out.println( new Strin( mac.doinal()1 *2*) );System.out.println( *XnKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXn* );System.out.println( *Xn Uenerando la clave..................* );GeyUenerator !eyUen ' GeyUenerator.etInstance(*QmacSQ-?*);SecretGey SQ-?!ey ' !eyUen.enerateGey();

  • 7/24/2019 Encriptacion Con Java

    10/22

    System.out.print( *clave enerada* );>ac mac ' >ac.etInstance(*QmacSQ-?*);mac.init(SQ-?!ey );mac.update(te0to%lano);System.out.println( *Xn>-C: * );

    System.out.println( new Strin( mac.doinal()1 *2*) );##ste ejemplo tarda mas de un minuto en ejecutarse1 esto se dee a 3ue se enerannumero seudoKaleatorios a trav7s de capturas del reloj interno La salida de consola estave nos da el siuiente resultado.C:X>is%rueasXSeuridadX9CNjava >essae-uthenticationCode0ample *%roando elenerador*Uenerando la clave..................Clave enerada>-C:Z+++ ]Y^ + n+

    KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKUenerando la clave..................Clave enerada>-C:+++ + ++Q++o+++++n el ejemplo hemos usado tres clases hasta ahora desconocidas ve5moslas a $ondo

    0a clase ?ey@eneratorLa clase GeyUenerator es usada para enerar claves secretas para usarse en aloritmossim7tricos.Como mucha de las clases de esta -%I1 GeyUenerator se instancia a trav7s de una$actor4a (el patr6n $actory no es tratado en este tutorial )1 a trav7s del m7todo

    etInstance pulic static GeyUenerator etInstance(Strin alorithm) . especi$ica el

    aloritmo de ci$rado pulic static GeyUenerator etInstance(Strin alorithm1 Strin

    provider) especi$ica el proveedor y el aloritmo de ci$rado.Los aloritmos para los 3ue enerar claves esta disponile son

    -S

    ,low$ish

    =S

    =Sede

    Qmac>=B

    QmacSQ-?2odos los aloritmos comparten el concepto de aleatorio y de tamaJo de la clave parespeci$icar estos atriutos tenemos los m7todo init. los tres primeros casos son Dtilespara todos1 y los dos siuientes se usan para con$iurar par5metros espec4$icos del alDnaloritmo.

    pulic void init(SecureRandom random);

    pulic void init(int !eysie);

    pulic void init(int !eysie1 SecureRandom random);

  • 7/24/2019 Encriptacion Con Java

    11/22

    pulic void init(-lorithm%arameterSpec params);

    pulic void init(-lorithm%arameterSpec params1 SecureRandom random);

    para crear la clave deemos crear un ojeto de la clase SecretGey ( para almacenar laclave) y usar el m7todo enerateGey( ); %or ejemploSecretGey clave ' mi!eyUenerator.enerateGey();

    0a clase !acLa clase >ac1 nos proporciona las $uncionalidades para autenti$icar los mensajes.n la clase >ac1 tami7n se crea a trav7s de una $actor4a.

    pulic static >ac etInstance(Strin alorithm);

    pulic static >ac etInstance(Strin alorithm1 Strin provider);

    Iniciamos la clase >ac con los m7todos

    pulic void init(Gey !ey);

    pulic void init(Gey !ey1 -lorithm%arameterSpec params);

    Confidencialidad del mensa"e con clae priada.Introduccin-hora 3ue hemos aseurado el mensaje de posiles ata3ues1 es importante 3ue elatacante1 no pueda ver su contenido. Feremos como ci$rar con aloritmos de clavesim7trica. 9=G?.8 soporta los siuientes aloritmos :

    (E8. =S (=ata ncryption Standard) desarrollado por I,> en los A. s un ci$rado

    de lo3ue de BMKit

    Triple(E8. Consiste en aplicar el aloritmo =S tres veces (encriptar desencriptar

    encriptar) con dos claves dando un resultado de ?? its.

    :E8. s el aloritmo 3ue reemplao a =S. Creado por 9oan =aemen y Fincent

    Rijmen. s un ci$rado por lo3ue de ?Kit con claves de lonitud ?1 ?@ o BM its.

    AC61 AC41 and AC7.

    Blofish. ue creado por ,ruce Schneier y hace un ci$rado por lo3ues con claves de

    lonitud variale desde E a 88 its (en mDltiplos de )1 =iseJado para ser e$iciente encomputadores.

    DBE. %, (%assword ,ased ncryption) puede ser usado con aloritmos de clave

    privada y $unciones de resumen.Si tenemos una lirer4a de otro proveedor 3ue no sea Sun >icrosystem1 podemos teneralunas opciones mas1 para comproar 3ue opciones podemos eleir usaremos

    StrinVW aloritmos ' etCryptoImpls(*Cipher*);// para verlos por consola$or (int i '; i_aloritmos .lenth ; i)System.out.println(aloritmosViW);.....

    n ejemplo de salida seria,low$ish=Sede

  • 7/24/2019 Encriptacion Con Java

    12/22

  • 7/24/2019 Encriptacion Con Java

    13/22

    .init$Cipher.EGCAHDT!(E1 clae

    AealiJamos el cifrado

    .do/inal$teKtoDlano

    Configuramos otra eJ el ob"eto Cipher

    .init$Cipher.(ECAHDT!(E1 clae&

    H desciframos

    .do/inal$cipherTeKt&

    Uenerar claves es muy sencillo1 solo tenemos 3ue indicar con 3ue aloritmo deseamos3ue sea compatile nuestra clave el tamaJo y llamar al m7todo Pserven este sementode c6dio:try &//clave de tamaJo de BM its para desGeyUenerator !eyUen ' GeyUenerator.etInstance(*=S*);!eyUen.init(BM);SecretGey clave? ' !eyUen.enerateGey();

    // Uenera clave para ,low$ish!eyUen ' GeyUenerator.etInstance(*,low$ish*);SecretGey clave ' !eyUen.enerateGey();// Uenera clave para triple =S!eyUen ' GeyUenerator.etInstance(*=Sede*);SecretGey claveE ' !eyUen.enerateGey();# catch (java.security."oSuch-lorithm0ception e) & #Feamos un ejemplo mas laropulic class %rivate0ample &pulic static void main (StrinVW ars) throws 0ception &i$ (ars.lenth '?) & System.e0it(?); #

    yteVW te0to%lano ' arsVW.et,ytes(*2*);GeyUenerator !eyUen ' GeyUenerator.etInstance(*=S*);!eyUen.init(BM);Gey clave ' !eyUen.enerateGey();Cipher ci$rar ' Cipher.etInstance(*=S/C,/%GCSB%addin*);ci$rar.init(Cipher."CRH%2[>P=1 clave);yteVW cipher2e0t ' ci$rar.doinal(te0to%lano);System.out.println( new Strin(cipher2e0t1 *2*) );ci$rar.init(Cipher.=CRH%2[>P=1 clave);yteVW new%lain2e0t ' ci$rar.doinal(cipher2e0t);System.out.println( new Strin(new%lain2e0t1 *2*) );##Qemos visto como ci$rar un mensaje1 pero esto no es lo Dnico 3ue podemos. Sirecordamos la inter$ace Serialiale1 nos permit4a crear un Stream de un Pjeto1 por lotanto1 nosotros podemos ci$rar este Stream. Feamos un ejemplo 3ue eso siempre ayuda:pulic class ClaseSecreta implements java.io.Serialiale &Strin s ' *sto clase es secreta*;

  • 7/24/2019 Encriptacion Con Java

    14/22

    #....

    try &// Creamos una llave;SecretGey clave' GeyUenerator.etInstance(*=S*).enerateGey();

    // con$iuramos el ci$radoCipher ci$rar ' Cipher.etInstance(*=S*);ci$rar .init(Cipher."CRH%2[>P=1 llave);// encritamosSealedPject so ' new SealedPject(new ClaseSecreta()1 ci$rar );// Ptenemos el aloritmo con el 3ue se ci$r6 nos devolver5 =S.Strin nomre-lo ' so.et-lorithm();// con$iuramos el desci$rado1// he creado otro cipher por 3ue normalmente no se usa el mismo 3ue lo cre6Cipher desci$rar' Cipher.etInstance(nomre-lo );desci$rar.init(Cipher.=CRH%2[>P=1 llave);

    // =esci$ramosClaseSecreta o ' (ClaseSecreta)so.etPject(desci$rar);# catch (java.io.IP0ception e) catch (Class"otound0ception e) catch (java0.crypto.Illeal,loc!Sie0ception e) catch (java0.crypto.,ad%addin0ception e) catch (java0.crypto."oSuch%addin0ception e) catch (java.security."oSuch-lorithm0ception e) catch (java.security.InvalidGey0ception e)

    ,ueno esto es muy onito1 pero .....- 3ue te ustar4a tener una clase 3ue dada una Strinlo ci$rase1 pues vamos a por ellapulic class =esncriptar &Strin -loritmo;SecretGey clave;=esncriptar ( Strin -loritmo1 SecretGey clave) &this.-loritmo ' -loritmo;this.clave' clave;#=esncriptar (Strin -loritmo)&this.-loritmo ' -loritmo;

    this.clave' new GeyUenerator.etInstance(*=S*).enerateGey();#pulic Strin encriptar(Strin str) &try &//KKKKKKKKKKK %asamos a ,ytes para hacer ien el ci$radoyteVW cadena,yte' str.et,ytes(*2*);Cipher ci$rar' Cipher.etInstance(-loritmo);ci$rar.init(Cipher."CRH%2[>P=1 clave);

  • 7/24/2019 Encriptacion Con Java

    15/22

    yteVW enc ' ci$rar.doinal(cadena,yte); // ci$ramos// KKKKKKKKKK %asamos a,aseM8 para otener un Strinreturn new sun.misc.,-SM8ncoder().encode(enc);# catch (java0.crypto.,ad%addin0ception e) catch (Illeal,loc!Sie0ception e) &

    # catch (nsupportedncodin0ception e) catch (java.io.IP0ception e) return null;#pulic Strin desencriptar(Strin str) &try &// KKKKKKKKKKKK Ptenemos los ,ytes del Strin encriptadoyteVW dec ' new sun.misc.,-SM8=ecoder().decode,u$$er(str);Cipher desci$rar' Cipher.etInstance(-loritmo);desci$rar.init(Cipher.=CRH%2[>P=1 clave);

    yteVW cadena,yte' dcipher.doinal(dec);// KKKKKKKKKKKKK Folvemos a pasarlo a $orma de cadena.return new Strin(cadena,yte1 *2*);# catch (java0.crypto.,ad%addin0ception e) catch (Illeal,loc!Sie0ception e) catch (nsupportedncodin0ception e) catch (java.io.IP0ception e) return null;#

    #La clase anterior esta diseJada para poder encriptar o desencriptar repetidamente1Imainemos 3ue ,o tiene una lista de nomres de personas invitadas por -lice a una$iesta. Feamos como tratar4amos esa lista con nuestra clase1 hemos supuesto 3ue ,oconoce la clave secreta de -lice1 3ue -lice ci$ro la lista con =S y 3ue 3uiere leer elcontenido de la lista.// la variale lista"omres contiene los nomres ci$rados=esncriptar desen ' new =esncriptar (*=S*1clave-lice);$or (int i ' ; i_lista"omres.lenth; i)lista"omresViW ' desen.desencriptar(lista"omresViW );// y ya esta

    Feamos como -lice ci$ro la lista// la variale lista"omres contiene los nomres sin ci$rar=esncriptar desen ' new =esncriptar (*=S*1clave-lice);$or (int i ' ; i_lista"omres.lenth; i)lista"omresViW ' desen.encriptar(lista"omresViW );// y ya esta y solo se di$erencia en tres letras .... ya solo 3uedaria enviarlaPviamente esto tiene un prolema1 -lice y ,o tienen 3ue conocer la clave

  • 7/24/2019 Encriptacion Con Java

    16/22

    Confidencialidad del mensa"e con clae publica.La claves privadas tienen un prolema1 Suponamos 3ue -lice 3uiere comunicarse con,o1 y no desea 3ue >allory pueda leer el mensaje. %or lo cual decide ci$rar el mensaje1para ello crear una clave de ci$rado1 y a3u4 llea el prolema 1 solo esa clave rompe elci$rado1 por lo 3ue ,o necesita conocer esa clave1 por lo 3ue tiene 3ue envi5rsela1 deese modo pone en peliro el ci$rado1 ya 3ue la clave es in$ormaci6n sensile. Si >alloryintercepta la clave1 el ci$rado ser5 inDtil.La encriptaci6n asim7trica elimina el prolema de compartir in$ormaci6n sensile. Ha3ue la clave de ci$rado se puede compartir sin prolemas1 y la clave de desci$rar solo latiene 3ue poseer un el receptor. Imainemos 3ue -lice y o deen mantener unaconversaci6n secreta 3ue har4an; :lice crea su clae priada y una clae publica de cifrado y se la manda a Bob

    sin tener ue tomar precauciones

    6 Bob crea su clae priada y su clae publica y se la manda a :lice sin o tomar

    precauciones.

    = :lice crea un mensa"e y lo cifra con la clae pblica de Bob y le manda elmensa"e

    4 Bob recibe el mensa"e y lo descifra con su clae priada

    7 Bob crea la respuesta la cifra con la clae pblica de :lice y se lo manda a Bob y

    as hasta ue terminen .....

    %odemos usar dos aloritmos para el ci$rado asim7trico RS-. s el aloritmo mas

    popular de ci$rado asim7trico1 pero no es soportado por 9=G ?.8 por lo 3ue deeinstalarse una lirer4a de un tercero por ejemplo

    ,ouncyCastle =i$$ieKQellman. - este aloritmo se le conoce como acuerdo de claves

    "o puede ser usado para la encriptaci6n1 pero puede usarse para permitir a las dospartes derivar una clave secreta comparrtiendo in$ormaci6n por canales pDlicos1 . Hesta clave ser usada en ci$rado sim7trico.

    Esuema bsico de cifrado y descifrado con clae publica.Feremos 3ue es muy parecido al uso de claves privadas.Drimero crearemos la clae

    [email protected]$A8:&1

    .initialiJe$;L64&1

    .generate?eyDair$

    Creamos un ob"eto Chiper y lo configuramos con los parmetros deseados

    Cipher.getInstance$A8:FECBFD?C8;Dadding&

    .init$Cipher.EGCAHDT!(E1 clae.getDublic$&

    AealiJamos el cifrado

    .do/inal$teKtoDlano

    Configuramos otra eJ el ob"eto cipher

    .init$Cipher.(ECAHDT!(E1 clae.getDriate$&&

    y desciframos

    .do/inal$cipherTeKt&

  • 7/24/2019 Encriptacion Con Java

    17/22

    Crear el par de claves pulica/privada es casi tan sencillo como enerar una calveprivada1 $ij7monos en el siuiente semento de c6dio. Qe intentado 3ue se pareca alde la secci6n anterior para ver las escasas di$erencias.

    try &

    // par de claves?8Kit =iital Sinature -lorithm (=S-)Gey%airUenerator !eyUen ' Gey%airUenerator.etInstance(*=S-*);!eyUen.initialie(?8);Gey%air %arClaves? ' !eyUen.enGey%air();%rivateGey clave%rivada? ' !eypair.et%rivate();%ulicGey clave%ulica? ' !eypair.et%ulic();// par de claves BAMKit =Q!eyUen ' Gey%airUenerator.etInstance(*=Q*);!eyUen.initialie(BAM);Gey%air %arClaves ' !eyUen.enGey%air();%rivateGey clave%rivada' !eypair.et%rivate();

    %ulicGey clave%ulica ' !eypair.et%ulic();// par de claves ?8Kit RS-!eyUen ' Gey%airUenerator.etInstance(*RS-*);!eyUen.initialie(?8);Gey%air %arClavesE ' !eyUen.enGey%air();%rivateGey clave%rivadaE ' !eypair.et%rivate();%ulicGey clave%ulicaE' !eypair.et%ulic();# catch (java.security."oSuch-lorithm0ception e) Feamos un ejemplo mas laro

    pulic class %ulic0ample &pulic static void main (StrinVW ars) throws 0ception &i$ (ars.lenth '?) & System.e0it(?); #yteVW te0to%lano ' arsVW.et,ytes(*2*);Gey%airUenerator !eyUen ' Gey%airUenerator.etInstance(*RS-*);!eyUen.initialie(?8);Gey%air clave ' !eyUen.enerateGey%air();Cipher ci$rar ' Cipher.etInstance(*RS-/C,/%GCS?%addin*);System.out.println( *Xn* ci$rar.et%rovider().etIn$o() );System.out.println(*Xn KKKKKKKKKKKKK 2e0to encriptado *)ci$rar.init(Cipher."CRH%2[>P=1 clave.et%ulic());

    yteVW cipher2e0t ' ci$rar.doinal(te0to%lano);System.out.println( new Strin(cipher2e0t1 *2*) );System.out.println(*Xn KKKKKKKKKKKKK 2e0to normal *)ci$rar.init(Cipher.=CRH%2[>P=1 clave.et%rivate());yteVW new%lain2e0t ' ci$rar.doinal(cipher2e0t);System.out.println( new Strin(new%lain2e0t1 *2*) );##

  • 7/24/2019 Encriptacion Con Java

    18/22

  • 7/24/2019 Encriptacion Con Java

    19/22

    -lice manda a ,o su clave pulica1 sin ninuna proteccion ya 3ue no es in$ormacionsensile1E ,o crea una clave privada y una pulica8 ,o manda a -lice su clave pulica.B -lice escrie su mensaje y lo encripta con la clave pulica de ,o

    M -lice utilia una $uncion de resumen sore su mensaje y lo encripta con 8U DADI:C0:ME DAIM:(: 1 este resumen ci$rado es la $irma.A -lice manda a ,o el mensaje y la $irma a ,o ,o desci$ra el mensaje con su clave privada.@ ,o veri$ica la procedencia y la interidad del mensaje de -lice1 usando la C0:MEDUB0IC: (E :0ICE

    ? Si se veri$ica entonces el mensaje proviene de alice y ademas no ha sido alterado.Si >allory huiese modi$icado el mensaje1 o simplemente lo huiese enviado ella1 a$irmano se veri$icaria1 %or 3ue + %uede darse dos casos

    Si >allory modi$ico el mensaje1 el resumen del mensaje 3ue recie ,o1 no

    coincide con el reumen 3ue e0iste en la $irma

    Si el mensaje no es de -lice1 aun3ue el resumen coincide con el contenido del

    mensaje1 ,o no puede veri$icarlo ya 3ue la clave pulica de -lice solo sirve paraveri$icar un mensaje $irmado por la clave privada de -lice. La cual desconoce>allory por lo cual la tuvo 3ue $irma con otra.ste sistema es muy seuro1 pero presenta una situaci6n en la 3ue >allory puedehacersepasar por -lice. Recordemos 3ue una $uncion de resumen puede producir colisiones1 esdecir1 dos mensajes distintos pueden producir el mismo resumen. pro lo 3ue si malloryes

    capa de encontrar una colision para el mensaje1 podria escriir un nuevo mensajeci$rarloMB de http://www.javahispano.com

    con la clave pulica de ,o y dejar la $irma del mensaje oriinal de -lice. ste caso esmuy improale 3ue se de1 primero es muy di$icil encontrar una colisi6n1 y seundo esmucho mas di$icil 3ue esa colision tena sentido. %or ejemplo -lice escrie a ,o paracon$irmar una comprar *Si1 3uiero realiar la compra* y >allory desea realiar lacompraella. por lo 3ue deeria encontrar una colision y 3ue ademas e0presase lo contrario alocomo *"o deseo realiar la compra* y e0isten una posiilidades minimas de 3ue e0ista

    esa(u otra colision) 3ue pueda e0presar eso.Ptro metodo para aseurarnos la autenticidad de 3uien proviene el mensaje seria usar la-pir Certh%ath y el concurso de una tercera parte.

    Esuema basico para realiJar y comprobar una firma

    digital.Creamos una clae

  • 7/24/2019 Encriptacion Con Java

    20/22

    [email protected]$A8:&

    .initialiJe$;L64&

    .generate?eyDair$&

    Creamos una firma del ob"eto y la inicialiJamos

    Cipher.getInstance$!(7NithA8:&

    .init8ign$clae.getDriate$&&

    Calculamos la firma apartir del un teKto plano y firmamos

    .update$teKtoDlano&

    .sign$&

    Configuramos la erificacin y erificamos la firma

    .initMerify$clae.getDublic$&&

    .erify$signature Merifies the signature.

    Feamos una clase 3ue nos crea la $irma de un Strin:pulic static yteVW createSinature(%rivateGey clave1 Strin Str) &try &//KKKKKKKKKKK %asamos a ,ytes para hacer ien el ci$radoyteVW cadena,yte' str.et,ytes(*2*);Sinature si ' Sinature.etInstance(clave.et-lorithm());si.initSin(clave);si.update(cadena,yte1 1 cadena,yte.lenth);return si.sin();# catch (Sinature0ception e) catch (InvalidGey0ception e) catch ("oSuch-lorithm0ception e)

    return null;#l ejemplo anterior1 es una $orma de crear una $irma diital aun3ue no es la unica1 si eslamas correcta. n el siuiente ejemplo crear la $irma es aun un poco massencillo.Feamosahora ejemplo del uso de la $irma diital1 tanto $irmar1 como veri$icar :pulic class jemploirma &pulic static void main (StrinVW ars) throws 0ception &i$ (ars.lenth '?) & System.e0it(?); #yteVW te0to%lano ' arsVW.et,ytes(*2*);

    Gey%airUenerator !eyUen ' Gey%airUenerator.etInstance(*RS-*);!eyUen.initialie(?8);Gey%air clave' !eyUen.enerateGey%air();claveSinature si ' Sinature.etInstance(*>=B

  • 7/24/2019 Encriptacion Con Java

    21/22

    yteVW sinature ' si.sin();System.out.println( si.et%rovider().etIn$o() );System.out.println( *Xn irma :* );System.out.println( new Strin(sinature1 *2*) );si.initFeri$y(clave.et%ulic());

    si.update(te0to%lano);try &MA de http://www.javahispano.com

    i$ (si.veri$y(sinature)) & System.out.println( *Feri$icaci6n positiva* ); #else System.out.println( *allo la veri$icacion* );# catch (Sinature0ception se) & System.out.println( *allo la veri$icacion* ); ###

    /irmar un ob"eto.e6L7. 8igning a 5aa b"ect

    n ojeto *serialiale* se puede $irmar con una llave privada. Cuando se ha creado unacopia $irmada1 los camios en el no a$ectan al ojeto $irmado1 esto es loico ya 3ue sinola $irma no coincidiria con el ojeto $irmado al estar modi$icadopulic class micalse implements Serialiale &Strin s ' *mi cadena*;int i ' ?E;#try &// creamos el par de llaves para un aloritmo =S- con clave de ?8 its

    Gey%airUenerator !eyUen ' Gey%airUenerator.etInstance(*=S-*);!eyUen.initialie(?8);Gey%air !eypair ' !eyUen.enGey%air();%rivateGey privateGey ' !eypair.et%rivate();%ulicGey pulicGey ' !eypair.et%ulic();# catch ("oSuch-lorithm0ception e) // Creamos una instancia del SinedPjectSinedPject so ' null;try &Serialiale o ' new micalse();

    Sinature si ' Sinature.etInstance(privateGey.et-lorithm());// $irmamosso ' new SinedPject(o1 privateGey1 si);# catch ("oSuch-lorithm0ception e) catch (Sinature0ception e) catch (InvalidGey0ception e) catch (IP0ception e) &

  • 7/24/2019 Encriptacion Con Java

    22/22

    #%ara veri$icar un ojeto $irmado.try &// creamos una instancia de Sinature indicandole las llaves en ve del aloritmo.Sinature si ' Sinature.etInstance(pulicGey.et-lorithm());

    oolean ' so.veri$y(pulicGey1 si);// Ptenemos el ojetomicalse o ' (micalse)so.etPject();# catch (Sinature0ception e) catch (InvalidGey0ception e) catch ("oSuch-lorithm0ception e) catch (Class"otound0ception e) catch (IP0ception e) Con eto terminamos el apartado de criptora$4a1 se nos 3uedan cosas por ver1 pero estasse

    salen de los limites del tutorial.

    captulo 78eguiridad en comunicaciones

    soc+etsEn desarrollo. Si tienes alguna sugerencia o aportacion sobre este tema, realiza una

    anotacin.

    captulo