Etiqueta: criptografía

Microsoft CryptoAPI (CAPI) desde Java 6

03 sep 2007

Revisando el changlog de Java 6, me he encontrado con una grata sorpresa.

Hasta ahora para acceder a los servicios de criptografía que ofrece Windows( y sus drivers instalado) era necesario recurrir al uso de JNI y programar las rutinas necesarias en C++.
Hace un año realizamos esa implementación pero resulto ser demasiado inestable, por lo que quedo en el olvido.
Ahora veo que en la lista de features que trae Java 6, tenemos:

6318171: Enable access to Microsoft CryptoAPI (CAPI) keystores and cryptographic operations
Por lo que se simplifica drásticamente el desarrollo de este tipo de soluciones. Ejemplo extraído de la documentación oficial de Java 6:

	KeyStore ks = KeyStore.getInstance("Windows-MY");
        // Note: When a security manager is installed,
        // the following call requires SecurityPermission
        // "authProvider.SunMSCAPI".
        ks.load(null, null);

        byte[] data = ...
        String alias = "myRSA";

        PrivateKey privKey = (PrivateKey) ks.getKey(alias, null);
        Certificate cert = ks.getCertificate(alias);

        Provider p = ks.getProvider();
        Signature sig = Signature.getInstance("SHA1withRSA", p);
        sig.initSign(privKey);
        sig.update(data);
        byte[] signature = sig.sign();
        System.out.println("tGenerated signature...");
        sig.initVerify(cert);
        sig.update(data);
        if (sig.verify(signature)) {
           System.out.println("tSignature verified!");
        }

Colaborando con la comunidad. OpenOCES

22 abr 2007

Después de bastante tiempo utilizando el componente de firma OpenOces, me he decidido a colaborar con el proyecto, e implementar algunas mejoras.

Hasta ahora, al no disponer de las MS-CriptoApis en Linux, no era posible acceder a un almacén de certificados centralizado, haciendo necesario utilizar directamente los ficheros PKCs12. Gracias a este plugin es posible en Linux/Mac/WinXP acceder al almacén de certificados de Java desde el Applet, facilitando mucho las cosas al usuario final.

El parche fue enviado a la lista de desarrolladores de OpenOces y probablemente sea añadido en la versión 1.6 o 1.7 del proyecto OpenOces.

Para los impacientes, Parche v2 JavaControlPanel para el sistema OpenOces 1.5

Update:  El parche ya ha sido añadido, y esta disponible en la versión 1.7, os dejo el recorte de la noticia:

2007-05-09

OpenSign v1.7.0 has been released.

This release fixes a bug causing certificates accessed through Microsoft CryptoAPI to be unavailable when the applet is executed in protected mode on Windows Vista. The release also features a new keystore type contributed by Felix Garcia Borrego. :p

Tips: Xml Signature

04 abr 2007

¿Que es?

Es una especificación desarrollada bajo el amparo del w3c (http://www.w3.org/Signature/) que permite la firma( completa o parcial) de documentos utilizando una notación XML estandar. XML Signatures ofrece algunas ventajas frente a la firma tradicional ya que al estar basada en texto plano su estructura es legible por humanos.

Los documentos Xml Signature los podemos clasificar en tres tipos, dependiendo de la asociación con el documento firmado:

  • Enveloped: En el que el documento a firmar y la firma quedan ligados en un único xml. Este es el método mas recomendable para firmar documentos de texto o Xmls.
  • Enveloping: En el que el documento firmado(Debe ser un Xml), adjunta como un nodo mas el elemento Signature.
  • Detached: En el que el documento firmado se mantiene separado de la firma, manteniendo el XMLSignature una referencia al documento.

Un Ejemplito
Ejemplo de fichero XML Signature

Aunque parece un XML con un formato muy complejo, es sencillo de entender, su esquema de definición es :

<element name=“Signature” type=“ds:SignatureType” />
<
complexType name=“SignatureType”>
<
sequence>
<
element ref=“ds:SignedInfo” />
<element ref=“ds:SignatureValue” />
<
element ref=“ds:KeyInfo” minOccurs=“0″ />
<
element ref=“ds:Object” minOccurs=“0″ maxOccurs=“unbounded”/>
</sequence>
<attribute name=“Id” type=“ID” use=“optional” />
</
complexType>

Y buscando en el XML de ejemplo las estructuras definidas en el esquema, podemos ver que SignedInfo contiene la información relacionada con la firma( algoritmo utilizado, etc), en SignatureValue el resultado de la firma( en Base64), en KeyInfo los datos del certificado del firmante, y en Object los datos que se firmaron.

¿Apis para manejar XML Signatures?

En nuestro caso, estamos utilizando la implementación de Apache de XML Security , junto con Bouncy Castle.

XML Singature es un formato que ha llegado para quedarse entre nosotros, espero que esto sirva de una pequeña introducción para que deje de ser un desconocido o simplemente una palabreja, para convertirse en algo palpable y sencillo.

Qubits y criptografia quantica simplificada

14 ene 2007

He estado revisando lo que uno se puede encontrar en internet sobre qubits, y mas concretamente sobre criptografia quantica, y me he encontrado con que toda la informacion es o bien muy compleja, con complicadas formulas matematicas o bien se hace mencion a� dificiles y relativamente desconocidos, por la mayoria, conceptos de mecanica quantica.

Creo que se pueden hacer ciertas abstracciones y explicar algunos conceptos sin tener que enfangarse en los datos y conceptos complicados en los que se pierden algunos (no se si para demostrar lo que saben, o para ocultar lo que ignoran).

Concretamente, echando mano de algunas simplificaciones, e intentando no perderme en complejas parabolas, como gatos que estan vivos y muertos a la vez, voy a intentar explicar o introducir a lo que se conoce como criptografica quantica para transmisiones. Realmente solo� expondre una de sus aplicaciones lo mas *simplificadamente* posible.

Pongamonos en la situacion en la que un sistema A le quiere pasar una informacion al sistema B. Para que la comunicacion se produzca necesitamos, usualmente,� una fase de setup en la que A y B se pongan de acuerdo en le protocolo. Esto es, A informa a B de que le va a comunicar, y del significado exacto que va a tener cada secuencia de bits.

Matematicamente los bits son muy faciles de manipular, se ajustan al algebra de Bool, cuyas reglas son bien simples y conocidas por todos (supongo).

Adaptar el caracter binario de los bits a dispositivos fisicos para su almacenamiento o transporte es tambien relativamente sencillo, basta con tener algun dispositivo fisico que tenga dos posibles estados, uno de ellos sera el 0 y el otro sera el 1. El bit se guarda poniendo el dispositivo en un estado u otro, y si el dispositivo se desplaza se produce comunicacion y si persiste en su estado en el tiempo entonces tenemos almacenamiento.

Clasicamente se usan cantidades masivas de electrones para representar un bit en un semiconductor, o de fotones en comicaciones por onda. Asi, en un semiconductor, por ejemplo, un voltaje entre 0v y 1v equivaldrian a un ‘0′ y un voltaje entre 4v y 5v, equivaldrian a un ‘1′ logico.

Pero por que usar cantidades masivas de electrones y fotones para reprensentar una unica unidad de informacion? Por que no hacer que un unico electron almacene, represente, el ‘1′ logico, o que un foton, por ejemplo, transporte una unidad de informacion, un bit? Un hombre, un platano, y un foton, un bit. O mejor dicho un qubit o bit quantico.

Tranquis, no hace falta saber que es el principio de incertidumbre para entender esto… peroooo…. tengo que decir que la mecanica clasica nos permite abstraernos de ese principio de incertidumbre porque usamos cantidades ingentes de particulas y asi la incertidumbre sobre su estado tiende a cero. Pero a medida que disminuimos la cantidad de fotones para representar cada unidad de informacion, las simplificaciones de la mecanica clasica dejan de ser validas, y la incertidumbre se maximiza; empezamos a pisar los terrenos de la mecanica quantica, terrenos que no siempre resultan faciles de entender, y casi nunca son intuitivos.

Por eso ya no podemos hablar de bits, si no de qubits. Un qubit es un objeto que puede guardar un bit pero que es tan pequeño que se ve sometido a las leyes de la mecanica quantica. En realidad un qubit puede hacer y almacenar muchas mas cosas, pero no nos interesan aqui.

Una diferencia clave para el tema que nos ocupa es que un bit clasico puede medirse sin ser alterado, y por tanto se puede copiar, no es ese el caso de los qubits. No podemos medir un qubit! Como suena, si intentamos saber si su valor es 1 o 0, medirlo, habremos modificado su estado, y perdido la informacion para siempre antes de poder recuperarla. Vaya puto desastre, guardar informacion que no se puede luego recuperar…no tiene sentido…

Ah, pero los fisicos son chicos muy listos, y tienen la solucion! A un qubit no lo podemos medir pero si que le podemos preguntar “vales 1?” y nos dira SI o NO. Ojo, esas son las unicas respuestas que obtendremos. No, nos respondera nunca, “casi”, o “70% cierto”, o “falso por 35º”…. no, unicamente nos dira SI o NO. Esto es importante, para la transmision segura, pero luego veremos por que. Otra diferencia clave es que, solo podemos preguntar una unica vez por su estado,� porque intentar averiguar el estado quantico de una particula subatomica modifica irrevarsiblemente su estado…. podemos preguntarle, nos respondera, pero al responder, su estado se pierde, y para siempre. No hay una segunda oportunidad. Solo una pregunta.

Ahora, pongamos que en una transmision de informacion, usamos un foton, el foton resulta un perfecto vehiculo para nuestro proposito porque es pequeño, y viaja rapido… digamos que mas rapido imposible. Los fotones (casi todos los tipos) tienen un campo electrico y un campo magnetico oscilando simultaneamente. Si lanzamos a nuestro amigo foton en una direccion Z, su campo electrico podra ir en la direccion X (horizontal), en la direccion Y (vertical), o, en cualquier direccion del plano XY (horizontal-vertical). Graficamente seria una canica rodando hacia delante, con su lo-que-sea (campo electrico) en vertical, u horizontal, o haciendo algun angulo diagonal con el suelo.

Y alli llegamos nosotros ‘B’ (en nuestro ejemplo inicial de una transmision) y nos ponemos en la horizontal y preguntamos “oh campo electrico… estas aqui?” (o sea “vales 1?”), y la canica (el foton) nos dice que SI o que NO, cambia la direccion del campo electrico y sigue su camino… Si nosotros sabemos (setup de la transmision) que A nos va a tirar las canicas con sus campos electricos en horizontal o vertical, y nos informa de que la horizontal significa ‘1′ y la vertical ‘0′, tendremos informacion transmitida a altisimas velocidades, usando tan solo un foton para cada bit. Fabuloso!

Pero y si C, un tipo malo, quiere “escuchar” nuestra transmision? Entonces, no solo podria si no que la destruiria al hacerlo. Pongamos que C, se coloca en el la direcion Z entre A y B, y en el plano horizontal, pregunta a cada canica-foton que pasa por ahi: “oye, campo electrico, estas aqui?” o, “foton, vales 1?”, entonces C conseguiria la informacion y al hacerlo la alteraria de modo que B, ya nunca recibiria la informacion. Es esta la tan cacareada eficacia criptografica de los qubits? Menuda decepcion.

Vale, rebobinamos un poco, cuando C empieza a “escuchar” la transmision, B no tarda en darse cuenta de ello al percibir que ninguno de los fotones que pasa le responde SI a la pregunta “vales 1?”. Basicamente porque C, al alterar la informacion hace que el campo electrico del foton se ponga en cualquier direccion del plano XY, y las probabilidades de que el campo alterado se ponga exactamente en la direccion X (horizontal), en el que B esta preguntando,� son realmente minimas. Asi rapidamente B notaria que de golpe todos los fotones le responden NO, y el espionaje seria descubierto casi al momento. Suena mejor ahora, no?

Pero aun hay mas. En cuanto B se diese cuenta del espionaje, podria avisar a A, y este, por ejemplo, rotar el angulo del campo electrico 15 grados, o incluso tan solo un grado, y C ya no podria seguir “escuchando”… Por que estara preguntando “vales 1?” en la direccion incorrecta del plano XY… ya hemos dicho que la respuesta solo es SI o NO, nunca un “uuuuyyy, casiii, por un grado”… Asi que C solo obtendria NO como respuesta. Su escucha seria inutil.
Ademas, nuevamente su intento de escucha sera detectado por� B. Si la comuncacion es bidireccional, al recibirse unicamente ceros (NOes) en uno de los sentidos, la comunicacion se interrumpe en ambos sentidos, es decir, en cuanto el canal no es seguro la transmision cesa. Cualquier intento de espionaje bloquea automaticamente la transmision.

Si lo pensais es una pena, Jack Bauer ya no� tendria que decir� nuestra frase favorita:
-”Is it a secure line, isn’t it?!”

Disclaimer: La criptografia es un area en la que Viavansi es fuerte, pero sus aspectos quanticos no son area de negocio, aun :)