Hola, aunque el hilo ya tiene sus meses lo he descubierto hoy y despues de leerlo atentamente se me han pasado algunas cosas por la cabeza:
La primera y más importante es que estamos faltos de información fiable. Deberiamos recopilar en algún sitio todos aquellos datos de los que se tuviera confirmación empírica.
La segunda es qué haría yo si fuera Nintendo (aparte de fundirme toda la pasta en vicios).
- Por supuesto usaría RSA como sistema criptográfico.
- Además establecería una clave pública individual para cada consola y mantendría una lista en mi servidor que relacionase los números de serie de todas las consola con sus claves públicas. De todas formas por lo que he leido más arriba parece ser que Nintendo ha optado por una clave pública común. Esto tiene sentido desde el punto de vista de la producción porque elimina la necesidad de pregrabar una clave privada distinta en cada consola. Se podría confirmar comparando el mismo juego bajado en dos consolas distintas. Si una parte significativa del archivo coincide entonces estamos ante una clave pública común.
- La encriptación de los juegos la haría en mi servidor y no en la consola, para evitar que alguien intercepte la clave "pública" en el momento de enviarla. El hecho de que en el server de Nintendo estén los juegos sin encriptar no prueba nada, porque en ambos casos es ahí donde deben estar, ya que cada juego encriptado varía de una consola a otra. Además nadie sabe qué datos se descargan en las partes SSL de la transmisión, así que nadie sabe si se está enviando el juego limpio o encriptado.
- Desde luego yo encriptaría todo el juego, pero según se dice en algunos mensajes anteriores parece ser que en Nintendo han optado por concatenar al juego los datos específicos de la consola, hacer un hasheo del fichero resultante y encriptar éste. No se que pruebas hay que apoyen esta teoría y tampoco se me ocurre ningun experimento para determinar si es cierta... ¿Sugerencias?
- A su vez mantendría en el servidor una base de datos donde constasen los juegos que se ha descargado cada consola y que por tanto tiene derecho a volver a descargar. (Esto creo que es bastante obvio).
- En otra base de datos DEL SERVIDOR almacenaría cuantos wii points tiene cada consola. (También muy obvio).
Según lo expuesto el proceso de compra sería tal que así:
- Un usuario introduce un código de puntos wii points en la consola, esta lo envía al servidor que actualiza la base de datos de crédito para la consola en cuestión.
- Cuando el usuario solicita descargar un juego la consola envía su número de serie. El servidor verifica en su base de datos que esa consola tiene los puntos necesarios.
- El sevidor concatena al juego sin encriptar el número de serie de la consola además de la fecha y la hora de la transacción (timestamp).
- El servidor obtiene la clave pública de la consola de su base de datos usando el número de serie de la misma. En el caso de que se use una clave pública común este paso obviamente no se realiza.
- Usando la clave pública el servidor encripta el archivo resultante (juego + nº serie + timestamp). Si se usa el sistema del hash entonces el servidor calcula el hash del archivo resultante y sólo encripta éste. Creo que es razonable suponer que en ambos casos se comprime el archivo resultante, ya esté encriptado o no.
- Se envía a la consola el archivo resultante encriptado y comprimido. En caso de que se use el sistema del hash, se envía el archivo resultante comprimido y el hash encriptado.
- Cuando el usuario lanza el juego, la consola descomprime el archivo, lo desencripta usando su clave privada y comprueba que el número de serie coincide, en cuyo caso permite cargar el juego. Si se usa el sistema del hash la consola descomprime el archivo, desencripta el hash almacenado usando su clave privada y calcula el hash del archivo descomprimido usando el mismo algoritmo que usó el servidor para calcular el hash almacenado. Si ambos coinciden (el hash almacenado y el calculado) se carga el juego. En este no es necesario comprobar el número de serie que hay almacenado en el juego, puesto que si el hash ha coincidido el numero de serie DEBE coincidir también (salvo casualidad de las que se dan una vez en toda la historia del Universo o que el algoritmo para escoger el hash esté muy muy muy mal diseñado). De todas formas estoy casi seguro de que el número sí se comprueba como medida de seguridad adicional.
Así es como yo creo que debería funcionar todo el sistema. ¿Vulnerabilidades? Pues poca cosa se me ocurre. Lo primero sería discernir si se usa clave pública común o una por cada consola y si se encripta todo el juego o sólo su hash.
Ya hace mucho que no miro cosas de criptografía pero me parece recordar que en RSA la clave pública es el producto de dos primos y la privada son los dos primos. Como factorizar un número muy grande es altamento jodido, en teoría nadie puede saber que dos primos usaste para obtener tu clave pública.
En caso de que Nintendo use una clave común a todas las consolas si alguien consigue leer la BIOS de su consola y localizar estos dos números primos, los podría usar para desencriptar un juego, sustituir el nº de serie por otro, reencriptar y finalmente copiar el archivo en la consola a la que pertenece el nº de serie nuevo, donde se daría un buen lote de jugar.
En caso de que se use el sistema del hash, al volcar la BIOS se podría saber qué algoritmo se está usando para calcularlo. A partir de ahí alguien podría calcular el hash de un juego, después sustituir su nº de serie de consola por otro y tal vez añadir bytes extras al final del archivo de tal modo que al recalcular el hash siguiese saliendo el mismo de antes. A continuación copiaría el juego en la consola a la que pertenece el nuevo nº de serie junto con el hash encriptado que tendría que obtener de la consola donde se bajó originalmente el juego (y que no le ha hecho falta desencriptar en ningún momento) y a jugar otra vez.
El problema es que para obtener el hash encriptado de la consola original habría que recurrir a algún método "técnico", porque no creo que se copie en la SD junto con el juego.
En resumen, nos vendría muy bien un volcado de la BIOS de la Wii... ¿Tal vez se podría sacar de un juego que traiga actualización? Sería dificil y casi seguro que no estaría presente la información delicada como claves RSA (si son únicas de cada consola entonces seguro que no estarán) y algoritmos HASH. De todas formas por probar no se perdería nada. La opción más realista es que alguien con equipos y conocimientos a la altura del reto destripe una consola y obtenga el tan ansiado volcado...
Saludos y que no se os indegeste el tocho