Foros:
Por Agustín
Todos tenemos una idea de cómo funciona el cifrado asimétrico RSA, que se basa en unos números primos muy largos para generar una clave pública, con la que cualquiera puede cifrar un documento dirigido a ti, y una clave privada, con la que sólo tú puedes descifrarlo. Pero a mí siempre se me ha resistido la comprensión última, las tuercas y tornillos del algoritmo, sobre todo porque mi conocimiento de la Teoría de los Números deja mucho que desear. Por eso he decidido hacer un auto-cursillo sobre este tema, con la esperanza de haber captado, si no los fundamentos profundos, al menos la mecánica detallada del procedimiento. También espero que ese estudio le sirva a alguien que vaya igual de despistado en este asunto. A los que estáis más puestos en esta materia os ruego benevolencia, incluso alguna colaboración o, si os aburre, que miréis para otro lado.
Me ha servido bastante la explicación que he encontrado en Clay Mathematics Institute, pero cualquiera de las que hay por ahí serviría igualmente, si se mira con atención.
Para facilitar la comprensión he confeccionado una versión de juguete, que usa números primos pequeños, con lo que no se consigue fortaleza alguna, pero quizá se vea más claro el intríngulis.

Para empezar, se codifican los caracteres del mensaje en claro mediante una tabla como ésta:
* 0 1 2 3 4 5 6 7 8 9
0 XX XX XX XX XX XX XX XX XX XX
1 SP A B C D E F G H I
2 J K L M N O P Q R S
3 T U V W X Y Z a b c
4 d e f g h i j k l m
5 n o p q r s t u v w
6 x y z . , : ; ' " `
7 ! @ # $ % ^ & * - +
8 ( ) [ ] { } ? / < >
9 0 1 2 3 4 5 6 7 8 9en la que cada carácter se representa por el par de números de su fila y su columna. Por ejemplo, la palabra KRIPTOPOLIS se codificaría por el número
K R I P T O P O L I S = 21 28 19 26 30 25 26 25 22 19 29 KRIPTOPOLIS = 2128192630252625221929
Supongo que también podría usarse una tabla en la que tengan cabida los acentos y la Ñ, aprovechando los caracteres no utilizados, pero esto ahora no nos preocupa.
El siguiente paso es generar dos números primos p y q, tan grandes como sea posible, aunque en nuestra versión de juguete nos limitaremos a dos primos diminutos:
p = 439 q = 449 N = p*q = 197111
Después se fabrica número m a partir de los primos:
m = (p – 1) * (q – 1) = 196244
cuya utilidad se verá luego.
Este número se descompone en sus factores primos
m = 196244 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 7 * 73
Ahora necesitamos un número e que no tenga ningún factor común con m, es decir, que sea primo con respecto a él. En esto hay que tener cierto arte, porque luego tendremos que calcular otro número que va a depender de éste. Pongamos que construimos un número de esta forma:
e = 5 * 11 * 19 = 1045
Llegamos a la parte final de esta tarea, y es obtener otro núnero d que, junto con e, cumpla esta curiosa propiedad:
e * d - 1 = múltiplo de m es decir: e * d – 1 = m * y e * d = m * y + 1 d = (m * y + 1)/e
Para calcular d hay que ir dando valores enteros a y desde 1 en adelante, hasta que el resultado sea entero, de aquí la importancia de elegir “bien” el número e anterior. Para esta operación puede servirnos una hoja de cálculo, como la que se ve en la figura. En nuestro caso, el primer valor entero de d aparece para y = 31
y = 31 d = 5821
Ya tenemos la tarea hecha, salvo el cifrado, claro. Ahora podemos presentar N y e como clave pública, con la que cualquiera podrá mandarnos un mensaje cifrado, mediante la operación
c = x^e modulo N
donde x es el mensaje convertido en un número por el procedimiento antes descrito
Por nuestra parte, con la clave privada -guardada a buen recaudo- que es básicamente el número d, sólo tenemos que descifrar mediante la operación
x = c^d modulo N
y ya está.
Para aplicar este algoritmo se necesita una herramienta que maneje enteros de longitud arbitrariamente larga, incluso para nuestra versión de juguete. Mediante Python, que no es demasiado eficiente, los cálculos son:
Imaginemos que nuestro mensaje es una sola letra, la K de KRIPTOPOLIS, cuyo código es el 21, según la tabla. La operación de cifrado será:
Cifrado c = 21^e modulo N c = 21^1045 modulo 197111 = 63202
Si tuviéramos un número par de dígitos se podría presentar como 63 20 etc, es decir .J (punto jota, etc)
Para descifrar sólo tenemos que calcular:
Descifrado x = c^d modulo N x =63202^5821 modulo 197111 = 21 = K
Ahora viene la pregunta fundamental: ¿Cómo es posible que la operación de descifrado deshaga lo que hace la de cifrado, siendo tan distintas? Y la respuesta es: Debido al Pequeño Teorema de Fermat: Si a no es divisible por p, siendo p primo, entonces a^(p-1) - 1 es divisible por p
Ahí queda eso. Si no veis la conexión entre ambas cosas, tened paciencia, y seguid estudiando, que mi trabajo ha terminado. Uf.
La fortaleza del sistema, como ya sabéis, radica en que la factorización de un número N grande requiere mucho tiempo de computación, pero algunos opinan que los avances en hardware y, sobre todo los cálculos con GPUs en paralelo, van a traer pronto la muerte de RSA. La gente malpensada cree que alguna Agencia ya lo ha conseguido, y se calla, la muy zorra.
Imágenes:

Error
En el recuadro donde dice:
debería decir:
Felicitaciones!
Arreglado el error, felicidades por la claridad de exposición y mil gracias por el artículo en nombre de sus futuros miles de lectores.
Didáctico
Muy didáctico. Los conceptos funcionales de la criptografía de clave pública están explicados en multitud de sitios, pero la aplicación concreta de la teoría matemática en que se apoya RSA en muy pocos. Creo, sin embargo y sin ánimo de desmerecer el esfuerzo, que hay alguna e bailada más en tu explicación (normal con tantos números danzando). Concretamente, donde dices
con la clave privada -guardada a buen recaudo- que es básicamente el número e,
Creo que debería decir
con la clave privada -guardada a buen recaudo- que es básicamente el número d,
Fixed!
Arreglado.
Muchas gracias.
Sí, es verdad
Ya he reportado alguno de esos errores. Es lo que tiene trabajar compulsivamente hasta altas horas de la madrugada. Por favor, admin, a ver si puedes corregir este par de errores.
Estudiar las matemáticas del RSA
Gracias, Agustín. Ahora mismo estoy con un folio en blanco delante y un lápiz siguiendo los pasos que nos sugieres para entender la mecánica matemática inherente al algoritmo de cifrado asimétrico RSA; es incluso más entretenido que hacer un crucigrama y, lo mejor, es que se puede ir haciendo cuantas veces se desee. Ya tengo la tabla, ahora seguiré con el resto un poco hoy y otro poco mañana... supongo que en unas cuantas semanas habré memorizado el proceso y podré hacerlo sin necesidad de consultar el artículo. Gracias una vez más, es un gran regalo el que nos haces.
Saludos cordiales,
Pedro Fernández
--
P.S. Por cierto, en el primer párrafo, donde dice «...,con la que cualquiera pu[e]de cifrar un documento...» parece faltar una letra que, una vez más, podría ser una 'e'... por si lo queréis corregir aunque en este caso no tiene mayor importancia, creo. Parece como si el gato se te hubiera comido la 'e', ¿eh? ;-)
Otro
Otro gazapo señalado... y abatido!
Gracias, Pedro, se te echaba en falta ;)
De lo mejor que he visto
Un trabajo excelente, claro y didáctico, mis felicitaciones.
"Copyleft Fernando Acero Martín. Verbatim copying, translation and distribution of this entire article is permitted in any digital medium, provided this notice is preserved. Quotation is allowed."
Muchas gracias por el trabajo
Muchas gracias por el trabajo, la verdad es que siempre me había quedado a la mitad de todas las explicaciones sobre este cifrado, y sólo tenía un conocimiento superficial, auqnue siempre me prometía que al día siguiente iba a buscar una explicación mejor para entederlo cabalmente de una puñetera vez. Mira por donde de lo dan a mantel puesto, vaya lujo.
Veo que las gafas del sr Torner permiten trabajar a Agustín hasta altas horas de la madrugada sin interferencias, están levantando la productividad de Kriptópolis...
Abrumado
Abrumado estoy por vuestra amabilidad. La única forma de que yo pudiera entenderlo era mediante un DIY. Me alegro de que os parezca interesante.
Por si alguien quiere manejar la hoja de cálculo, la tenéis en versión ODS y XLS
Perdona, Admin
Perdona por abusar de tu paciencia, pero hay otro errorcillo: El enlace a la página de Clay Mathematics Institute parece estar corompido. Es simplemente: http://www.claymath.org/posters/primes/rsa.php
El cálculo numérico
Como ya dije, se necesita una herramienta que maneje números enteros largos. A falta de otra cosa, basta invocar el intérprete de Python y escribir los comandos que aparecen en la figura, con su sintaxis característica, donde el operador "**" equivale a la potencia, y el "%" al módulo o resto
Imágenes:
Excelente trabajo
¡Ese figura!. Cómo se nota que no te ponen la tele en la clínica. Ah, y cómo se te nota también la deformación profesional: tanto tiempo tratando con marujas en la tienda de embutidos ha desarrollado en tí una habilidad especial para hacer comprensible lo incomprensible. Seguro que hasta ellas acabaron entendiendo los mapas.
Descargado el artículo y guardado a buen recaudo.
Perdona
Perdona, pero yo lo que vendía era lencería fina.
Gracias por tu atención.
Cálculo con números largos SOLUCIÓN
No sé si os percatais del todo de la trascendencia de lo que nos ha traído Agustín. Podemos hacer nuestras propias implementaciones de RSA, sin la necesidad de confiar en un software con posibles puertas traseras. Tampoco tendremos la necesidad de confiar en un código abierto pero que, por su longitud, jamás vamos a analizar y que nunca seremos capaces de asegurar al 100% que hace lo que tiene que hacer.
El único problemilla para la implementación real eran los cálculos con números extra-grandes, pues bien gracias a las funciones que vienen en este magnífico artículo, por las que hay que felicitar al autor, el problema queda resuelto.
Las cinco primeras funciones las añadí yo para adaptar el trabajo a Excel (o a Open Office)
La forma de utilizarlas desde Excel es muy sencilla, veáse algún ejemplo como el cálculo de potencias:
Imágenes:
Cuidado con las implementaciones personales de RSA
Para que la codificación RSA sea segura, los primos "p" y "q" elegidos deben cumplir ciertas condiciones. De lo contrario, puede romperse fácilmente el sistema, independientemente de lo grandes que sean "p" y "q". Ahora mismo sólo recuerdo dos de esas condiciones. Una es que "p" y "q" deben ser de tamaños en bits parecidos, pero deben tener una diferencia lo suficientemente grande como para impedir su descomposición prima con el método de factorización de Fermat. Otra creo recordar que "p-1" y "q-1" deben estar compuestos por primos grandes (no cuenta el 2, por supuesto), que si no se cumple, puede romperse el código también. Hay más condiciones, pero ahora no recuerdo, que si no se cumplen, facilitan el descifrado
Tienes razón.
Es totalmente cierto lo que dice el compañero, fácilmente si no se tiene cuidado con la elección de p y q se puede factórizar en un tiempo razonable N = p*q. Los invito a que miren este documentos http://crypto.stanford.edu/~dabo/abstracts/RSAattack-survey.html o para una información mas profunda pueden buscar en su biblioteca un libro llamado "Cryptanalytic Attacks on RSA" o "Cryptanalysis of RSA and its Variants".
Saludos.
Excelente trabajo
Tanto el de Aladár Péter Sántha como el tuyo, con tu implementación para las hojas de cálculo.
Atendiendo a las fundamentadas advertencias de Sqrmatrix, quizá no fuera prudente utilizar un RSA casero como programa "profesional", a menos que un equipo de sabios -entre los que sin duda estaría él- se encargue de confeccionarlo con todas las garantías. Lo que sí sería factible es alguna implementación para uso doméstico, como retos, etc, con lo que todos acabaríamos aprendiendo algo más.
De todas maneras, mi objetivo era mucho más modesto, ya que sólo pretendía entender la base del sistema. Y aún me quedan cosas pendientes, Por ejemplo, no tengo clara la relación entre la longitud del texto a cifrar y el tamaño que deben tener los números primos. También veo alguna dificultad en la conversión del número cifrado a texto cifrado, si no se obtiene un número par de dígitos, y no sé de que depende esta circunstancia. Pero son cosas que de momento no me preocupan.
Gracias por tu interés y por tu aportación.
P.S:
¿Podrías poner un enlace a tu hoja de cálculo?
Respuesta.
No se si sea el indicado para responder, pero intentare.
La longitud de los números primos p y q depende mas de que no sea fácil encontrarlos teniendo N = p*q, como sabemos la criba general de campo numérico es el algoritmo de factorización mas "rápido" para números menores a 400 bits de longitud. Obviamente p y q deben cumplir ciertas relaciones.
La longitud del texto a cifrar, si mas no recuerdo dependía era del método de codificación usado, y por lo general cuando el texto sobrepasaba una longitud máxima, que depende de N, se prefería realizar el cifrado partiendo el texto en bloques y cifrando cada bloque.
La verdad no recuerdo si era así, de todos modos este puede ser un buen documento para leer: ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.pdf
Saludos.
Gracias por la información
El documento de RSAsecurity es muy interesante
Curiosidad curiosa
Cuando leía este comentario, aparte del interés de todo el artículo en sí, me llamó la atención un pequeño detalle del que envío captura convenientemente "anonimizada".
Admin, ¿dónde está alojado el servidor? porque o está en una zona que queda fuera del GMT+1 o aquí hay gato encerrado. ¿En qué clase de secreta conspiración os habéis metido? :-D
Imágenes:
Obviamente...
País predefinido: España
Zona horaria predefinida: Euopa/Madrid
Los usuarios pueden establecer su zona horaria.
------------------
La hora y fecha son correctas y exactas. Comprobado.
Interesante artículo
Está muy bien, sobre todo porque gente que no tiene muchos conocimientos podrá entender la base del sistema.
Sólo me gustaría añadir una cosa. El valor de "d" es la solución de la congruencia e*x=1(mod m), la cual se resuelve con el algoritmo inverso de Euclides (aplicado a la ecuación e*x+m*y=1), que es un método rápido y eficiente, por lo que no hay que ir buscando el valor uno a uno
Pues estaría bien poner en el
Pues estaría bien poner en el propio artículo la fórmula de calcular d, para no andar buscándola en los comentarios, y recopilar esas condiciones que han de cumplir p y q, para que las implementaciones realizadas sean buenas.
Sí, es verdad.
Alguien podría escribir otro artículo con un título como "Entender RSA de verdad", y recoger todos los aspectos que faltan.
Algoritmo de Euclides inverso
Aquí pongo el algoritmo inverso de Euclides tal y como lo tengo codificado en Java, aunque le he quitado los comentarios explicativos, que ocupan un montón y quizá pueden liar.
Lo que yo hago es resolver la ecuación diofántica a*x+m*y=mcd(a,m), de tal forma que sólo necesito especificar "a" y "m", y tengo asegurado que voy a encontrar la solución, porque en una ecuación diofántica del tipo a*x+b*y=c, es necesario y suficiente que mcd(a,b) divida a "c" para que tenga solución. Si luego quiero obtener la solución de la ecuación a*x+m*y=k, bastará multiplicar las soluciones encontradas antes por k/mcd(a,m) (por supuesto, "k" ha de ser divisible por mcd(a,m)).
Por otro lado, teniendo en cuenta que la congruencia a*x=b(mod m), por definición de congruencia, implica que "m" divida a a*x-b, lo que a su vez significa que existirá un "y" tal que a*x-b=m*y, desarrollando obtenemos la ecuación diofántica a*x+m*(-y)=b, que puede resolverse por el método que se va a exponer a continuación. Por cierto, la solución obtenida es solución módulo "m", es decir, que existen infinitas soluciones, pero nos basta una de ellas (normalmente la que se calcula haciendo módulo "m") para tenerlas todas definidas.
Hay que tener en cuenta que este método sólo nos consigue una solución módulo "m". Si la congruencia tiene más soluciones, hay que hacer otras operaciones para obtenerlas todas ellas.
El método que tengo para números arbitrariamente grandes es:
El método que tengo para enteros de tipo "long" (64 bits si no me equivoco) es:
Bueno, espero que se entienda. Si no, ya sabéis, preguntad
No es que lo haya entendido...
...todavía, pero considero que el rigor de tus razonamientos es imprescindible en esta página. Lo que no dejo de pensar, desde mi punto de vista, algo simplón, es que la solución de la ecuación diofántica, buscando los menores enteros, por una simple iteración, tampoco me parece una mala solución. De hecho, para un planteamiento (auto)didáctico me parece más accesible que el algoritmo de Eucilides inverso. Pero que conste que reconozco la superioridad de tu planteamiento.
Gracias por tu aportación.
A mi lo que me intriga del
A mi lo que me intriga del algoritmo RSA es precisamente la eleccion de p y q. ¿Como se buscan? ¿Como se que un numero p muy grande es primo? ¿Hay acaso un "mercado" de numeros primos? O hay maneras de construirlos.
Los sistemas de comunicación basados en RSA, siempre tienen la misma clave publica o van actualizandola. Por ejemplo, cuando nos conectamos a una pagina https es mediante RSA no? Y en ese caso, el servidor web siempre usa la misma clave publica para todas las conexiones? De donde ha sacado el administrador los Ps i Qs correspondientes.
Por otra parte, me sumo a las felicitaciones a Agustin por su articulo y a las contribuciones de los demás en forma de comentarios.
Interesante cuestión
Hay gigantescas bases de datos con gigantescos números primos descritos mediante su fórmula generatriz, pero la cuestión de cómo se eligen es complicada, según nos contaba sqrmatrix. Espero que alguien como él amplíe el tema. Gracias por tu post.
Respecto al https
Básicamente la idea es que cuando haces una petición https a un servidor éste te un certificado X.509 entre cuyos campos se encuentra su clave pública. Ésta ha de ser fija puesto que ese certificado debería haber sido emitido por una autoridad de confianza para el sitio quien a su vez lo ha firmado con su clave privada para permitir su verificación.
Ahora bien, RSA, como es muy costoso en cálculo, sólo se usará para asegurar la comunicación posterior. Así cuando un cliente recibe el certificado del servidor lo usa sólo para cifrar una clave simétrica que envía al servidor (quien la descifra con la privada) que será la que efectivamente se usará en el resto de las comunicaciones.
De tu explicación entiendo
De tu explicación entiendo que si yo quiero implementar un servidor web que soporte https, tengo que ir a una entidad certificadora a que me emita un certificado para mi clave publica. Pero entonces la pregunta es: ¿De donde saco los p y q para generar mi clave publica? Si la respuesta es que me lo proporciona la entidad certificadora, entonces ¿De donde los saca ella?
No lo he hecho nunca, pero tengo entendido (y corregidme si me equivoco) que me puedo instalar un apache em mi ordenador de casa con los modulos correspondientes para poder hacer conexiones https y pasar de entidades certificadoras no? El unico "inconveniente" es que al cliente que se conecte el navegador le avisará que como hay entidad certificadora, no soy de "fiar" (con lo buena persona que soy). Es decir, mi flamante instalacion de Apache generará un par de claves publica/privada y por tanto necesitara los correspondientes p y q. De donde los saca?
Entiendo que hay por tanto algoritmos para generar numeros primos grandes no?
Haberlos haylos
Esta discusión me sonaba y he encontrado este hilo de hace unos años en que un forista presentaba un algoritmo de su invención que calcula primos “todo-lo-grandes-que-se-quiera”.
http://www.kriptopolis.org/algoritmo-para-calcular-numeros-primos-muy-gr...
Generar un número primo
Generar un número primo nuevo es todo un acontecimiento, aunque no tenga el record de longitud. Por otra parte, no hay algoritmos sencillos -ni creo que complejos- que garanticen al 100% que un numero es primo, sino que hay que pasarle luego muchas pruebas para conseguir establecer la primalidad. De manera que dudo mucho que se utilicen esos algorimos -aunque puedo estar equivocado-. Yo diría que se recurre al arsenal de primos ya establecidos. Pero como ya hemos comentado, esperamos que los que sepan más de esto nos lo amplíen.
Si no recuerdo mal
Si no recuerdo mal, el problema no está en generar números primos (que hay algoritmos conocidos. El más simple creo que venía siendo 2^n-1 con la particularidad de que n sea primo (números primos de Mersenne)) si no en la operación inversa, dado un número suficientemente grande saber si es primo o no (problema de la factorización). Los algoritmos de generación de números primos te dan algunos de los disponibles, pero no todos.
No es tan fácil
Todos los números de la forma 2^n - 1, siendo n primo, no son necesariamente primos. De hecho sólo se conocen 47 números primos de Mersenne, algunos de longitud monstruosa http://es.wikipedia.org/wiki/N%C3%BAmero_primo_de_Mersenne
EDITO
Por ejemplo:
Pues yo sigo pensando que
Pues yo sigo pensando que igual era buena idea que hiciésemos un RSA Open Source aquí, en Kriptópolis. Inicialmente seguro que tendría muchos problemillas, pero se podrían ir corrigiendo sobre la marcha con aportaciones de la concurrencia.
Vale, pero
Yo lo veo como un ejercicio, es decir, como una una manera de aprender, al menos para algunos, más que como la producción de un sofware profesional.
Antes que eso me gustaría entender los entresijos del ECC (Elliptic Curve Cipher), que también es interesante en el panorama del cifrado de clave pública.
Curso UPM
Buscando confirmar una información he dado con este curso sobre RSA de la UPM que me parece fantástico. No tiene desperdicio.
http://www.criptored.upm.es/crypt4you/temas/RSA/leccion0/leccion00.html
[Curso UPM] Completado desde ayer
Gracias, LlamameX, por haber dado con este curso de lujo y por compartirlo aquí, en Kriptópolis.
Este MOOC Crypt4you de la Universidad Politécnica de Madrid también a mí me parece fantástico y estoy de acuerdo en que no tiene desperdicio ;-)
Ayer mismo ha sido publicada la lección 10, que es la última lección y lo deja completado, aunque al final dice que los creadores siguen trabajando y han decidido dejar el apartado 10.3 pendiente hasta concluir y publicar un nuevo trabajo de documentación y detalle que están elaborando.
Sólo piden que, por favor, se ayude a mejorar estos cursos completando la encuesta:
http://www.criptored.upm.es/crypt4you/encuesta/index.php
Imágenes:
Sobre obtener números primos
No se utilizan tablas de números primos, porque de ser así, si un atacante accede a ellas, descifraría cualquier código con n=p*q, sabiendo que los números primos p y q están en esa tabla. Con una simple búsqueda puede encontrar uno de ellos rápidamente, sin importar lo grande que sea esa tabla (se tarda más en hacer esa tabla que en buscar primos en ella, con lo que si queremos que la búsqueda consuma un determinado tiempo "t", esa tabla tardará en construirse más tiempo), y el otro lo encontrará dividiendo n por dicho primo.
Para generar un número primo, basta obtener un número aleatorio impar de los dígitos deseados, y aplicar tests de primalidad, con los cuales se obtiene una certeza tan cercana al 100% como se desee (a costa de aumentar los cálculos y, por tanto, el tiempo de ejecución, pero un tiempo razonable). Si resulta que el número no es primo, podemos elegir entre repetir el proceso con otro número aleatorio, o entre sumarle (o restarle) 2 al anterior número y volver a probar. Esta suma y resta no tomará mucho tiempo, porque los números primos no están "demasiado lejos" unos de otros.
Lenguajes como Java ofrecen tests de primalidad y generadores pseudoaleatorios con los que se pueden buscar números primos por el procedimiento descrito. También ofrecen un generador de números aleatorios de k dígitos probablemente primos, especificando la certeza que queremos tener de que sea primo
Gracias por la información
Si no se hicieran los suficientes tests de primalidad se correría el riesgo de que el número no fuera primo.
Sin embargo, para los números Mersenne existe un test eficiente y seguro, el de Lucas-Lehmer. Imagino que una forma más segura -y más eficiente- sería generar números de Mersenne, en vez de números aleatorios, ¿no?
Un saludo.
No es una buena idea utilizar
No es una buena idea utilizar números primos de Mersenne. El problema de los números primos de Mersenne es que son extraordinariamente difíciles de encontrar, y a medida que encontramos más, van creciendo extraordinariamente. Según la Wikipedia, sólo se conocen 47 primos de Mersenne, el mayor de ellos con casi 13 millones de dígitos decimales. Encontrar un nuevo primo de Mersenne es un acontecimiento a nivel mundial (dentro de los círculos científicos, claro).
Los test de primalidad que existen que se ejecutan en un tiempo aceptable, aunque no ofrecen garantías al 100%, ofrecen suficientes garantías como para confiar en ellos. También existen tests que nos aseguran al 100% la primalidad de un entero, pero son excesivamente lentos.
Por ejemplo, hay un test (ahora no recuerdo cuál, y puede que haya más de un test así) en el que cada testeo reduce a la mitad la probabilidad de que el entero haya pasado el test siendo compuesto. Esto significa que si testeamos 100 veces el número, la probabilidad de que sea compuesto es de 1/2^100. Es más fácil que te toque la lotería a que el número sea compuesto si pasa el test después de 100 rondas. Java tiene un testeador así, y puede hacerse el test de 100 rondas (o las que se elijan) en un tiempo razonable. Me imagino que otros lenguajes tendrán testeadores similares.
Tienes razón
Precisamente le recordaba eso a Squirrel -lo de los 47 Mersennes- no hace mucho, en cambio no lo he tenido presente al contestarte. Despistes que tiene uno.
Gracias de nuevo.
Ni lo había visto
Lo siento, me sonaba lo del 2^n-1 y simplemente busqué de donde salía, no me paré a comprobar el artículo completo y ver que eran tan pocos. Me disculpo si he inducido a alguien a error.
resolver RSA
¿Que problemas plantearía resolver en breve tiempo mediante un algoritmo un codigo RSA independientemente de su longitud?
Tu pregunta
No entendí bien tu pregunta, hasta que me la aclaraste por el telefonillo. En efecto, parece que RSA con claves de 1024 bits ya no se considera seguro. En la página antigua de Kriptópolis se debatió el tema en diversos hilos. Puedes consultar este excelente post de Fernando Acero
Practicamente ninguno...
...siempre que tengas el algoritmo que lo haga.
por que dices que practicamente ninguno?
Se supone que es un sistema de cifrado, si existe la manera de descifrarlo en poco tiempo el sistema carece de sentido, no?
Según he leido los sistemas de seguridad mundial se basan en el sistema RSA, por lo tanto si fueran capaces de resolverlo en poco tiempo cualquier seguridad sería hakeada y creo que supondria un problema no?
Ten en cuenta
Ten en cuenta que se trata del Factorizador Loco. Si es capaz de factorizar con rapidez numeros monstruosos, el problema está resuelto. Claro que tendría que demostrarlo.
Restricción de longitud de clave RSA
Como bien señala Agustín más arriba, en esta misma entrada, el tema ya fue excelentemente debatido en la entrada Supuesta rotura de la clave privada RSA de 1024-bits, enviada por ghostDancer el 05 de marzo de 2010, sábado, y de la que además de la explicación proporcionada por Fernando Acero; también destacaría la de kevin mitnick. Cito ambas por ser en mi opinión de sumo interés y porque no ocupan demasiado espacio aunque creo merece la pena leer la entrada en su totalidad por aclaratoria y oportuna:
No obstante es necesario señalar que de momento la longitud de las claves de cifrado asimétrico -o llaves de encriptación asimétrica si se prefiere una traducción más literal del inglés también correcta pero algo más confusa en nuestro idioma-, autenticación o firma digital de documentos electrónicos está sujeta a las leyes y restricciones de exportación de los EEUU que limitan a las empresas con base en dicho país a la hora de exportar sus productos criptográficos las longitudes máximas de dichas claves de cifrado asimétrico a 1024 bits y a determinados algoritmos; aunque sus productos puedan trabajar, si se configuran adecuadamente, con claves de mayor longitud y fuera necesario eliminar la restricción de longitud de clave por no ser de aplicación o por ser inconviente en el país de destino.
Es el caso de Oracle, por ejemplo, que como actual propietaria de Sun Microsystems también lo es de su extendido producto Java por lo que el usuario de un navegador web que necesite dicho producto deberá añadir los ficheros de políticas de seguridad que evitan estas limitaciones. Son las extensiones denominadas Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files y la versión a utilizar dependerá del navegador, del sistema operativo y de la versión de Java que tenga instalada el usuario por lo que es necesario que éste siga los pasos indicados para su instalación si los sitios visitados o el mismo usuario necesitan un cifrado más fuerte que el permitido por defecto.
Saludos cordiales,
Pedro Fernández
--
Páginas
opinar