jueves, 11 de julio de 2013

Tarea 8 Algoritmo de cifrado de flujo A5

Introducción


El algoritmo de cifrado de flujo es muy utilizado para la protección de datos dentro de redes inalámbricas, éste radica su importancia en la seguridad de que el envío bit por bit se encuentre activo y cifrado dentro del flujo de información.


El cifrado A5/1, es muy utilizado en la telefonía móvil, ya que el paso de los datos que se hace por GSM también necesita seguridad, y es el A5/1 quién se lo brinda.

Descripción del funcionamiento

El algoritmo de cifrado de flujo A5/1 consta de un generador binario de secuencia cifrante, que se utiliza para cifrar la comunicación entre el teléfono y la estación base en el sistema de telefonía móvil GSM.

La conversación entre emisor y receptor (A-B), se transmite como una sucesión de tramas. Cada trama consta 228 bits, de éstos los 114 primeros representan la comunicación digital de A a B, mientras que los 114 que restan se utilizan para la comunicación en sentido contrario. Cada 4.6 mili-segundos se envía una nueva trama.

Previamente a la transmisión se realiza un proceso de sincronización que incluye también una criptosincronización entre A y B en los dos sentidos.

El generador produce 228 bits pseudoaleatorios de cada trama, que se sumarán bit a bit, mediante un XOR , dejando como resultado 228 bits de comunicación cifrada.

El A5/1 consiste de 3 LFSR's, las longitudes de los registros son 19, 22 y 23, todos los polinomios de reacción son dispersos, la salida es el XOR de los tres LFSR's.

En la comunicación se usan variables de control de reloj.

Explicación gráfica del cifrado A5/1:

Código A5/1:


Vulnerabilidad

Se encontró información importante sobre la vulnerabilidad del cifrado A5/1, dentro de un artículo, que habla de un Ingeniero Alemán que descifró el algoritmo.

El ingeniero Karsten Nohl, quien es experto en criptografía, hizo público su descubrimiento para obligar a las operadoras a utilizar otros métodos de cifrado para proteger la comunicación.

Después se publicó que este descifrado se había realizado de forma ilegal y se negaba la necesidad de cambiar la seguridad para el sistema GSM.

En 2007, se cambiaron algunos sistemas al algoritmo A5/3, pero muchos todavía siguen utilizando el A5/1.

Con un ataque semi-activo, como comenta Nohl en su presentación, interceptando una comunicación cifrada y pidiéndole a través de una estación base falsa que reutilice la clave, si damos con dos RAND iguales tendremos dos claves idénticas.

La vulnerabilidad recae en que es teóricamente posible utilizar el cifrado para realizar un ataque a la comunicación, pero se considera prácticamente imposible, razón por la cual el cifrado A5/1 sigue siendo usado.

Conclusiones


Es importante conocer cómo está constituida la seguridad de la información que a diario utilizamos, ya sea de las páginas de Internet o de los dispositivos de telefonía móvil, entre otros. Ya que como informáticos, la seguridad es uno de los temas que más nos debe preocupar. Al manejar grandes cantidades de importante información en algún sistema, programa o dispositivo.


Referencias
Silvana Bravo Hernández
 "Estudio comparativo de los algoritmos de cifrado de flujo RC4, A5 y SEAL."      
6 de agosto del 2002
http://delta.cs.cinvestav.mx/~francisco/arith/Flujo.pdf

Antonio José Galisteo Cantero
"Ingeniero Alemán descifra el algoritmo A5/1"
30 diciembre 2009
http://agalisteo.blogspot.mx/2009/12/ingeniero-aleman-descifra-el-algoritmo.html


miércoles, 10 de julio de 2013

Tarea 7 Cifrados de bloque (RC5)

Introducción

Existe una gran variedad de métodos de codificación o encriptación, utilizados en la criptografía, un tipo de ellos son los cifrados de bloque, los cuales se encuentran muy efectivos.

En ésta entrada se describirá el funcionamiento del algoritmo de cifrado RC5.

Descripción

Algoritmos de cifrado de Bloque

Criptografía Simétrica:

Para empezar con la explicación de nuestro algoritmo de cifrado RC5, es necesario saber cómo está compuesta la criptografía simétrica.

La diferencia principal de la criptografía clásica con ésta es que el algoritmo se hace público y su fortaleza se basa en la imposibilidad computacional de romper una clave secreta, tomando como valor agregado la robustez de las funciones matemáticas involucradas.

Todos los sistemas de criptografía simétrica se basan en el protocolo que se muestra en la imagen, ya que son aquellos en los que la clave de cifrado es la misma que la clave de descifrado, por lo tanto es necesario que la clave sea conocida sólo por el emisor y el receptor.

Ya que se utiliza la misma clave para cifrar y descifrar, adquiere la propiedad de un algoritmo simétrico.

Los algoritmos simétricos pueden ser desarrollados utilizando métodos de cifrado en bloque o métodos de cifrado en flujo

Los métodos de cifrado en bloque se caracterizan por que la forma en la que su mensaje es cifrado, se forman grupos, tomando bloques de datos del mensaje, de manera que se cifra uno por uno los bloques de datos de tamaño constante. La clave a utilizar debe ser del mismo tamaño del bloque, por lo tanto el texto cifrado es una colección de bloques que requieren el mismo tratamiento para ser descifrados.

Todos los cifrados de bloque se componen de 4 elementos:

Transformación lineal: Consta de una o dos funciones que pueden o no depender de la clave.

Transformacion intermedia mediante iteraciones o vueltas:
Repeticion n veces de una función no lineal sobre la clave.

Transformacion final:
Operación inversa de las dos transformaciones anteriores.

Algoritmo de expansión de clave:
Consiste en convertir la clave en un conjunto de sub-claves, por si se descubre alguna, no se sepa la clave completamente.

Cifrado RC5

Se encuentra dentro de la clasificación de los criptosistemas con clave secreta.

Es un sistema de cifrado el cual fue diseñado por Ronald Rivest en 1994.

Éste algoritmo salió en sustitución del esquema RC4, el cual había sido publicado anónimamente en internet.

Es un algoritmo que opera por bloques y éstas son sus principales características:

 Tamaño variable de bloques: 32, 64 o 128 bits.

 Palabra clave entre 0 y 2040 bits.

 vueltas entre 0 y 255.

 bloques de 64 bits (2 palabras de 32 bits), en 12 rondas o vueltas y con una clave de 128 bits (16 bytes).

 RC5 hace uso de rotaciones dependientes.

 En su estructura contiene algunas operaciones como sumas modulares y operaciones XOR.



Funciona básicamente así:

Opera con palabras de tamaño variable(w), número de vueltas variable(r) y clave secreta de longitud variable (b, en bytes).

Consta de tres operaciones primitivas, lo cual favorece mucho a la portabilidad de éste algoritmo de cifrado:

Suma módulo 2w (+)
Or exclusivo bit a bit((+))
Rotación, donde la rotación de x un número y de bits a la izquierda se denota por x <<y.

Antes del cifrado la clave secreta se expande para llenar un array S de 2r + 2 palabras.

Denotando (A, B) las dos palabras del bloque de entrada (32 bits cada una), el algoritmo es el siguiente: 

A=A+S[0]
B=B+S[1]
i=1
for i in r:

     A=((A(+)B)<<B)+S[2*i] 

     B=((B(+)A)<<A)+S[2*i+1]

S[0], S[1],...,S[2]+1    Subclaves

(A. B)     Bloque en claro

(A[r], B[r])     Bloque cifrado

Para el descifrado deben realizarse las operaciones inversas en orden inverso.

*Observación: Como nos habremos dado cuenta el método de cifrado cumple con los 4 elementos de un algoritmo de cifrado, mencionado más arriba a cada uno de ellos descriptivamente.

Ataques o posibles vulnerabilidades:

RC5 (Rivest Cypher 5, en honor a su autor) no tiene una longitud determinada de clave, sino que permite gran flexibilidad a la hora de fijar los parámetros.

El problema es que el gobierno EE.UU. declara ilegal la exportación de 
criptosistemas con una clave mayor de 40/56/64 bits, según las circunstancias. 

El objetivo de los retos RC5, es demostrar que esas longitudes de claves son insuficientes para cualquier aplicación seria, como comercio electrónico, por ejemplo.

El RC5-40 bits cayó en unas 3 horas y media.

El RC5-56 cayó en unos pocos meses de esfuerzo.

El RC5-64 es el que está siendo "forzado" en estos momentos, a buen ritmo.

Conclusiones

El Cifrado RC5 es uno de los algoritmos de cifrado menos vulnerables y más portables que existen, ya que además de que es simétrico, uno de los ataques a los que no está completamente protegido es el ataque con fuerza-bruta, pero éste se ve limitado cuando se utilizan más de 64 bits.

Referencias

Autor: UNAM Facultad de Ingeniería  Título: "CR5= River Cipher"  Fecha: Mayo 2010
URL: http://www.openboxer.260mb.com/asignaturas/criptografia/CSimetrica/RC5.php

Autor:  Alarcos  Fecha: 2010
URL: http://alarcos.inf-cr.uclm.es/doc/psi/tema4.pdf

Autor: Jesús Cea Avión Título: "Ayuda Periodística (RC5-64)"  Fecha: 25 mayo 1998
URL: http://www.jcea.es/artic/rc5-6403.htm

martes, 9 de julio de 2013

Tarea 6 Esteganografía

Introducción


La esteganografía es la rama de la criptología que se encarga de ocultar mensajes. Para marcar la diferencia entre Seguridad y Oscuridad, es importante saber que la criptografía tiene como objetivo principal, el hacer que un mensaje sea indescifrable para terceras personas dentro de una comunicación, la esteganografía se encarga de ocultar la existencia de dicho mensaje.

Es muy importante dentro de la informática conocer ésta importante técnica, ya que ha sido muy utilizada en los sitios web, para buenos o malos fines, pero que se requiere un amplio conocimiento de ella para implementarla, ya sea para ocultar mensajes en imágenes o en sonido, entre otros tipos de archivos.

Planteamiento


Para la tarea a realizar de hoy se va a implementar una técnica que oculta mensajes en un archivo ".png", haciendo referencia a una imagen. Cabe recalcar que no utilicé imágenes con formato ".jpg" ya que el mensaje se obtiene con menor claridad, por el tipo de compresión que se le hace al archivo.

Al abrir el programa el usuario elige si desea enviar un mensaje, lo cual le permite guardarlo en la imagen deseada, después dentro del mismo programa existe la opción de "recibir", la cual permite al usuario recuperar el mensaje oculto en la imagen que se generó por el emisor, y como 3 era opción se permite al usuario salir del programa.

esteganografia.py



*Para correr el programa es necesario agregar el nombre de la imagen original después de el nombre del archivo de Python, ejemplo:  python programa.py imagen.png, para descifrar es necesario tener la imagen con el mensaje oculto con el nombre de "nuevaimg.png" y la imagen original.

ejecución del programa

1. Enviar  2. Recibir  3. Salir 1
Mensaje: Este es el primer mensaje
1. Enviar  2. Recibir  3. Salir 2       
Este es el primer mensaje
1. Enviar  2. Recibir  3. Salir 3 

Imágenes utilizadas

*Sólo tres de éstas imágenes tienen un mensaje oculto, utiliza el programa para descubrir la existencia de un mensaje y cuál es su contenido.

1. Imagen original:
 



2. Imagen original:

3. Imagen original: 


4. Imagen original:


5.  Imagen original:


6. Imagen original:


Conclusión

La estenografía es una técnica muy útil en la seguridad de la información, ya que vuelve a los mensajes muy poco vulnerables a ataques de terceros, como programadores es indispensable conocer y dominar ésta técnica, para ayudar reducir el número de ataques a sitios web importantes.


Referencias

Autor:  Carlos Jumbo G. Título: "Introducción a la Estenografía"    Fecha: --  URL:  http://www.slideshare.net/cjumbo/introduccin-a-la-esteganografa 

Autor: Javier Montero Título: "Funciones que devuelven varios valores" Fecha: 26/04/2012 URL: http://elclubdelautodidacta.es/wp/2012/04/python-capitulo-32-funciones-que-devuelven-varios-valores/


jueves, 4 de julio de 2013

Tarea 5 Algoritmo RSA en aplicación web

Tarea a realizar:

La implementación de un algoritmo RSA en una aplicación web, para evaluar la autentificación del ingreso de un id de usuario, el módulo con el que se trabaja y la llave o clave privada.

Implementación

Se utilizó la herramienta Apache, para utilizar Python cgi, en aplicaciones web, dentro de nuestra aplicación hacen un papel fundamental el programa en python que interactúa con la página html principal, nuestro algoritmo RSA, utilizado para la tarea anterior y la página escrita con html y javascript.

Autentificador en python:

Página HTML:

rsa_math.py

Interfaz:



A terminar:

La implementación no está completa, ya que nuestro código javascript no hace enlace con nuestro programa en python y lo debo a un problema de configuración.
El algoritmo RSA se mejoró respecto a la tarea anterior, pero se obtienen ciertas funciones de un programa llamado rsa_math.py obtenido de pastebin.

Conclusiones

utilizado no se encuentra completo, pero en teoría sí debería funcionar para las funciones que ocupamos en ésta implementación. Cada día se encuentran más utilidades para Python y ésta es una de las más importantes dentro de la Seguridad de la información, así es como podemos observar el trabajo de el algoritmo RSA, en pleno funcionamiento ya que se considera muy poco vulnerable, al menos para ataques estadísticos, ya que si no se conoce nuestra llave privada, tenemos nuestra seguridad al 100%.

Referencias

URL: http://cic.puj.edu.co/wiki/doku.php?id=materias:laboratorio_de_lenguajes_ii:lableng2:ejemplos1

Fecha: 2010 URL: http://elisa.dyndns-web.com/~elisa/teaching/prog/web/2010/progweb6.pdf

URL: http://www.tutorialspoint.com/python/python_cgi_programming.htm

Fecha: 9 Noviembre del 2011 URL: http://pastebin.com/ziaUdaw8

miércoles, 3 de julio de 2013

Tarea 4 Algoritmo RSA



Introducción


El algoritmo RSA, es famoso por ser el más usado en el mundo para encriptar con clave pública.

Y se refiere con clave o llave pública a que por lo menos una clave que actúa como codificadora se encuentra visible para todos los participantes de la comunicación y los que intentan descifrarla. 

El meollo de nuestro algoritmo es utilizar una clave privada, sólo conocida por la persona quien escribe el mensaje, para encriptar con clave pública y clave privada y así sea muy difícil encontrar el mensaje original, para personas quienes no sean emisor o receptor.



Planteamiento del problema:



Implementar un algoritmo RSA, entro de una comunicación cliente-servidor, a manera de observar el comportamiento que se tiene de las llaves públicas y privadas sobre el mensaje que viaja en valores enteros.



Procedimiento del Algoritmo:



Éste asume que hay alguna forma de convertir las letras y símbolos en números y viceversa. Esto lo podemos hacer usando una tabla de conversión ASCII, donde A corresponde a 11, B a 12, etc. Por ejemplo la palabra Attack! Sería transformada en 115656373947.


Tabla de conversión ASCII:


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 9


Luego de convertir la palabra en un número entero, encriptar y desencriptar se convierte en un asunto de cálculo simple entre grandes números enteros. 

Sean p y q dos números primos muy grandes, se multiplican obteniendo 


N = pq. 


Sea e un entero positivo que no tenga factores en común con (p-1)(q-1). 

Sea d un entero positivo tal que ed - 1 es divisible por (p-1)(q-1).


Y en definición sea:


f(x) = x^e mod N (esto significa "divida N por x^e y tome el resto") 



g(x) = x^d mod N (i de m)


Use f(x) para encriptar y g(x) para desencriptar.

e es el mensaje encriptado, N es la clave pública que cualquiera puede conocer y puede usarse para encriptar un mensaje, en cambio d es el mensaje desencriptado. p y q son la clave privada que solo conoce el destinatario y le sirve para desencriptar el mensaje.

¿Por que el RSA es tan difícil de romper? Pensemos que hace Alice para recibir mensajes secretos. Primero genera los grandes números primos p y q, luego escoge e. Finalmente resuelve la ecuación para encontrar d: 


ed + (p-1)(q-1)y = 1


Donde todas estas variables son números enteros. Alice publica e y N. Es todo lo que necesita para que cualquiera le envíe mensajes secretos.

Ahora veamos a Bob que conoce N y quiere desencriptar los mensajes de Alice. Para esto necesita conocer los factores de N, p y q de modo de resolver la ecuación. Luego resuelve la ecuación para encontrar d, lo que equivale a desencriptar el mensaje de Alice. El problema es que para factorizar (o sea encontrar p y q que multiplicados hacen N) le tomaría una enorme cantidad de tiempo computacional -para valores de p y q suficientemente grandes- podría tomar millones de años con el conocimiento y tecnologías actuales.


Implementación:


Se tuvo problemas al intentar implementar el algoritmo en un programa, primeramente utilizando los sockets, ya que no se obtenía comunicación ambidireccional.



El programa está incompleto, tiene algo de lógica pero le falta funcionalidad a la hora de la implementación, se necesita comprender más a fondo el algortimo.
Se necesita implementar comunicación cliente servidor donde la información viaje en dos direcciones, para poder simular correctamente el funcionamiento del algoritmo.


Conclusiones:



Se puede concluir que el algoritmo RSA es muy seguro, y no vulnerable, ya que aunque parezca que se da mucha información a las otras partes de la comunicación, la clave privada nunca se comparte, ni se muestra, lo cual no permite la obtención del mensaje original.


Referencias:


Autor: "Javiyu" Título: "Generadores en python" Fecha: 13 de mayo del 2008 URL: http://javiyu.blogspot.mx/2008/05/generadores-en-python.html

Autor: Tomas Bradanovic Título: "El algoritmo RSA para dummies" Fecha: Jueves 22 de noviembre del 2012 URL: http://bradanovic.blogspot.mx/2012/11/el-algoritmo-rsa-para-dummies.html

Autor: "Raúl González Duque" Título: "Sockets en Python" Fecha: URL: http://mundogeek.net/archivos/2008/04/12/sockets-en-python/









martes, 2 de julio de 2013

Tarea 3 Hack del algoritmo de Diffie-Hellman

Introducción

El algoritmo de Diffie-Hellman nos permite acordar una clave secreta entre dos máquinas através de un canal inseguro y enviando únicamente dos mensajes.

La clave secreta resultante no puede ser descubierta por un atacante, aunque éste obtenga los dos mensajes enviados por el protocolo. La principal aplicación de éste protocolo es acordar una clave simétrica con la que posteriormente cifrar las comunicaciones entre dos máquinas.

Procedimiento

Alice y Bob desean ponerse de acuerdo sobre una clave para comunicarse criptográficamente, y sólo disponen de un canal al que tiene acceso Eve. Eve tiene interceptadas las comunicaciones entre Alice y Bob.

Alice---------------------------------------(Eve)----------------------------------------Bob

Alice y Bob deciden que la clave será una potencia modular y lo primero es ponerse de acuerdo sobre la base de la potencia y el módulo. Éstos números serán g(un número generador) y p(un número primo). Eve toma nota de éstos números.

Alice y Bob eligen dos números x y y que mantienen en secreto, éstos números serán sus claves privadas, Eve no conoce éstos números. Tampoco Alice conoce el de Bob ni Bob conoce el de Alice.

Alice calcula la potencia (g^a)mod p  y se la envía a Bob, a lo que también Eve toma nota de éste número.

Bob hace lo mismo con Alice; calcula la potencia (g^b)mod p la envía a Alice, también Eve toma nota de éste número.

Y ahora podemos analizar la situación apuntando qué es lo que conoce cada quién.

Alice: Conoce el valor de su número "x" y el número que le ha enviado Bob "Y".
Bob: Conoce el valor de su número "y" y el número que le ha enviado Alice "X".
Eve: Conoce los valores de "X" y "Y" que interceptó dentro de la comunicación.

Alice eleva su clave privada "x" al número que ha recibido de Bob y obtiene Y^x que es lo mismo que (g^y)^x = g^xy.

Bob eleva su clave privada "y" al número que ha recibido de Alice y obtiene X^y que es lo mismo que (g^x)^y = g^yx.

Y como g^xy  = g^yx , Alice y Bob tienen el mismo número.

Eve no puede calcular éste número ya que sólo tiene el valor de  "X" y "Y"

Aquí se muestra la descripción muy gráfica del protocolo de Diffie-Hellman, en el programa se toman los valores de éste ejemplo para verificar su correcta funcionalidad.
Imagen obtenida de: http://www.javiercampos.es/blog/2011/07/22/el-algoritmo-de-diffie-hellman/

En el programa se intenta hackear el algoritmo, averiguando el valor de "x" y "y" desde Eve, de quién estamos seguros que no los conoce, ni tiene acceso a ellos.

En el código observamos cómo Eve hackea el algoritmo, utilizando al inicio supuestos x y y hasta encontrar los que son congruentes con el resultado de las operaciones de (X^y)%p y (Y^x)%p sustituyendo el valor del generador por X y Y.

En la ejecución del programa se muestra que Eve realmente logra Hackear el algoritmo.

ramsmunoz@ramsmunoz-Lenovo-B470:~/Escritorio$ python Diffie.py
primo: 23
generador: 5
Turno de Alice
x: 6
Turno de Bob
y: 15
Turno de Alice
x: 6
Alice recibe: 8
Bob cifrado= 262144
Turno de Bob
y: 15
Bob recibe: 19
Alice cifrada= 15181127029874798299
Eve conoce: X, Y, g, p
Se encontro que x de Alice= 6
Se encontro que y de Bob= 15

Dentro del programa, se le tiene que recordar el valor de x a Alice y el valor de y a Bob, al momento del segundo turno en la función de Alice y Bob, fue importante que se quedara así para cumplir realmente que sólo se tenga acceso a "x" y a "y" dentro de sus respectivas funciones.

No existe el modo automático dentro del programa, para la generación de números primos y los generadores, pidiendo al usuario la cantidad de dígitos. Lo cual se puede hacer, generando en una función números primos aleatoriamente, según un mínimo y un máximo estipulado, tomando el que concuerde con el número de cifras ingresado por el usuario, y después encontrar nuestro g, para próximamente pasar a nuestro algoritmo de Diffie-Hellman.

Conclusiones

Se puede observar que el algoritmo de Diffie-Hellman no es completamente seguro, ya que con el programa estamos mostrando su vulnerabilidad, pero se sabe que cuando se trata de números primos muy grandes, éste desafía la capacidad de procesamiento de las computadoras o sistemas distribuidos que intenten atacarlo.

Referencias

Autor: Javier Campos Título: "El algoritmo de Diffie-Hellman" Fecha: 22 de julio del 2011 URL: http://www.javiercampos.es/blog/2011/07/22/el-algoritmo-de-diffie-hellman/
Autor: Jesús García de Jalón de la Fuente Campos Título: "Protocolo Diffie-Hellman" Fecha: 02 de noviembre del 2009 URL: http://www.slideshare.net/fivefingers/protocolo-de-diffiehellman
URL de github: https://gist.github.com/ramonesteban/3617622

lunes, 1 de julio de 2013

Tarea 2 Generación Pseudo-aleatoria Segura

INTRODUCCIÓN
Dentro de la Seguridad de la información, existe actualmente una necesidad de usar algoritmos de encriptación, seguros, confiables y más que todo, cero vulnerables a ataques del tipo estadístico, encontrando áreas de oportunidad en la plataforma en la que son construidos éstos algoritmos.

Es importante conocer las capacidades de cada lenguaje o plataforma, ya que puede que uno esté mejor preparado para éste tipo de procedimientos, ya sea con funciones ya construidas dentro de alguna librería, o con un sistema optimizado, para que al momento de usar números aleatorios, como herramienta algorítmica el nivel de vulnerabilidad a ataques, sea el mínimo.

PLANTEAMIENTO DEL CASO DE ESTUDIO
Se decidió evaluar la generación pseudo-aleatoria de números, en 4 lenguajes; C, Java, Ruby y Python, de los cuales por el prestigio, antigüedad y utilidad son llamados por grandes comunidades de programadores, como lenguajes muy estables y útiles para diferentes tipos de tareas.

Por lo tanto decidí construir un algoritmo en éstas 4 plataformas con pequeñas variantes respecto a las funciones disponibles que se pueden utilizar en cada lenguaje para al final realizar una comparativa.

HIPÓTESIS
Se piensa que se obtendrá un mejor resultado en el lenguaje Python, debido a que ha sido desarrollado para éste tipo de experimentaciones y se han encontrado más funciones que ayudan a facilitar la construcción del algoritmo, después de éste le seguirá Ruby, ya que es de los lenguajes más modernos, muy utilizados para el desarrollo web, que es en dónde más se necesita la seguridad informática y compartiendo muchas características con Python, no sólo de sintaxis.

Siguiente a éste es posible que sea C, ya que se puede observar cómo las funciones para aleatorizar nuestros números  utilizan herramientas cómo el tiempo del sistema, para poder generar números aleatorios uniformemente distribuidos y por último ponemos a Java, ya que se sabe que está muy orientado a negocios, software empresarial, bases de datos y otro tipo de implementaciones, por lo tanto supongo que al momento de querer hacer éste tipo de experimentos es el último lenguaje de éstos 4 que escogería.

EXPERIMENTACIÓN

Ruby
Programa: 

Ejecución:

Ingrese la cantidad de numeros a procesar: 1000
Números repetidos por lo menos una vez: [10188, 35911, 106562, 28056, 64932]
Repeticiones totales 10


Python
Programa:

Ejecución:
Cantidad de numeros a generar: 1000
repetido encontrado: 77871
repetido encontrado: 77871
repetido encontrado: 61916
repetido encontrado: 78394
repetido encontrado: 13602
repetido encontrado: 78394
repetido encontrado: 36968
repetido encontrado: 13602
repetido encontrado: 36968
repetido encontrado: 88086
repetido encontrado: 61916
repetido encontrado: 88086

C
Programa:

Ejecución:
Repetido encontrado: 84679
Repetido encontrado: 50850
Repetido encontrado: 29411
Repetido encontrado: 50850
Repetido encontrado: 29414
Repetido encontrado: 84679
Repetido encontrado: 11652
Repetido encontrado: 11652

Java
Programa:

Ejecución:
Repetido encontrado: 95887
Repetido encontrado: 74726
Repetido encontrado: 95887
Repetido encontrado: 70404
Repetido encontrado: 49909
Repetido encontrado: 43968
Repetido encontrado: 75409
Repetido encontrado: 49909
Repetido encontrado: 43968
Repetido encontrado: 59876
Repetido encontrado: 75409
Repetido encontrado: 59876
Repetido encontrado: 70404
Repetido encontrado: 74726


EVALUACIÓN DE RESULTADOS
Gráficas de los lenguajes en 1000, 500 y 250 números aleatorios:
Aquí observamos cómo en algunos lenguajes se tiene menos repeticiones en algunas ocasiones, pero hay que probar en un ejemplo más grande, generaremos 5000 y veremos quién tiene en promedio, menores repeticiones.
Gráfica comparativa de todos los lenguajes final


CONCLUSIONES
Se llegó a la conclusión de que nuestra hipótesis, no se cumple del todo, pero sí tiene ciertas similitudes con los resultados.
Ya que acertamos en que Ruby y Python son los mejores y más podernos lenguajes para éste tipo de experimentos, ya que unas de sus aplicaciones es el desarrollo web, en donde se necesita más que en otros lenguajes, la seguridad informática.
Y que Java y C son más vulnerables, en caso de ataques informáticos que se aprovechen de la generación pseudoaleatoria de números en éstos lenguajes.
Así que a la hora de hacer una aplicación de un algoritmo, si se tiene el conocimiento, hay que optar por Ruby y por Python, que según nuestro experimento, son los menos vulnerables.

REFERENCIAS
Autor: Víctor Cuervo Título: "Número Aleatorio en Java" Fecha: 07 de abril del 2007 URL: http://lineadecodigo.com/java/numero-aleatorio-en-java/
Autor: -- Título: "OverAPI" Fecha: -- URL: http://overapi.com/
Autor: Brian Schröder. Título: "Ruby en 15 minutos" Fecha: 15 de septiembre del 2006 URL: http://rubytutorial.wikidot.com/ruby-15-minutos