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: 
class Generacion
attr_accessor :arreglo, :aunico, :arepeticion, :numero, :repeticiones #funcion utilizada para el acceso a objetos
arreglo=[]
arepeticion=[]
repeticiones = 0
aunic=[] #se declaran arreglos y variables a utilizar
puts "Ingrese la cantidad de numeros a generar: " #pide el numero de elementos
numero = gets
numero.to_i.times.map do |num| #Generacion de numeros aleatorios
arreglo << 10000 + Random.rand(99999)
end
arreglo.each do |elemento| #Entontrar repeticiones
if arreglo.count(elemento) > 1
arepeticion << elemento.to_i
end
end
arepeticion.each do |indice| #Eliminar repetidos
arreglo.delete_if do |elemento|
elemento == indice
end
end
puts "Numeros repetidos por lo menos una vez: #{arepeticion.uniq}"
puts "Repeticiones totales #{arepeticion.count}"
end
view raw generador.rb hosted with ❤ by GitHub

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:
def repeticiones(todos): #funcion que checa si hay repeticiones
for i in range(len(todos)):
for j in range(len(todos)):
if j!=i:
if todos[i]==todos[j]: #conficion que decide cuando hay una repeticion
print "repetido encontrado: "+str(todos[i]) #Se agrega el valor del numero repetido
return
def random():
import random
x = int(raw_input("Cantidad de numeros a generar: ")) #se piden los numeros a generar
array=list()
todos=list()
b = ''
for i in range(x):
array.append(random.randint(10000, 99999)) #Se generan numeros segun un rango
todos.append(int(array[i])) #Se agregan en la lista todos
repeticiones(todos)
return
def main():
random()
main()
view raw generador.py hosted with ❤ by GitHub

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:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int n, i, j;
srand(time(NULL)); //Se inicializa la semilla con el tiempo del sistema
n = atoi(argv[1]); //Se obtiene el valor de n
int array[n];
for(i=0;i<n;i++)
{
array[i]=(rand()%((99999+1)-10000))+10000; //Se asignan numeros aleatorios en el arreglo, por un ciclo
}
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
if(j!=i)
{
if(array[i]== array[j]) //checa si existen repeticiones, para después imprimirlas
{
printf("Repetido encontrado: %d\n", array[i]);
}
}
}
}
return 0;
}
view raw generador.c hosted with ❤ by GitHub

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:
import java.util.Random;
public class Generador{
public static void main(String[] args){
int i, j; //declaracion de variables
int n = Integer.parseInt(args[0]); //se obtiene valor de n
int array[] = new int[n]; //se declara el arreglo contenedor
for(i=0;i<n;i++){
array[i]= (int)(Math.random()*99999+10000); //En el ciclo se generan numeros aleatorios de 5 cifras
}
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
if(j!=i)
{
if(array[i]== array[j]) //se checa si existe una repeticion
{
System.out.print("Repetido encontrado: "); //imprime un mensaje y el numero encontrado
System.out.println(array[i]);
}
}
}
}
}
}
view raw Generador.java hosted with ❤ by GitHub

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

1 comentario:

  1. OK; pudiera haber sido más extensa la experimentación, con mayor variedad de pruebas a realizar. 5 pts.

    ResponderBorrar