Comunidad de diseño web y desarrollo en internet

Algoritmo generador de códigos de recarga y tarjetas prepago

Crearemos un sistema basado en técnicas de Inteligencia Artificial, con la capacidad de generar números validos de tarjetas prepago. El trabajo es realizado con fines netamente académicos y con el sano propósito de demostrarle a una compañía de teléfonos móviles especifica, la vulnerabilidad que posee en su sistema de codificación de tarjetas prepago y concientizar el gran peligro que esto representa. Cabe aclarar que como académico que soy, piensa que el texto no es el motivo de una acción delictiva ni incentivo para hacerla. El tener un arma de fuego y disparar un tiro al aire, o el saber usarla no implica delito. Los agentes utilizados fueron RNA’s y algoritmos inteligentes de búsqueda programados todos en Matlab v.7.

Introducción a generar códigos de recarga para tarjetas prepago de celular


Con seguridad, todos aquellos que hemos utilizado la telefonía celular prepago por medio de tarjetas o pines; al cargar nuestra cuenta vía telefónica introduciendo el extenso numero o pin, que ingresado de forma exitosa recarga nuestro saldo con un equivalente en minutos al valor de la tarjeta adquirida. En algunas de estas ocasiones, se nos habrá pasado por la mente la idea de digitar un número al azar, esperando tener la fortuna de que éste sea un código valido y por lo tanto recargue nuestra cuenta, ahorrándonos el valor por compra de la tarjeta. Y si algunos de hecho lo han intentado, quizás otros no, pero al final con intento fallido o sin el, alguna lógica no formal, talvez el instinto, nos dice que este evento debe ser muy difícil de ocurrir y que es solo malgastar el tiempo, intentarlo repetidas veces; pues a la final casi con toda certeza no lo lograremos. Lo anterior, es en gran parte valido. Pero si vemos las cosas un poco metódicamente, no es cierto ni correcto descartar del todo la probabilidad de que dicho evento ocurra, aun más: tiene que ocurrir en algún momento. Pero en verdad el camino para llegar a él, no es el de la coincidencia, sino uno mucho mas estructurado (si es que queremos que suceda pronto y con certeza). Ya que así no sepamos formalmente porque, ni como; estamos en lo cierto al pensar que es difícil encontrar un numero valido aleatoriamente.

Revisando un poco el tema de la seguridad en sistemas de cómputo, en especial en redes de comunicación. Vemos que han surgido de allí y con el fin de proteger la información, múltiples técnicas de cifrado, las cuales consisten en un encriptamiento codificado de la información, para que viaje segura a su destino. Algoritmos poderosos como el DES o el 3DES [3], han sido aplicados para mantener la privacidad en las telecomunicaciones durante años, al igual que los algoritmos de autenticación basados en la filosofía de llaves publicas y privadas [3], se han convertido en la piedra en el zapato para los intrusos o llamados hackers.

Es tan monitoreado y controlado el tema de la seguridad en el mundo de las telecomunicaciones, que en los EE.UU. entidades gubernamentales, retan a cientos de personas con maquinas multiprocesadores a competir por “tumbar” sus algoritmos de seguridad y descifrar sus códigos de acceso. Premiando con jugosas cifras de dinero a quien lo logre primero, ya que es mucho mas económico para ellos invertir este dinero en un premio que asumir las gigantescas perdidas que le podrían surgir si alguien rompe el algoritmo de forma furtiva y para uso delictivo.

Partamos del supuesto, que nuestra compañía telefónica posee a su disposición un fuerte algoritmo de seguridad para diseñar sus pines prepago. ¡Intentemos tumbarlo!

2 Análisis del problema

2.1 En General


Para obtener un sistema capaz de generar números validos de tarjetas prepago de una compañía telefónica, debemos pensar en un principio que dicha tarea se compone de dos tareas “menores”. La primera, determinar si el numero es valido o no. Y la segunda, generar ese numero. Obviamente estas tareas se realizan en orden contrario a como se enunciaron, solo que en la practica diseñaremos primero la solución a la clasificación y luego a la generación o búsqueda.

Aquí entonces debemos introducir el concepto de multiagente [4] puesto que el sistema se debe componer de dos subsistemas o agentes (IA), que cooperativamente lograrán el objetivo final. Cooperativamente ya que el trabajo encargado y realizado del uno depende del que el otro haga, por medio de una retroalimentación constante. Así pues que visto desde este punto y en forma general el problema es diseñar dos sistemas y no uno, además de acoplar y lograr su buena comunicación (parte fundamental).

2.2 En Complejidad


Entrando un poco más en el tema, es hora de revisar nuestro objetivo, que básicamente es un número como el que tenemos a continuación, claro esta con la propiedad de que sea valido:

4 5 8 7 5 6 3 2 1 5 6 4 7 8 5 6


Figura No 1. Numero de tarjeta prepago


Como podemos observar en la figura No 1, nuestro número objetivo será un número de tamaño constante en dígitos (16), y obviamente cada uno de estos podrá variar solo entre 0 y 9. Conocimiento en el que nos basamos para deducir la cantidad de posibles números existentes, cantidad igual a 1016, el 10 por el total de posibilidades que posee cada digito (0 a 9) y el 16 obviamente por el tamaño o total de dígitos de cada número. Esto nos introduce a una cantidad de diez mil millones de millones o diez mil billones (10 000 000 000 000 000) de posibles números a tratar. Cabe hacer algunas aclaraciones que en la practica pasan ha ser irrelevantes, como el hecho de que no todos los números son factibles, puesto que por ejemplo los números donde los 16 dígitos sean iguales, se pueden descartar de entrada ya que nunca serán validos. Se pueden dar otros casos de números no factibles para nuestro análisis, pero al finalizar y sumar todos, no representan un descuento significante a la cantidad original de posibilidades.

Como ya habíamos sugerido en el apartado 2.1 y como aquí asumiremos como metodología en adelante: partiremos nuestro problema en dos problemas:

2.2.1 Clasificación


Básicamente consiste en decidir a que grupo pertenece un número de tarjeta, al de los validos o al de los no validos (clasificación binaria) así que con base a la cantidad de posibilidades deducida anteriormente, analizaremos de manera mas matemática la complejidad que acarrea dicha clasificación.

Podemos ver cada número pin, como un vector en R16 y situar en esta dimensión nuestro conjunto de pines o espacio de búsqueda (compuesto de 1016 elementos) dentro del cual queremos modelar o clasificar un subgrupo: el de los validos. Para efectos visuales plasmamos una idea de lo dicho, pero en 2 dimensiones, en la Figura No 2.



2. Representación de los espacios de búsqueda y solución en R16


Ahora si nos fijamos bien, la complejidad de la clasificación no consiste ni siquiera en que estemos tratando con una dimensionalidad muy alta, sino en el hecho de que los grupos que deseamos clasificar o separar no son linealmente separables (comprobado en el desarrollo por medio de pruebas) pues por simple lógica no pueden serlo, ya que los podríamos modelar o clasificar con un simple modelo lineal y esto básicamente significaría que los distinguiríamos casi a ojo. Por el contrario, este conjunto de números debe contar con una alta no linealidad para no presentar características percibibles, incluso como se ve en la figura No 2, el conjunto debe ser hasta discontinuo, por lo tanto aun más complejo de modelar. O por lo menos con estas características los debe construir un buen algoritmo de seguridad.

Es por ello que nos veremos obligados a trabajar con una herramienta, compleja, grande y poco común ya que los métodos convencionales de aproximación o interpolación no pueden poseer la capacidad para modelar conjuntos con fronteras tan variantes. O para decirlo en términos de minería de datos, no poseen la EXPRESIVIDAD [5] suficiente.

2.2.2 Generación o Búsqueda


Después de diseñar nuestro clasificador (con propiedades de adaptarse a espacios altamente no lineales o muy expresivos), necesitamos de un sistema mas, que genere números factibles, para que nuestro primer agente les clasifique, ya que si nos detenemos a pensarlo un minuto, no tendría sentido que nosotros le diéramos los números pues nuestro esfuerzo de generarlos podría ser clasificado simplemente al ingresar el numero vía telefónica y no necesitaríamos el clasificador diseñado.

La primera idea que trata de surgir, según los anteriores términos, es la de diseñar un programa que genere números aleatoriamente hasta que nuestro clasificador encuentre alguno que encasille en el grupo de los pines validos. Evidentemente eso no es nada optimo como por lo regular lo son los procedimientos azarosos, motivo por el cual le debemos dar inteligencia al algoritmo anterior, de tal modo que este genere solo números, con alta probabilidad de que nuestro clasificador les califique como validos.

Dicho en estos términos podemos perfectamente abordar este problema como un típico problema de optimización, donde debemos minimizar una función objetivo que para nuestro caso es la distancia entre el número generado y los números validos. Esta función obviamente también será una función en R16, cuyos elementos son los vectores o pines de 16 componentes y de ellos los que la minimizan son aquellos tales que sean validos ya que la distancia (para nombrar de alguna manera el factor que mide la validez del numero) entre un pin valido y otro pin valido es 0 (el mínimo).

Hay que aclarar en este preciso momento, que gran parte de este problema es diseñar el algoritmo de minimización u optimización, pero el mayor porcentaje del problema lo proporciona la definición “matemática” de dicha función con todas las restricciones que ella debe tener, de las cuales se nos hará evidente la mas importante de todas un poco mas adelante, pero en el mismo momento trataremos de satisfacerla.

También es preciso anticiparnos y decir que de manera irónica este problema de la definición de la función con todo y su dificultad, se solucionará automáticamente y nosotros solo nos preocuparemos por implementar algunas restricciones conceptuales.

3 Planteamiento de la solución

3.1 Clasificación


Para solucionar este problema hemos optado de manera indiscutible por programar un algoritmo neuronal [2], o Red Neuronal Artificial (RNA), debido a su excelente desempeño en la solución del mismo. Pero si se necesitará de justificar su elección… Veamos:

Existe un problema común para someter a prueba la calidad de adaptación de los sistemas de clasificación tanto estadísticos como heurísticos. Es el problema de las espirales de Arquímedes [6], que consiste en dos espirales concéntricas que dan tres vueltas, luego el sistema debe ser capaz de especificar a cual de las dos espirales pertenece un punto cualquiera. Para lograr dicho cometido el sistema debió haber modelado con exactitud los dos conjuntos que tienen cada uno la forma de una espiral; la forma mas poco lineal que pueda existir como se ve en la figura No 4.


Figura No 4. Espirales de Arquímedes

La Red Neuronal (multicapa) [1] ha sido hasta el momento el mejor modelo de cualquier área que ha logrado resolver esta prueba, con una exactitud de un 99%. Como se puede ver tanto en [5] como en [6].

Pero además la figura No 5. También nos deja ver el desempeño en la modelación no lineal de la Red Neuronal, comparada con otros modelos comúnmente implementados para este fin [5].



Figura No 5. Modos de clasificación para distintos clasificadores a)Perceptron b)Función de base radial c)Red Bayesiana d)Red Neuronal e)Árbol de decisión

3.2 Generación o Búsqueda


Para este fin debemos seleccionar un algoritmo típico de búsqueda usado en los procesos de optimización en ingeniería. Contamos en ese caso con buenas herramientas que han tenido gran aceptación entre los ingenieros dedicados a resolver problemas de este tipo, algunos de ellos son los siguientes:
  • Algoritmo Genético.
  • Simulated Annealing.
  • Búsqueda Tabú.
  • Algoritmos Golosos o Voraces.
  • Algoritmo del gradiente descendiente (RNA’s).
  • Colonia de Hormigas.

Cualquiera de los anteriores cumplen nuestros requisitos y aunque los 2 primeros y el 5, se apegan mas, al modelo que ya hemos esquematizado (definir y minimizar una función objetivo). Incluso una especie de hibrido donde cada uno de los algoritmos nos proporcione números durante algún tiempo y luego de paso a otro, podría resultar aun mas poderoso, pero obviamente mas complicado y difícil de controlar.

Hay que resaltar la experiencia de la implementación de los 3 primeros algoritmos en la presente investigación, con resultados prácticamente iguales. Razón que nos inclino a implementar definitivamente un Algoritmo genético, debido a su popularidad y “sencillez”.

El siguiente cuestionamiento a resolver es el de: ¿Cuál será la función objetivo? Primero repasemos de modo tangencial el funcionamiento básico de un Algoritmo genético (AG) [2], que basado en la evolución de Darwin crea poblaciones de individuos (posibles soluciones) y luego de estos individuos se reproducen casi siempre, o por lo menos mas probablemente, los mas aptos, aptitud que se pondera con la función a minimizar o maximizar, ósea la que estamos buscando.

Y como habíamos acordado que en nuestro caso la función es aquella que me define la validez de un pin generado, o sea la distancia entre el pin generado y los pines validos que en últimas se puede traducir a la distancia entre pines generados y pines clasificados por la RNA como validos (cuando haya aprendido a clasificarlos). Podemos ver como los elementos que minimizan la función aquellos que la red clasifica como validos y por ende podemos ver ya definida la función objetivo, como la misma Red Neuronal. Motivo por el cual de forma anticipada, dijimos en el apartado 2.2.2 que el difícil problema de definir la función objetivo, se solucionaba por si solo al establecer el primer sistema o Red Neuronal como dicha función. Hecho que además consolida nuestra cooperación, retroalimentación o dependencia de un sistema con otro.

Se debe tener mucho cuidado en la implementación de este algoritmo genético, puesto que no queremos que genere los números que la red ya sabe clasificar o conoció en el entrenamiento , ni tampoco unos parecidos a estos (es a lo que tenderá). Puesto que no estamos buscando números físicamente parecidos a ellos, mas bien números parecidos, pero por el hecho que conserven los mismos patrones de dichos pines, que no son notables ni física ni obviamente, a tal grado que solo los puede percibir la red y no un humano. Ósea lo que buscamos explorar en la red es su generalización [1] de aprendizaje y no en si, su aprendizaje base. Esto pone en evidencia una importante restricción en la función a optimizar y es la siguiente:

Los elementos a buscar por el AG, si son los que tengan mucha probabilidad de ser clasificados como validos por la red, pero que ADEMAS sean físicamente (en su estructura numérica) diferentes a los que la red ya conoce o con los que se entrenó que es lo mismo. Con lo cual garantizamos estar buscando individuos o elementos con rasgos de generalización y no de aprendizaje.

Por ende replanteamos la función objetivo de manera esquemática como se ve en la formula No 1:

F(x) = RNA(x) - Similitud(x, set_rna)
Formula No 1. Función Objetivo del Algoritmo Genético

En donde x es el individuo o pin a evaluar, RNA() es el valor o la clasificación de la Red Neuronal para dicho individuo y Similitud (x, set_rna) es el parecido que el individuo posee con un numero que se uso para el entrenamiento de la red, o sea uno que ella ya conoce.

4. Desarrollo de la solución


Inicialmente recopilamos durante algún tiempo y con la ayuda de algunas personas involucradas en el proyecto una cantidad de tarjetas ya usadas de la compañía celular en cuestión. En verdad no son muchas ni suficientes como podremos observar en las conclusiones, pero es una cantidad que nos proporciono el arranque del proyecto (100 tarjetas). Además nos tomamos la molestia de comprobar que otros 200 números mas, que seleccionamos aleatoriamente, eran inválidos, con lo que comenzamos con un moderado set de entrenamiento (en la actualidad continua robusteciéndose) de 300 números, 100 positivos (clase 1) y 200 negativos (clase 0).

Programamos con el toolbox de Matlab v.7 una red neuronal, con 16 entradas y tres capas de 15, 8 y 1 neurona respectivamente. La entrenamos con algoritmo Backpropagation, rata de cambio de 0.015 y un factor de momentum de 0.9. Le ingresamos como set de entrenamiento los 300 números anteriores con sus respectivos target’s (de 1 a 100 salida deseada 1 de 101 a 300 salida deseada 0), y le toleramos un error del 0.0001, el cual alcanzamos en 60 000 iteraciones. El error pudo ser menor e igual lo alcanzábamos siempre, pero para prevenir un sobre aprendizaje de la red [2] y teniendo en cuenta que nos interesa mas la buena generalización [2], decidimos prudencialmente dejar este error.

La Red efectivamente cumplió nuestro primer propósito de manera aceptable. Y luego de definir una función de similitud de un numero de 16 dígitos con alguno de los 100 primeros (positivos) del set. La cual consistía en verificar y contar la cantidad de números que tenían iguales y darle peso según la distancia en dígitos que tenían uno con otro (cualquiera puede diseñar alguna otra). Programamos pues un algoritmo genético con individuos o cromosomas de 16 genes constantes igual que el tamaño de las poblaciones (200). Utilizamos una mutación del 0.0001% de probabilidad y una recombinación monopunto con probabilidad igual al 98.5%. Además con implementación de función fittnes descrita por la formula No. 1.

Es importante aclarar que la red respondía a un numero o le clasificaba con un real entre 0 y 1 así que poseía un nivel de incertidumbre, y por lo regular números menores que 0.001 los clasificábamos como no validos, y números con calificación superior a 0.99 eran acogidos como validos. La función de similitud variaba en igual dominio (0 a 1). Y al restarle este factor a el resultado de la red obviamente generábamos otro real entre 0 y 1, solo para aclara el rango de la función fittnes del AG.

Luego se puso a correr el sistema completo (AG generando y RNA clasificando) durante una noche. Al día siguiente habíamos generado 6 números con calificación de la red igual o mayor de 0.9998 y todos con estructura distinta a los del set. Luego nos dispusimos a verificar vía telefónica, si el sistema había acertado en su primer intento o no.

5. Análisis y observaciones


Para una persona que medianamente domine el tema de RNA’s le será aun mas claro el comportamiento del sistema mostrado de forma grafica en la figura No 6.

Y aunque no reviste ningún grado de dificultad, el correcto entendimiento de dicha grafica, si es primordial detallar en la idea general que esta nos provee acerca del proyecto. Para lograr aterrizar con fundamentos la idea de lo no utópico del mismo.


Figura No. 6. Comportamiento del sistema (aciertos Vs set)

Para explicar un poco la grafica, observemos que aun cuando el set de entrenamiento sea 0, existe una mínima posibilidad de un acierto (acierto netamente azaroso). Pero en adelante observamos el comportamiento del sistema en términos de la probabilidad de acierto y el tamaño del set, que desde luego es una relación no lineal, ya que desafortunadamente crece mucho mas rápido la abscisa que la ordenada. Lo que quiere decir que un incremento de miles en el tamaño del set, no representa mucho crecimiento en la probabilidad de acierto. Pero podemos fijarnos también que este como muchos sistemas probabilísticos de igual comportamiento, presentan en un momento de la curva, un punto de inflexión que se alcanza con una cifra del orden de los miles (desconocida) de la abscisa y que en adelante dispara la ordenada, o sea la probabilidad de aciertos en nuestro caso (comportamiento contrario). Es este el punto ideal de nuestro sistema y por lo menos ya tenemos una idea de cómo llegar a el: incrementando fuertemente nuestro set de entrenamiento o ejemplos de aprendizaje de la Red Neuronal. Hablamos de incremento en miles puesto que la cantidad máxima de del set es igual a la cantidad de posibles números a generar (diez mil billones).

Esto además concuerda con la teoría de redes [1] la cual indica que para poder modelar bien un conjunto con ellas. Se deben tener elementos muy representativos del conjunto (en nuestro caso no los conocemos) o una buena muestra (en cantidad) del mismo, que es a lo que nos enfoca la grafica.

Por ultimo haremos observaciones respecto a varias cosas como:

La resumida en este trabajo a sido solo la versión inicial del sistema, aunque la básica y sobre ella se sigue fundamentando cualquier modelo mas potente.

El modelo como tal a sufrido severos ajustes que por razones de seguridad ya no es conveniente describir.

Como mencionamos en el apartado anterior, el set sigue creciendo actualmente. Buscando asiduamente el punto de inflexión de la curva.

Gracias ha este análisis y en comparación con otros sistemas, en especial con uno, hemos llegado a deducir y comentar el siguiente apartado del articulo, lo que podría verse como un complemento a la solución, para llegar a un resultado general del sistema 100% seguro, aunque parezca improbable. Para ello escudriñamos un poco mas en la grafica de la figura No. 6.

6. Complemento concluyente para el éxito del sistema basado en la experiencia de otros sistemas del mismo tipo


Hacemos referencia aquí a MIT BLACK JACK TEAM . Una de las tesis doctorales más laureadas del Instituto Tecnológico de Massachussets (MIT). Donde un gran académico, desarrollo un sistema probabilístico para ganar en el juego del black Jack. El cual aplico de forma practica en las Vegas EE.UU. junto a un grupo de estudiantes del mismo instituto. Su sistema fue tan poderoso que les generó ganancias por más de 2 millones de dólares. Lo importante es que este proyecto tenia exactamente la misma curva de comportamiento que el nuestro (en su caso, probabilidad de acierto Vs cantidad de juegos), pero lo mejor de todo es que ellos diseñaron una estrategia para llegar al punto de inflexión en la curva, la cual les dio resultado, de allí sus grandes ganancias. En resumidas cuentas la manera de conseguir el punto de inflexión fue (y aunque suene romántico): Trabajo en Grupo. Entre mas gente conformará el grupo de trabajo mas fácil alcanzarían dicho punto.

Tratar de acoplar esta filosofía a nuestro proyecto no es difícil, ya que es lógico: Si desarrolláramos nuestro proyecto con un grupo de 30 estudiantes, les podríamos pedir a cada uno por ejemplo 200 tarjetas, al sumar y multiplicar, nuestro set empieza a tornarse evidentemente del orden de los miles, lo que nos indica que cada vez mas estaremos cercanos a l punto de inflexión.

Pero en la realidad que significa el momento en que se alcance el punto de inflexión?. Es el momento en que “tumbaremos” totalmente el algoritmo de seguridad que los ingenieros de la compañía telefónica estén usando. De ese momento en adelante la empresa estará PERDIDA y nuestro sistema contará con la capacidad de generar miles de números validos, durante el día, lo que se traducirá en millones de pesos en perdidas para ellos.

Así que de manera contundente podemos afirmar que gran porcentaje del éxito de un proyecto como este radica en algo tan simple como el trabajo en EQUIPO.

7. Conclusión


No necesitamos de manera estricta llegar al punto de inflexión (punto óptimo del sistema) para hallar números validos. Pues antes de él, la probabilidad sigue existiendo, solo que de forma mas moderada, y al aumentar paulatinamente el tamaño del set, igualmente iremos mejorando dicha probabilidad. Es tan simple como tener claro: que después de cruzar el punto de inflexión simplemente todo número que generé el sistema será valido, pero si aun no lo hemos alcanzado, debemos esforzarnos más, ya que hay gran posibilidad de que un número generado sea un falso positivo [5].

Finalmente: El sistema aplica, es realizable y ha dado buenos resultados, resultados que por cuestiones de seguridad no es debido especificar, pero que han motivado la realización de este articulo.

Bibliografía


[1]. [1] B.M del Brio, “Redes Neuronales y sistemas difusos” 2da ed. Vol 1. Ed. Zaragoza España:
Alfaomega Ra-Ma 2002.

[2]. [2] J.R Hilera “Redes Neuronales Artificiales”
Ira ed. Vol 1. Ed Madrid España:
Alfaomega Ra-Ma 2000.

[3]. [3] Tenembaum “Redes de Computadores”
Ira ed. Vol 1. EE.UU:
Pretice Hall 2001.

[4]. [4] Nilson “Inteligencia artificial”
Ira ed. Vol 1. Ed Madrid España:
Alfaomega Ra-Ma 2000.

[5]. [5] Orallo “introducción a la minería de datos”
Ira ed. Vol 1. Ed Madrid España 2004:
Pearson (Prentice Hall).

[6]. [6] Revista “Cientia et technica”
Art. Entrenamiento De Una Red Neuronal Artificial Usando El Algoritmo Simulated Annealing : Harold Isaza (UTP).



Ing. MSc. Helmer Muñoz Hernández
Ingeniero de Sistemas
Inghelmer@gmail.com

Ing. Rodrigo Garcia Hoyos
Estudiantes Ingeniero de Sistemas
rodrigogarciahoyos@gmail.com

Cristalab y Mejorando.la te traen el Curso Profesional de Node.js y Javascript. Online, avanzado, con diploma de certificación y clases en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate