* CIFRADO DE CLAVE PÚBLICA Tenemos un número n del que se conoce la función de Euler e.d = 1 mod Euler(n) Dado n, su función de Euler no se puede saber si no se factoriza, y ésto no es posible si se tiene un número muy grande. e es inverso de d El inverso se calcula con el algoritmo extendido de Euler, que ya se vió anteriormente. (e,n) es la clave pública (d,n) es la clave privada d es secreto, mientras que e la conoce todo el mundo. Ahora nos surge la pregunta: ¿ Dado n, puedo saber d ? La respuesta es NO Se conoce n pero no su factorización en números primos, por tanto, no conoce la función de Euler y no puedo saber d. * RSA En RSA: c= m^e mod n El cifrdo se hace con clave pública (e,n) Para que la operación sea rápida, se coge e pequeño, mientras que n es grande. m= c^d mod n El descifrado se hace con la clave privada (d,n) d es grande, c es grande y n tambien es grande c= m^e c^d = m^(e.d) = m ya que e y d son inversas Se cogen p,q dos primos fuertes n=p.q de forma que p,q son secretos y n es público Dado n, no se pueden sacar p y q, porque no se puede factorizar. Euler(n)=(p-1).(q-1) La función de Euler es secreto, ya que p y q son secretos Para e se puede tomar el valor 3 o 65535. En la práctica se coge el valor 3 A partir de e, mediante el algoritmo extendido de Euler para el cálculo de inversas, se obiene d. Recordar que e la conoce todo el mundo. (e,n) es la clave pública y (d,n) la clave privada. Existen unos documentos que explican como usar la criptografía de clave pública. Entre ellos tenemos los PKCS1 a PKCS12 En concreto, en el PKCS1 se describe el RSA. El RSA no se usa para cifrar grandes mensajes (textos largos) Es susceptible de un ataque. Hay una lista de niveles de facilidad para atacar un mensaje cifrado. Un problema es que en RSA sé la clave pública y puedo cifrar lo que quiera. Esto es un inconveniente de los algoritmos de clave pública, ya que se puede ir probando, cifrando lo que se quiera y ver lo que sale y así se podría llegar a criptoanalizar un texto cifrado con RSA. El RSA no tiene ninguna longitud de clave predeterminada. Se trabajan con claves de longitud 512 bits (se considera débil, como una DES de 56 bits), de 1024 bits (se consideran sólidas). Tampoco hay inconveniente de usar claves de 2048 bits. Hasta hace poco solo se podían usar de 512 bits, ahora se pueden generar de 1024, 2048 y hasta 3kbits. Hay un compromiso entre longitud de clave y tiempo. * A continuación, vamos a ver como se consigue la confidencialidad y la autenticidad. KA es la clave privada de A y PA su clave pública. La llave privada se la guarda y la llave pública la hace pública. - Si quiero enviar un mensaje de A a B y quiero que sea secreto estoy buscando la confidencialidad. c= EpB(m) A manda a B el mensaje cifrado con la clave pública de B (c). En B, lo que se cifra con una clave se descifra con la otra clave y solo con la otra clave DkB(c) = DkB(EpB(m)) = m - Si busco autenticidad, A genera el mensaje cifrado, cifrando con la clave privada de A y se lo manda a B. c=EkA(m) Este mensaje lo puede descifrar cualquiera porque cualquiera tiene la clave pública de A (PA). DpA(c)= DpA(EkA(m)) = m Este mensaje c no es mensaje secreto ya que cualquiera lo puede descifrar. Vamos a resolver estos dos problemas por separado: 1) Queremos que el mensaje sea secreto (confidencialidad) Generamos aleatoriamente un número gordo. Se le va a llamar clave de sesión (S) Se llama así porque solo sirve para una sesión (no sirve para otras sesiones), luego se tira. Con la S, hacemos un cifrado con des, blowfish u otros (Es(m)) Es(m) es muy grande. La clave de sesión se cifra con la clave pública de B (EpB(s)) Se envía Es(m) concatenado con EpB(s) Es(m) EpB(s) Si se desea enviar a B a C y a D, enviamos Es(m) EpB(s) EpC(s) EpD(s) Tras enviar ésto, la clave S se tira a la basura. En el receptor, se coge EpB(s) y se descifra con la clave privada de B (DkB(EpB(s))) y se obtiene S. Se coge Es(m) y se descifra con la clave S que hemos obtenido Ds(Es(m)) y se obtiene m. En ocasiones se suele enviar de A a B Es(m) EpB(s) EpA(s) Se añade EpA(s) para que A pueda guardar copia de los mensajes que manda y así pueda leer el mensaje que mandó cuando desee. 2) Queremos que el mensaje sea auténtico Introducimos el concepto de función de Hash o función de resumen Las funciones de Hash son funciones matemáticas que cumplen: a) La entrada de la función Hash es un texto de tamaño cualquiera, su salida es un texto de tamaño fijo. b) Dado un mensaje y su función de resumen, cualquier cambio mínimo, tanto de posición del byte como de eliminar bytes, ha de producir cambios enormes en el resultado de la función de Hash. c) Dado un resumen ha de ser extremadamente difícil encontrar un texto que fabrique ese resumen. La cuestión es qué función de resumen debemos escoger. Entre las firmas más populares tenemos la md5 (128 bits), sha1(160 bits) y sha2. El resumen debe ser como mínimo de 100 bits. El md5 es completamente seguro, con 128 bits es más que seguro. El resumen sirve para resumir, no para cifrar. Usamos funcion de resumen sin clave (H(m)) aunque las hay con clave. Enviamos EkA(H(m)) m EkA(H(m)) suele ser de unos 160 bits (tamaño bastante pequeño) y m es muy grande. A EkA(H(m)) se le llama firma electrónica (F). El receptor ha de comprobar la autenticidad. c se obtiene concatenando el mensaje original (m) y la firma electrónica (F). En el receptor se toma la firma (F) y se calcula DpA(F), es decir se descifra F con la clave pública de A. Se tendrá que ver si H(m)=DpA(F). H(m)=DpA(EkA(H(m)))=DpA(F) si todo funciona bien. Si H(m) es distinto de DpA(F), entonces está mal por algún motivo. Si quiero conseguir las dos cosas, es decir, que el mensaje sea secreto y además auténtico se debe firmar y cifrar. El mensaje será firmado y cifrado. La pregunta que surge es: ¿ Se cifra primero o se firma primero ? La respuesta es: Primero se firma y luego se cifra, ya que si primero se cifrara y luego se firmara se vería la firma y con ésto le estariamos dando cierta información (le dariamos información de que es mensaje firmado) al que pinchara la comunicación. Lo correcto (lo mejor) es Firmarlo, cifrarlo y luego mandar el mensaje con un remitente distinto (remitente distinto al nuestro). El mensaje firmado y cifrado se le envía a B c= EpB(EkA(m)) En el receptor (B), se descifra con su clave privada (DkB(c)) y luego se descifra con la clava pública de A y se obtine m DpA((DkB(c)) = m En la práctica: A DkA(H(m)) concatenado con m se le llama mensaje firmado (M) Lo que se envía es Es(M) concatenado con EpB(s), lo que nos da el mensjae firmado y cifrado correctamente. Es( EkA(H(m)) m ) EpB(s) * AUTORIDADES CERTIFICADORAS La pregunta que se debe resolver a continuación es: ¿ Cómo sabe A que PB es la clave pública de B y cómo sabe B que PA es la clave pública de A ? Existen dos técnicas: 1) Contacto directo: A le entrega su clave pública a B 2) Si no es posible un contacto directo, se puede recurrir a la confianza (es un método cuando no hay contacto directo). Un ejemplo de este segundo método es el estándar X509 de ISO Se trata de utilizar un notario o red de notarios. Al notario en Internet se le llama Autoridad Certificadora. PGP trata de hacer ésto sin necesidad de notarios. Se basa en la confianza pero en amigos (no en notarios). Se le llama confianza en horizontal. A la confianza en notarios se le llama confianza en vertical. El notario sólo certifica que la clave privada de A es de A (dice si KA es de A). El notario acredita las llaves y a partir de entonces ya no entra, se aparta. La autoridad certificadora se encarga de que sepamos a quien pertenece lo que hemos recibidos. Concepto de certificado: El certificado es un objeto que se compone de una serie de datos. El X509 es un protocolo que se usa para emitir certificados. Contiene: - El Distinguised Name (DN) llamado tambien Subject DN y Subject no son sinónimos. El subject es el individuo (persona o máquina) El DN se compone de los siguientes subcampos: + Common Name (CN), que es el nombre de la persona. + Organizational Unit (OU), que es el departamento de gestión + Organización (O) + Country (C), que es el país + Pueblo (L) + Comunidad (St) Esto es en el X509 puro. Tambien se le puede añadir la dirección de correo (Email) A continuación se añade: - DN issuer, el del emisor, autoridad que lo está emitiendo. - Versión - Numero de serie - Fecha de inicio y de fin (terminación de la validez del certificado) - Algoritmos - Firma del issuer - Clave pública del subject En este tipo de certificación hay que tener la clave privada y la clave pública meterla en el certificado. El certificado lo puede emitir otra autoridad certificadora. Si el certificado de la autoridad raíz lo ha firmado con la llave privada que corresponde a la clave pública del certificado, se llama certificado autofirmado. Hemos de tener el certificado de la autoridad. ¿ Cómo tener el certificado de la autoridad ? Hay que ir a dependencias de la autoridad certificadora para obtener el certificado. En la práctica los certificados van dentro del Software. El punto débil inicial de la tecnología de clave pública es obtener de forma segura los certificados de la autoridad. El punto crítico es confiar en el certificado de autoridad. Conseguir el certificado depende de nosotros. ¿ Cómo pedir un certificado a la autoridad certificadora ? Lo primero es establecer nuestros datos personales. Despues, decidirse por una tecnología de clave pública. Se trata, a continuación, de generar un par de llaves. El par de llaves lo puede generar la propia persona u otra persona ( sea autoridad o no) La ley certificadora española dice: " El usuario ha de tener el derecho de establecer su clave privada " La autoridad firma la clave pública, no tiene porqué saber la clave privada. La clave privada la tendrá el usuario. La autoridad certificadora sabrá, si está firmado, que la clave pública que está dentro la ha firmado el poseedor de esa clave. La clave pública va en el certificado. La firma se añade. En el certificado va el DN, despues P (clave pública) y luego se añade Fk (firma). Se han de validar los datos que le da el DN. En la práctica, las autoridades certificadoras no son realmente una sola autoridad certificadora sino varias. CA (autoridad certificadora) puede constar de CA1, CA2, CA3, CA4, CA5. Si uno no se fía de alguna de ellas, por ejemplo de la CA3, se puede borrar esa CA3. El CPS (Certificate Practical Stablishment) es un documento legal que dice lo que la autoridad certifica. Las autoridades han de especificar la naturaleza de sus certificaciones. Por ejemplo CA1---Email Clase 1 CA2---CN Clase 2 El PKCS12 está pensado para meter una clave privada, y otras cosas, y todo eso se protege con una password. ¿ Si se pierde la clave privada por cambiar el Windows o por otros motivos ? Enviar una solicitud de invalidar el certificado. Para ver si está rebocado el certificado: El X509 tiene el CRL Este objeto es una lista de números de serie, el DN de la autoridad certificadora y todo ello firmado por la autoridad certificadora. Existen unos protocolos para la consulta on-line de la rebocación. Te conectas on-line con la autoridad y se puede preguntar si está rebocado. El no repudio es una clase de autenticidad y consiste en evitar que la persona no niegue que es el autor de lo que ha hecho. La forma de conseguir el no repudio es el compromiso legal. Otro problema es el tiempo: en qué momento se envío un email, por ejemplo. Para ello se tiene una Autoridad de Tiempos, que se encarga del sellado de tiempos. El sellado de tiempos consiste en que el organismo sella el tiempo. Este organismo actua como notario de tiempos. * DER, BER, PEM, ASN1 A continuación se verán estos conceptos. El ISO establece una seride de reglas: las reglas de codificación binaria. DER: Reglas de codificación binaria distinguida. Es una parte de las reglas de codificación binaria. Cada lenguaje tiene su forma de guardar los datos. Hay una serie de opciones para codificar cada uno de los tipos. Tambien hay opciones de como juntarlas (struct) Cada fabricante tendrá una forma de codificar. El ISO establece una regla de codificación que puede seguirse o no seguirse. Si queremos guardar la codificación binaria, el ISO nos da una forma. Esa forma son las reglas de codificación binaria (BER) El DER es el que más se utiliza; es un subconjunto del BER. El DER se usa habitualmente en criptografía. Se trata de un formato que no es agradable a la vista. Para hacerlo más agradable a la vista se usan unos expansores. Los expansores más usados son: uuencode y base64. El base64 es una transformación de ascii a un subconjunto del ascii. ASCII-----------> subconj(ASCII) El base64 es más agradable a la vista. Se tiene que expandir: Por ejemplo 3 caracteres de entrada a 4 caracteres de salida. Ésto es usado en los programas de correo (mimencode) Como cualquier información viene en ASCII, a cualquier información se le puede aplicar el base64 En el mail: Se convierte el binario a base64 (se trata de una codificación, no de un cifrado). El base64 se transporta por mail fácilmente. El Formato PEM (Private Enhanced Mail) es un formato usado en el correo, aunque se use para otras cosas. Se pasa de binario a base64. A ésto (base64) se le añade una linea al inicio y al final. .........BEGIN loquesea......... base64 .........END loquesea........... El DER no es agradable a la vista y el PEM sí lo es. El PEM ocupa un 30% más que el DER. El PKCS12 se usa en formato DER. El formato PEM cumple: Toda la información que hay antes del BEGIN y toda la información que hay detrás del END, es ignorada por los programas que lo utilizan. El PEM es un base64 con BEGIN y END. El ASN1 es un lenguaje que utiliza ISO para definir las estructuras de datos. El formato de los PKCS10 tiene una definición en ASN1. El openssl tiene una opción que se llama ASN1. * PGP y SMIME Primero una pequeña introducción al mail. El mail es una forma de enviar correo. Se tienen unos buzones. Se pueden tener varias direcciones que nos lleven a un mismo buzón. Carece de conexión. Está hecho sin sesión. Hay conexión pero no se vé. Se envía y la otra parte tarda un tiempo en recibir el mensaje. El mail se inventa para mandar mensajes tipo texto. El uuencode permite coger un fichero binario y pasarlo a texto. El MIME es una definición de como poder enviar en un único mail diversos objetos de distintas características. Cada objeto se convierte, se codifica y se le añade una cabecera donde se indica el contenido. SMIME es un MIME con firma y criptografía. Cuando queremos enviar un mail firmado, hemos de recurrir a PGP y SMIME El correo funciona de una forma muy similar al correo postal. Cualquier mail tiene un formato: CABECERA CUERPO Cabecera y cuerpo se separan por una linea en blanco y la cabecera no puede llevar líneas en blanco. Para obtener más información, tenemos el RFC822. Un mail se considera que es MIME cuando tiene en la cabecera MIMEVersion: 1.0 Después viene un campo Content-Type El objetivo del MIME es que se puedan mandar mensajes de todo tipo. La condición es que los caracteres sean de 7 bits. Los caracteres visibles son del 32 al 126 de ASCII Existe la posibilidad de enviar del 128 en adelante (habremos de decir que enviamos caracteres de 8 bits). No se pueden enviar por mail caracteres menores que el 32. Para mandar caracteres menores que el 32 hay que recodificar. Se definen los tipos MIME tipo/subtipo Cuando un subtipo está introducido pero aún no ha sido aceptado se pone tipo/subtipox Si se trata de texto se pone text/plain El campo Content-Type es obligatorio. Un campo imprescindible es el Content-transfer-encoding. Nos indica como ha sido codificada la información para el transporte. Se pone Content-transfer-encoding y a continuación 7 bit o 8 bit o base64 o quoted-printable, según como haya sido codificada la información para el transporte. Hasta aquí, el MIME más simple. Campo:valor; otracosa=algo; MIMEVersion: 1.0 Content-Type: tipo/subtipo Content-transfer-encoding: 7 bit 8 bit base64 quoted-printable Ejemplo: Content-Type: application/x-shockware-flash2 -preview; name="0-bibbired.swf" Content-transfer-encoding: base64 - Attachement o Adjunto: multipart / signed mixed related alternative El related y alternative no los veremos en esta asignatura. El multipart/signed se usa en mails firmados. El multipart / mixed es una forma de indicar que el mail se compone de una colección de entidades MIME. Después de MIMEVersion: 1.0 se debe poner Content-Type: multipart/mixed; boundary=churro El boundary ha de ser algo único. Se pone lo que se quiera donde pone churro y éste es el delimitador que voy a usar. A continuación, van las partes MIME. Las partes MIME se componen del boundary puesto, colocando antes -- xxxxx --churro Lo que se ponga en xxxxx no se debe de poder leer en nuestro mailer, el mailer solo debe dejar ver la parte MIME. Se podría poner cualquier frase, por ejemplo: "Si estas viendo ésto, es porque tu mailer no funciona correctamente". Después se añaden unos campos. Un ejemplo sería MIMEVersion: 1.0 Content-Type: multipart/mixed; boundary=churro xxxxx --churro Content-Type: text/plain ) Hola --churro Content-type: image/png Content-transfer-encoding: base64 ) aqui va la imagen --churro Ésto genera la posibilidad de recursión. Dentro de cada multipart/mixed pueden haber varios multipart/mixed. En el mail cifrado no hay multipart. Un ejemplo de mail cifrado es el siguiente: xxxxx MIMEVersion: 1.0 Content-type: application/x-pkcs7-mime Content-transfer-encoding: base64 zzzzzzzzzzzzzzzzzzz zzzzzzzzz es el mensaje El mail firmado es más complejo. Debe cumplir la siguiente regla: El lector tiene que poder leer el mail aunque no pueda comprobar la firma. Por lo menos se podrá leer el mail. La idea es poder leer el mail aunque no se pueda comprobar la firma. El mail tendrá dos partes, el mail y la firma. Con el elm no se puede comprobar la firma. Con el netscape o outlook sí se puede comprobar la firma. Ejemplo de mail firmado: MIMEVersion: 1.0 Content-Type: multipart/signed; protocol= "application/x-PKCS7-signature"; micalg=sha1;boundary="tarariquetevi" --tarariquetevi (1) --tarariquetevi Content-Type: application/x-PKCS7-signature Content-transfer-encoding: base64 aqui va la firma del mail --tarariquetevi- En (1) se debe colocar, si queremos enviar saludo+foto, lo siguiente: Content-type: multipart/mixed; boundary="caracol" ) --caracol Content-type: text/html ) Hola --caracol Content-type: image/gif Content-transfer-encoding: base64 ) aqui va la foto --caracol Lo de (1) se pone dentro del mensaje firmado. El PKCS7 permite transportar datos y certificados Además de datos, está previsto que incluya datos. Los datos del PKCS7 pueden ser: data signeddata---------------> firmado envelopeddata------------> cifrado signedandenvelopeddata---> firmado y cifrado Ésto va dentro del PKCS7. Se puede enviar: - un objeto signeddata - una copia del certificado con el que se ha hecho la firma (es costumbre enviar la copia del certificado) El signedandenvelopeddata normalmente no se usa. Ésto es debido a que si se cifra y despues se firma, nos verán la firma. Con data se ponen los datos en PKCS7 y se envían. Con signeddata se calcula la firma, se crea un objeto PKCS7, se añaden al PKCS7 el resumen y se firma el PKCS7. Con esto se consiguen datos que se pueden ver y que están firmados. En mail se puede enviar cifrado o firmado. Si el mail es firmado se envía por un lado el certificado y por otro la firma. Es un signeddata (datos+firma) Para enviar mail firmado y cifrado a la vez: Se firma y luego se usa envelopeddata, con lo cual se cifra. El outlook, debe tener: DES,RC2,RC4,RC5,RSA y estos algoritmos deben tener: el analizador y constructor de PKCS7 el analizador y constructor de PKCS12 un pequeño programa que construya los mail Antes vimos como mandar un mensaje firmado o cifrado Mensaje firmado: Se envia m (mensaje original), seguido de c (mensaje cifrado), seguido de F (firma). En la práctica, c y F se pueden meter en un PKCS7 con signeddata Mensaje cifrado: Se envia Es(m), seguido de EpB(s). En la práctica se mete en un PKCS7 Tambien se puede enviar Es(m), seguido de EpB(s) junto con el identificador de PB, seguido de EpC(s) junto con el identificador de PC. El identificador debe contener el número de serie y el issuer (DN autoridad). El que lo recibe lo recibe en formato PKCS7.