Buscar este blog

viernes, diciembre 12, 2008

Privacidad, sueldos y pecados


El otro día estuve hojeando el Investigación y Ciencia de noviembre dedicado a la seguridad y la privacidad. En general no dice nada realmente nuevo sobre lo que cualquier interesado o paranoico sepa a día de hoy si se mantiene informado, sin embargo si hace un muy buen repaso al estado actual de la privacidad y señala los frentes que hay abiertos y objetivos interesantes a corto y medio plazo como son las redes sociales tipo Facebook.

Lo que realmente me llamó la atención en uno de los artículos fue un algoritmo sencillo (de los de papel y lápiz) para compartir información común sin desvelar información propia. A pesar de que juraría haber visto algo sobre el tema en libros de criptografía y seguridad en el pasado, no fue hasta ese artículo que se me ocurrió una aplicación práctica en mi entorno para este tipo de técnicas matemáticas: conocer el sueldo medio de un grupo sin que nadie tenga que revelar el propio.

La razón de este interés es que a lo largo de mi carrera como profesional he visto en varias ocasiones como el compartir la información de sueldos concretos despertaba en algunas personas envidia y codicia que a pesar de ser pocas, acababan afectando el funcionamiento del grupo de manera bastante ruin cuando descubrían que alguna persona cobraba por encima de alguien en particular. El problema a mi entender era que en algunos casos, las grandes diferencias de sueldo entre el mayor y el menor sueldo generaban pura y llana codicia sacando lo peor de algunas personas, por lo que mi posición hasta ahora al respecto, por el bien de las relaciones en el grupo, era negar información sobre mi sueldo de la manera más amable posible (aunque mi sueldo suele estar en la media por lo que veo en Infojobs y me salto la regla si conozco bien a la persona como para pensar que no va a afectarle [hola chicos :-)]) a la vez que he procurado no preguntar sobre sueldos particulares a nadie de mi entorno directo sin antes de conocerle lo suficiente (sin embargo si he preguntado un par de veces sobre sueldos medios a compañeros de otras empresas).
En fin, que en un par de ocasiones, a la hora de pedir una revisión salarial me he encontrado con la necesidad de conocer los sueldos medios de mi entorno inmediato, pero sin poder preguntar directamente sobre sueldos en mi grupo de trabajo. Y ahí es donde el algoritmo me ha encendido la bombillita al mostrar una manera de compartir en el grupo la cifra de sueldo medio sin que nadie tenga que decir lo que cobra.

Sobre el algoritmo, la revista dice lo siguiente aplicado a un problema de “conocer el peso medio de 3 personas”.

Cálculos en compañía

La evaluación segura de funciones permite que un grupo de personas calcule cualquier cosa a partir de datos privados de cada uno, sin que nadie revele sus propios datos en el proceso.

Alicia, Juan y Marta quieren calcular su peso total, sin que ninguno revele su propio peso.

Cada persona elige tres números, o "porciones", entre 0 y 1000. Dos porciones se eligen al azar y la tercera hace que el total sea igual al peso de la persona módulo 1000. Por ejemplo, Alicia, para su peso de 54 kilogramos, emplea 300, 550 y 204, que totalizan 1054.

Luego, cada uno entrega dos de sus porciones a los otros por separado.

Seguidamente, cada uno suma la porción que se quedó y las dos recibidas de los otros participantes, otra vez módulo 1000.

Y comunica el resultado a los otros dos.

Cada uno suma los tres números y así obtiene el peso total (módulo 1000), sin que ninguno pueda averiguar el peso de los otros.

Un método más complicado permite a un grupo multiplicar números privados. Sumando y multiplicando bits, podría calcular todo lo que pueda evaluar un ordenador a partir de sus datos privados. El sistema completo protege también contra quienes se apartan de las reglas.


Tras realizar en papel (que poco tecnológico me estoy volviendo) la comprobación de que el algoritmo expuesto funciona también con 4 “jugadores” intentaré probarlo en mi último grupo de trabajo a ver que tal respuesta hay, pero estoy seguro de que este algoritmo le puede ser útil a muchas otras personas. Lo único que me gustaría aclarar es que a mayor número de implicados, más pesado se vuelve el intercambio de porciones, al tener que usar tantas porciones como personas implicadas, pero con números pequeños (5-8) debería ser muy manejable.

Se puede acceder a un interfaz básico que he programado en ASP.NET con VB.NET para realizar los cálculos de porciones individuales para un número de entre 3 y 99 jugadores en mi sitio web Aneode pero como ya he dicho antes, el cálculo se puede hacer a mano. En cualquier caso, recordemos que cada jugador, solo debe conocer una de nuestras porciones, nunca varias, y una de nuestras porciones queda en secreto para el resto de jugadores. Ah y si alguien no sabe de que va lo de módulo 1000, no es más que restar mil a cualquier número que haya resultado superior a mil (1236 pasaría a ser 236). Después solo quedaría realizar la suma final de los totales individuales y dividir entre el número de jugadores para obtener el sueldo medio del grupo.

De todos modos aunque este método debería eliminar envidias y suspicacias, no va a detener a alguien codicioso que vea que está demasiado cerca del salario medio aunque sea por encima y tampoco va a eliminar a alguien envidioso con algún toque de paranoia que podría acabar mirando a todo el mundo como posible sospechosos, pero aun así debería ser de utilidad al mantener en secreto las cifras individuales. Adicionalmente se me ha ocurrido que el sistema podría fallar parcialmente (por el lado humano claro) si se realizan ciertas cosas como por ejemplo:
Si en un grupo de 3 personas dos comparten su cifra salarial, el tercero queda al descubierto al poder usarse el dato medio, más las dos cifras de los chivatos. Esto debería ser también así para grupos más grandes con un mayor número de chivatos.
Si un grupo de N personas realiza el cálculo y más adelante llega un nuevo jugador con el que se repiten los cálculos, se puede obtener la cifra del nuevo jugador de manera muy simple. Es decir que si un equipo de 10 jugadores hace el cálculo y se repite el cálculo con 11, los 10 jugadores iniciales, pueden calcular la cifra individual del nuevo jugador.
De lo anterior supongo que puede deducirse que si dentro de un grupo, con el cálculo realizado, un subgrupo empieza a recalcular las cifras dejando al margen un jugador cada vez, podrá ir obteniendo cifras individuales tranquilamente.
Así que debo aconsejar que si alguien quiere usar el algoritmo, debiera hacerlo solo en grupos de más de 3 personas, y advertir a nuevos jugadores del sueldo medio inicial y el problema de seguridad que supone el recalcular cifras, ya que es fácil dar al traste con la privacidad si no cuidamos esos detalles.

Y en principio no veo más problemas asociados a esta versión del algoritmo. Habrá que ver si la versión completa que menciona el artículo contiene mejoras que permitan privacidad extra incluso en caso de “traición”, pero eso sería motivo de otro post…

Así que eso es todo. Si alguien se anima a usarlo, quiere señalar debilidades adicionales, errores míos o aplicaciones prácticas alternativas, queda invitado a comentar al respecto.

Nota: La imágen ha sido obtenida de Yerusha.

No hay comentarios: