Espero que os apetezca repasar un poco de nuestra historia reciente, quiero decir de nuestra joven democracia. Como pasa siempre en nuestra amada patria, hay una mezcla de buenas intenciones, algunos chorizos, una bota de vino y una hermosa boina.
Ahora ya hemos incorporado a nuestra vida cotidiana el omnipresente Número de Identificación Fiscal, que es en realidad una letra mayúscula pegada al antiguo DNI. La aparición de este documento a finales de los 80, durante el gobierno socialista, obedeció a un loable -aunque débil- intento de poner coto al fraude fiscal, especialmente a la famosa Prima Única que resultaba totalmente opaca al fisco.
La implantación del NIF tuvo una fuerte oposición por parte de la derecha, que invocaba el derecho a la intimidad para evitar un mayor control sobre las operaciones financieras dudosas. Por cierto, el adjetivo “dudoso” me recuerda un chiste que me contó mi padre: Un caballero intenta entrar en un club con una señorita algo descocada. El portero se lo impide: “Señor, no está permitida la entrada a señoritas dudosas”, y entonces la aludida contesta: “Yo no soy dudosa, yo soy puta. Las dudosas son las que están dentro”...
Hay un brillante artículo de José Borrell, que entonces era secretario de Estado de Hacienda, donde refuta los argumentos de la derecha. Extraigo algunos párrafos:
Cada vez que la Administración tributaria solicite información con trascendencia tributaria, se levantará de nuevo la bandera de la defensa de la intimidad, venga o no venga a cuento, hasta que medie una decisión judicial que interprete la ley, por muy clara que ésta esté redactada. Pero cuando el NIF esté adecuadamente implantado será más difícil que subsistan los tres millones de cuentas corrientes bancarias cuyo titular no puede ser identificado por Hacienda. O que haya miles de titulares de activos financieros, como las famosas primas únicas, que todavía no sabemos quiénes son porque su DNI era incorrecto o simplemente no ha sido comunicado.
Ahí es, quizá, donde duele. Los que se han resistido a que esta información pudiera utilizarse para construir un sistema tributario realmente equitativo no pueden ver con buenos ojos que se implanten mecanismos para usarla de forma eficiente.
Y luego están, claro está, los que se refugian en las referencias tópicas a Orwell y el fantasma del Gran Hermano. Es sorprendente la cantidad de lectores de Orwell que hay en este país. Aunque, a juzgar por lo que algunos escriben, no parece que entendieran gran cosa, si es que alguna vez lo leyeron de verdad.
Para ver con algo de detalle la cronología de la implantación del NIF, basta con entrar el la página de El País, y escribir “Número de identificación fiscal” (sin las comillas), en la ventana de buscar contenido.
En resumen, el problema consistía en que algunos desaprensivos daban un número de DNI “erróneo” o sencillamente falso cuando hacían ciertos depósitos o manejaban ciertas cuentas, y luego no había manera de imputarles los correspondientes gravámenes fiscales. Al tener que añadir la letrita, Hacienda podía detectar los falsos DNI.
Y ahora viene la parte chusca de la historia. Hacienda podría haber comunicado el algoritmo a los bancos para que pudieran validar adecuadamente los NIFs de sus clientes. Pero con la ingenuidad propia de un niño, decidió mantener el algoritmo en secreto para evitar que los evasores se inventaran falsos códigos NIF con la misma alegría con la que antes se inventaban los falsos DNI. Incluso hubo alguna jactancia por parte de algún alto cargo, acerca de que nadie podría descubrirlo. Yo no echaría del todo la culpa de esa burricie a los políticos, qué iban a saber de eso los pobres, sino a alguna persona con cierta preparación técnica -es un decir- quien les propuso un código “irrompible”. Esta persona debió pensar que la operación numérica secreta, junto con la arbitraria ordenación de las letras -mecachis, casi destripo el problema-, bastaban para conseguir lo que los alemanes no consiguieron con Enigma, pobretico mío. Me inclino a pensar que era un hombre, porque en esa epoca había pocas mujeres en el mundillo, y porque ellas suelen ser más precavidas. Y uno se pregunta, ¿cuál era el nivel de conocimientos criptográficos en el mundo por aquellas fechas? ¿No había nadie en España que estuviera preparado, no ya para intentar una codificación irrompible, sino para aconsejar, al menos, que el algoritmo se hiciera público? Espero que el culpable de ese desastre no se halle entre los lectores/colaboradores de Kriptópolis. Creo que la página no existía por aquellas fechas, de lo contrario hubiera habido más cultura criptográfica social, y quizá la chapuza no se hubiera producido.
No recuerdo el tiempo que duró el secreto, pero creo que a los pocos meses ¿o fueron semanas?, el misterio estaba desvelado. Tampoco sabemos quién rompió el código, pero cabe sospechar de los bancos, que disponían de millones de códigos NIF para averiguar el truco. Ignoraremos siempre el nombre del culpable, y si fue despedido, expedientado, amonestado o, al menos, ridiculizado en la cantina del ministerio, delante de todo el mundo.
Y por último, os propongo un ejercicio. Vaya por delante que no tengo ni idea de cómo resolverlo: Se trata de reproducir el ataque para romper el código NIF. Lamentablemente muchos ya conocéis el algoritmo; pero podríais intentar no recordarlo -y, desde luego, no buscarlo en la Red-, y diseñar un método para resolverlo, disponiendo de un gran número de NIFs aleatorios que pongo en este fichero. En realidad se trata de los de mis amigos de las redes sociales, pero no se lo digáis a nadie.
Una vez conseguido, podréis comprobar alguna de sus propiedades, como por ejemplo:
a) Dos NIF distintos no pueden diferir solamente en un dígito.
b) Si en un NIF permutamos dos cifras obtenemos un NIF incorrecto
c) Se puede recuperar un dígito perdido, conociendo todos los demás y la letra.
Todo esto ya es material escolar. Hay que ver como avanzan los tiempos: (http://www.educarm.es/templates/portal/images/ficheros/etapasEducativas/...)
Os dije que propondría un pequeño reto; pero os engañé. En realidad son dos. Como me temo que muchos no habréis podido no recordar lo que ya sabíais del algoritmo del NIF, os propongo otro código NIFA, éste de mi invención, para los mismos DNIs, a ver si podéis hincarle el diente. Y de paso a ver si alguien puede comprobar si posee, al menos, las mismas propiedades que el oficial, que con las prisas no me ha dado tiempo. Como pista os diré que no he cambiado la lista de las letras de marras, sino que sólo he modificado un poco el cálculo numérico. Abrigo, no obstante, la esperanza de que resulte irrompible -la ingenuidad de los viejos se parece a la de los niños-, Si así, fuera, Hacienda podría contratarme con un buen sueldo para atacar sin piedad, esta vez sí, a los desalmados evasores fiscales. Ay, no, que ahora no toca.
Un cordial saludo
Agustín
Ataque al código NIF
Agustín15 Abril 2012 - 12:30am
(Reedición)
Como os veo un poco remisos, y en el primer reto soy tan atacante como cualquiera de vosotros, aparte de que es un falso reto, porque ya conocemos su secreto, os voy a contar mi método. Es tan fácil que da risa.
1. Lo primero es determinar cuántas letras aparecen. No recuerdo si fue explícito por parte de Hacienda que no aparecían las letras I, Ñ, L, O; pero en todo caso, con una buena base de datos de NIFs -como la que tenéis- se puede determinar que sólo son 23 letras. Subproblema teórico: ¿Cuántos NIFs harían falta para estar seguros al 99,99% de que sólo son 23 letras?
2. Si ya sabemos que sólo aparecen 23 letras: ABCDEFGHJKMNPQRSTUVWXYZ, es obvio que debe haber involucrada una operación módulo 23
3. El módulo 23 se aplicará a algún número que será el resultado la manipulación de los dígitos del DNI. Cabe un número indefinido de posibilidades, con diferente grado de complejidad, como:
4. La tarea más ardua, a falta del conocimiento que ya tenemos, sería ir probando esas posibles fórmulas; pero lo más aconsejable es empezar por las más sencillas.
Si realmente intentaban obtener una codificación segura, deberían haber complicado algo más el cálculo de N, pero optaron por lo más simple, es decir, tomar el propio valor del número del DNI,
Así que es probable que los atacantes se toparan con la solución muy pronto.
5. Imaginemos que estamos probando la fórmula N = DNI. Entonces se toma un nif, se extrae el número del DNI, y se realiza la operación
6. Se asigna el valor obtenido a la letra. Por ejemplo, si nos sale R = 8 y la letra es la P, podemos establecer provisionalmente que la P es la letra número 8, contando desde el 0.
7. Se buscan otros NIFs con la misma letra, y se aplica la operación modulo 23 a su DNI. Si se obtiene en todos los casos el mismo resultado, es decir, si en todos los NIFs con la letra P, el módulo 23 del DNI vale 8, es que la fórmula para el cálculo de N es correcta, y ya hemos terminado el ataque.
8. A partir de ahí solo hay que asignar a cada letra el valor de la operación modulo 23 aplicada al número del DNI que la acompaña. Así se obtiene la lista secreta:
******************************************************************************************
Comentario:
Con un algoritmo público, no habría ningún problema en que la lista de letras tuviera una ordenación normal, es decir:
Es muy triste.
******************************************************************************************
Esto os podrá servir de base para diseñar el ataque al código NIFA. Os recuerdo que las letras son las mismas y en el mismo orden. Sólo falta hallar la fórmula para el cálculo de N. Ánimo
La verdad es que el algoritmo
sqrmatrix15 Abril 2012 - 11:21am
La verdad es que el algoritmo del NIF es muy pobre. Quien lo diseñara no tendría mucha idea de criptoanálisis. Por otro lado, si elegimos una letra al azar, hay una probabilidad entre 23 de acertar, lo cual, para el problema que se intenta resolver, es una probabilidad muy alta. Debería haberse generado un código más largo. Un simple hash criptográfincamente seguro, no público (o uno público adecuadamente modificado), hubiera retrasado mucho más la determinación del algoritmo. Probablemente hubiera sido imposible obtener el algoritmo a partir de los NIFs solamente. Creo que sólo se hubiera determinado si se hubiera filtrado.
Y lo peor es que, conociendo cómo funcionan las cosas en este país, seguramente se pagó una millonada por ese algoritmo (espero equivocarme).
Lástima
Agustín15 Abril 2012 - 1:53pm
Qué lástima no haberlo sabido. Nosotros lo hubiéramos hecho por la mitad.
"La letra"
igor2113 Abril 2012 - 5:40pm
Este post me ha recordado una anécdota muy relacionada. Resultó que se me fue pasando el tiempo para sacarme la tarjetita azul. Un día fui al banco a hacer una transacción y me dijeron que sin ella no podían hacerla. Tenía una pequña empresa con otros dos socios y debíamos cobrar un contrato importante. Deseperado fuí a hacerme la tarjeta NIF pero resultó que tenía el DNI caducado. Fui a renovarlo pero me dijeron que como había pasado la fecha nosecuantos debía presentar partida de nacimiento autentificada para DNIs. Cuando volví con la dichosa partida tras una mañana de pie en el registro, fui tan tonto de decir que el nombre de la calle en que vivía había cambiado con lo que la matrona que atendía –hija y esposa de policías con toda probabilidad- me reclamó el padrón municipal y casi me manda detener cuando sugerí que mantuviera el nombre antiguo.
Desesperado, fui al banco a suplicar de rodillas que aceptaran la transferencia con mi compromiso de conseguir el NIF al dia siguiente. El empleado del banco me pidió el DNI (caducado), hizo unos cálculos y me dijo “la P, ponga la P al final del número”. Y hasta hoy. Jamás me saqué la tarjeta azul. Cada vez que me la pedían decía cualquier excusa y después decía “la letra es la P”. La verdad es que no estuve tranquilo hasta que al renovarme el DNI vi que era en efecto la P porque a ratos tenía la sospecha que el del banco se lo había inventado y al final alguien se daría cuenta.
Muy interesante
Agustín13 Abril 2012 - 9:32pm
Es una anécdota muy interesante, aunque no tengo duda de que tú lo pasaste fatal en el laberinto español. Lo que cuentas muestra que los bancos ya conocían el procedimiento para obtener la letra, cuando aún se consideraba un secreto. ¿Observaste si el empleado hizo los cálculos a mano? Porque en aquellos resecos días los bancarios no solían disponer de un ordendor personal, y a día de hoy, las calculadoras sencillas aún carecen la la operación "resto". El cálculo a mano es costoso en tiempo de mano de obra, e inseguro, y tampoco creo que les hubieran dotado de calculadoras científicas, demasiado caras. Creo que les habrían explicado el procedimiento semiautomático para hacerlo con una calculata de cuatro perras:
1. Dividir el número del DNI por 23
2. Si da un resultado entero, asignar la letra cero de la lista adjunta.
En caso contrario:
4. Se toma la parte entera del resultado (esta parte es la más peligrosa, si hay que escribir el número entero a mano, por la posibilidad de error)
5. Multiplicar el valor anterior por 23
6. Restar el valor del número del DNI del resultado anterior
7. Asignar la letra de la lista correspondiente al resultado, haciendo caso omiso del signo.
Lo deberían tener escrito en una cartulina dentro del cajón, para los casos especiales, como el tuyo.
La pregunta sigue en el aire: ¿Cómo descubrieron el método? ¿Eh?, ¿Eh?
Desde luego esto no se puede comparar a la serie Enigma de Román Ceano, pero tiene el interés de que lo hemos vivido personalmente.
No recuerdo
igor2113 Abril 2012 - 10:18pm
No tengo un recuerdo exacto de como lo hizo pero fue algo super-simple. Yo entendí que la letra era una especie de checksum y que saberla no me excusaba para nada de obtener la tarjeta. De hecho el empleado no me dijo que ya no hiciera falta. Pero como tenía mucho trabajo y en aquella época los tramites no eran como ahora sino que cualquier cosa era una mañana de colas, broncas y empujones para que te atendiera un tarado franquista que más que pedirte documentos te desafiaba a ver si los tenías todos y si los tenías se decepcionaba, lo fui dejando y al ver que colaba cada vez más facilmente me fui animando hasta que al pasar los años lo pusieron en el DNI y se olvidaron las tarjetas azules. El día que tuve en la mano el DNI con letra confieso que senti una gran alegría porque hasta ese momento me sentía como los de la Gran Evasión y cada vez que hacía un tramite en el banco o en hacienda notaba mariposas en la barriga porque me pillaran sin la tarjeta.
Cazurrismo computacional
Agustín13 Abril 2012 - 4:00pm
He estado pensando, aunque en la clínica me lo tienen prohibido, y he llegado a la conclusión de que el ataque es extremadamente sencillo, aunque uno no puede olvidarse de lo que ya sabe, claro. Ahora sí que me gustaría saber cuánto tardaron los bancos -o quien fuera- en descubrirlo, porque eso será otra medida del cazurrismo computacional de la España de la época, y esta vez no me refiero al Gobierno.
De momento no pienso decir ni pío hasta que lo haya intentado alguien más.
Fué más importante para las personas jurídicas
alphp13 Abril 2012 - 2:59pm
Ya que posibilitaba utilizar automatizar de manera más fácil los mecanismos de control de empresas y otro tipo de sociedades que no tenían dni.
Además los NIF de las empresas no siguen el mismo patron que los de las personas físicas, ya que no tienen DNI. Lo más importante es que con el NIF toda persona (física o jurídica) tenía el mismo documento con obligación de declararlo en cada operación... ese era el quid de la cuestión y la razón por la que la derecha argumentara la defensa de la intimidad... lo cual no deja de ser una tontería para el ciudadano común, pues las pequeñas operaciones siempre es posible y relativamente cómodo hacerlas en efectivo, pero suena muy mal que retires del banco 100 millones para golosinas ;D
Seguridad por oscuridad
Agustín13 Abril 2012 - 2:40pm
Desde luego, no se trata de un reto ortodoxo, en el que el algoritmo sea conocido, pero es lo que hubo in illo tempore, y tengo curiosidad por saber cómo se descifró.
Por otra parte, la idea de mantener el secreto, por más fuerte que hubiera sido el código, era completamente onírica. ¿Quién manejaría los datos? ¿Quién tendría acceso al programa codificador? ¿Habría en el ministerio una habitación cerrada con el secreto a la que sólo podrían acceder unos cuantos iniciados? ¿Cuántos y quiénes? ¿Deberían los informáticos que manejaran los programas hacer algún tipo de juramento de confidencialidad?
Queda muy cutre, lo sé. Da vergüenza y gana de llorar.
AVISO IMPORTANTE
Si alguien quiere intentar el segundo reto (el de los códigos NIFA), sepa que acabo de actualizar el fichero. El de los NIFs no ha sufrido cambio alguno.
Leyenda urbana
pamplina13 Abril 2012 - 1:45pm
Nunca había pensado que la idea de todo eso fuera mantener el algoritmo en secreto. Vaya lumbreras...
Por aquel entonces se rumoreaba que se habían dado cuenta de que en España existían personas con el número de DNI duplicado (que no me extrañaría) y por eso era la idea de poner una letra adicional. Sin embargo, viendo el algoritmo es evidente que no era esa la razón.
Pensandolo bien, todas aquellas colas para sacarse la tarjetita de cartón con tu NIF no servían absolutamente para nada. Patético. Todavía a veces encuentro por algún cajón la mía, jeje
Sí servían
Agustín13 Abril 2012 - 3:44pm
Sí que servían, porque sin la tarjetita azul no podías hacer trámites en bancos, ni notarías, etc. En realidad el NIF cumplió, al menos en parte, su función. La cuestión es que para ello no era necesario que fuera secreto. Por otra parte, el ridículo que supone el fallido secretismo no fue percibido tan claramente por una sociedad que no entendía un palote de seguridad ni de cifrados. De hecho, salvo el comentario de algún profesional, no he podido encontrar ningún eco del escándalo.
Curioso
sqrmatrix13 Abril 2012 - 12:17pm
Me parece interesante tu reto (y el artículo, por supuesto). Le echaré un ojo, aunque no sé si conseguiré algo. Lo mío es más descifrar con algoritmo conocido.
Yo me encontré con el algoritmo del NIF por casualidad, navegando por Internet. Entré en la página de un banco, no recuerdo por qué ni para qué, y ví que pedían el NIF, y se me ocurrió echarle un vistazo al código fuente del documento, a ver si venía la forma de calcularlo, y me encontré con la sorpresa de que sí. Estaba en una función de JavaScript, y ahí lo tengo.
Hasta ahora no tenía ni idea de para qué servía la letra del NIF. Y cuando encontré el algoritmo del NIF, al ver que lo utilizaba un banco, pensaba que era un algoritmo público.
De todas formas, por muy seguro que sea el cálculo de la letrita de marras, una vez conocido el algoritmo, siempre se puede falsificar, con lo cual el sistema tiene una vida limitada. Deberían buscar otro sistema de identificación mejor. Y para evitar la falsificación, los bancos deberían poder verificar el NIF, con lo cual, o bien disponen ellos del algoritmo, o tienen que comunicar el NIF al organismo correspondiente que les indique que el NIF es correcto.
Basta con el DNI
Agustín13 Abril 2012 - 2:50pm
Para hacer operaciones bancarias había que presentar la tarjetita con el código NIF que se entregó a cada ciudadano. Hoy basta con presentar el Documento Nacional de Identidad que lleva la letrita incorporada. Se puede falsificar el doumento, claro, al igual que los billetes, pero eso ya es otro problema.
Intentar que los bancos ignoraran el algoritmo fue algo tremendo. País.
Muchas gracias
admin12 Abril 2012 - 10:33pm
Excelente artículo, Agustín.
Muy amable
Agustín12 Abril 2012 - 10:49pm
Gracias a ti.