[Perl] off topic: firma electronica
Gunnar Wolf
gwolf en gwolf.org
Mar Oct 4 12:12:56 CDT 2005
Tei dijo [Fri, Sep 30, 2005 at 11:24:58AM +0200]:
> pero firmas electronicas hay muchas, desde el antiquisimo CRC al MD5
> SHA-1 y otros. La idea es calcular un numero a partir de un documento, y
> que este numero tengo el valor mas alto de entropia posible, de modo que
> un pequeño cambio en el documento produzca un gran cambio en la firma
> (si la recalculas).
Agrego un punto importante: Además del documento, es importante que
vaya algo que "firme" que el documento viene realmente de tí - la
característica de no repudiabilidad (esto es, que no puedas decir que
no fuiste tú quien firmó) es inidispensable para cualquier firma
electrónica.
> hoy en dia se estan dando ataques con exito a varios de estos
> algoritmos, en particular MD5, y hay demostracioens de que se puede
> fabricar dos documentos completamente distintos (a proposito) pero que
> sin embargo tienen la misma firma.
De nuevo, pequeñas precisiones: Hay ya ataques publicados tanto a MD5
como a SHA1, que te permiten encontrar pequeños pedacitos que admitan
un cambio en el documento generando la misma firma - Ahora, esto era
sabido desde un principio, dado que todo algoritmo que comprime un
documento a 128 bits de información _seguramente_ termina teniendo
colisiones, por el puro tamaño del documento. Lo que fue sorprendente
y triste es que lograron generar documentos bastante similares. No es
posible -por el momento- tomar dos documentos arbitrarios y agregarle
ruido a uno para que tenga el mismo MD5 que el otro. Y, por si esto
fuera poco, si para tu firma usas tanto MD5 como SHA1, la complejidad
para encontrar un documento para el que la firma coincida computada
con AMBOS algoritmos no es comparable con encontrar uno en 256 bits
(128 de cada uno de los algoritmos), sino muy superior (aunque, bueno,
obviamente tampoco de 128*128).
> esto abriria la puerta a que te presentaran una factura, la "rompieran",
> y luego te presentaran otra con un total mucho mas grande que sin
> embargo resultara en la misma firma. Tratandote de engañar.
>
> si hay alguna iniciativa a nivel nacional en mexico de utilizar la firma
> digital para facturas, me imagino que habran elegido un algoritmo muy
> fuerte, que hoy en dia no se pueda romper, o que para romperlo haga
> falta mucha potencia de calculo.. que hoy en dia solo esta en manos de
> unos pocos estudiantes y aficionados a la informatica
Pues... Me parece [1] que es un algoritmo de llave pública,
probablemente basado en RSA, y supongo que similar al que aplicas
cuando usas PGP/GPG, SSL, TLS, S/MIME y varias otras. De hecho, le
seguí preguntando a mi amigo Google, y me encuentro con lo siguiente
[2]:
Los algoritmos utilizados en la generación de un sello digital son
los siguientes:
MD51, que es una función hash (digestión, picadillo o resumen) de un
solo sentido tal que para cualquier entrada produce una salida
compleja de 16 bytes denominada "digestión".
RSAPrivateEncrypt2, que utiliza la clave privada del emisor para
encriptar la digestión del mensaje.
RSAPublicDecrypt3, que utiliza la clave pública del emisor para
desencriptar la digestión del mensaje.
O sea que no andábamos tan errados ;-)
> en principio cualquier lenguaje de programacion es apto para esta clase
> de tareas, sin embargo imagino recomendable utilizar uno que haga un
> tratamiento muy serio del formato de las cadenas (utf-8, latin, etc..) o
> bien tenga buenas librerias para cargar ficheros XML (porque imagino que
> este sera el formato de los ficheros)
No, casi todas las implementaciones de criptografía (aunque son
accesibles desde cualquier lenguaje, p.ej. los módulos Crypt::* en
Perl) son hechas en C. Tratas a la cadena como un stream de bytes, que
no son más que números, y trabajas sobre de ellos.
Olvídate, claro, del XML también - Eso es parte del contenido, y es
irrelevante para el cifrado.
Saludos,
[1] http://www.sat.gob.mx/sitio_internet/e_sat/tu_firma/60_3531.html#3
[2] http://www.sat.gob.mx/sitio_internet/e_sat/comprobantes_fiscales/15_6600.html
--
Gunnar Wolf - gwolf en gwolf.org - (+52-55)1451-2244 / 5623-0154
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF
Más información sobre la lista de distribución Perl