
Camilo Gutierrez señala que la criptografía se enfoca en estudiar los métodos para lograr que un mensaje no pueda ser leído por un tercero sin autorización, es decir, para garantizar la confidencialidad de la información. De esta área de estudio surgen los conceptos cifrar y codificar, que, aunque persiguen el mismo objetivo (hacer que cierta información carezca de sentido para terceros ajenos a la comunicación), no son lo mismo.
El cifrado de información se basa en la aplicación de un algoritmo que suele utilizar una clave que transforma la estructura y composición de lo que se pretende proteger, de tal manera que si es interceptada por un tercero no la pueda entender.
Por otro lado, la codificación es el proceso de transformar un tipo de información en otra, sin perder nada de información en esta transformación. Para saber qué significa el mensaje codificado, es necesario decodificarlo y obtener el mensaje original. De esta forma, no podremos saber cuál es el mensaje si no sabemos el código.
Entonces, cuando se habla de un mensaje cifrado, tiene que ver con ocultar la información basándose en la sintaxis del mensaje, lo que significa valorar los símbolos que lo componen; en cambio, la codificación se basa en alterar la semántica del mensaje, lo que está relacionado con el significado del mensaje. Esto último es lo que Google Maps propone.
La Polilíneas, codificación en Google Maps
Las polilíneas en Google Maps se forman como un conjunto de pares de latitud y longitud, que pueden ser una o más coordenadas en el mismo string.
Google Maps Platform define un formato para codificar las polilíneas, dicho algoritmo permite almacenar una serie de coordenadas como un solo string. Este proceso de codificación convierte un valor binario en una serie de códigos para caracteres ASCII utilizando el esquema de codificación base64 , lo que significa que, para mostrar apropiadamente los caracteres, los valores codificados se les suma 63 (el caracter ´?´ en ASCII), antes de convertirlo a dicho código. El algoritmo tambien verifica codigos adicionales para un punto dado tomando en cuenta el bit menos significativo de cada grupo; si el bit esta en 1, el punto no esta completamente formado y le seguira información adicional.
Otro dato a tomar en cuenta es que, para conservar espacio en el string, los puntos (coordenadas) solo incluyen el desplazamiento desde el punto anterior (a excepción del primer punto). Todos los puntos son codificados en Base64 como numeros enteros con signo, ya que las latitudes y las longitudes contienen valores positivos y negativos.
El formato de codificación dentro de una polilínea debe representar una coordenada con precisión razonable. Dada una longitud máxima de +/- 180 grados a una precisión de 5 decimales (180.00000 a -180.00000), esto da como resultado la necesidad de un valor entero binario con signo de 32 bits.
Hay que tomar en cuenta que la barra inversa se interpreta como un caracter de escape dentro del string.
Pasos que hace Google para codificar las coordenadas:
1.- Toma un valor inicial con signo, por ejemplo:
-179.9832104
2.- Multiplica el decimal por 1e5 y redondea el resultado:
-17998321
3.- Convierte el valor del sistema decimal a sistema binario. El valor negativo debe ser calculado utilzando el sistema “complemento a dos”* al invertir el numero binario y añadir uno al resultado:
00000001 00010010 10100001 11110001
11111100 11101100 010000000000000001000000000101.
4.- Desplaza el valor binario un bit a la izquierda:
11111101 11011010 10111100 00011110
5.- Si el valor del sistema decimal original es negativo, invierte esta codificación:
00000010 00100101 01000011 11100001
6.- Divide el valor binario en fragmentos de 5 bits (a partir del lado derecho):
00001 00010 01010 10000 11111 00001
7.- Coloca los fragmentos de 5 bits en orden inverso:
00001 11111 10000 01010 00010 00001
8.- O cada valor con 0x20 si sigue otro fragmento de bits:
100001 111111 110000 101010 100010 000001
9.- Convierte cada valor a sistema decimal:
33 63 48 42 34 1
10.- Agregue 63 a cada valor:
96 126 111 105 97 64
11.- Convierte cada valor a su equivalente ASCII:
`~oia@
Ejemplo de la documentación de Google Maps Platform:
Puntos: (38.5, -120.2), (40.7, -120.95), (43.252, -126.453)
polilínea codificada: _p~iF~ps|U_ulLnnqC_mqNvxq`@
Google nos facilita este proceso con una herramienta para codificar y decodificar coordenadas, la cual la puedes encontrar aquí:
https://developers.google.com/maps/documentation/utilities/polylineutility
Esta herramienta utiliza la API de Maps JavaScript, en particular la codificación y la decodificación de rutas se controlan mediante los métodos estáticos encodePath() y decodePath en el espacio de nombres google.maps.geometry.encoding.
* Complemento a dos: del inglés Two’s complement, es una operación matemática para convertir reversiblemente un número binario positivo en un número binario negativo con un valor equivalente, pero negativo, usando el dígito binario con el mayor valor posicional, el bit mas a la izquierda en números big-endian, el bit mas a la derecha en números little-endian, para indicar si el número binario es positivo o negativo.
Fuentes consultadas
https://en.wikipedia.org/wiki/Character_encoding
https://definicion.de/codificacion/
https://developers.google.com/maps/documentation/utilities/polylinealgorithm
https://en.wikipedia.org/wiki/Two%27s_complement
interesting topics on that