Mostrando entradas con la etiqueta codificación. Mostrar todas las entradas
Mostrando entradas con la etiqueta codificación. Mostrar todas las entradas

viernes, 24 de agosto de 2018

¿Cómo soluciono los errores de codificación de caracteres en archivos de texto en Ubuntu?

¡Trabajadores!

En su constante evolución, el hombre ha pasado distintos estadíos. Primero en las cavernas, luego en tribus, para finalmente conformar políticamente clanes, ciudades estado, reinos, y naciones. Sin embargo, esta evolución social y política no hubiese sido posible sin el consecuente avance del lenguaje y la escritura, que la cimentó y posibilitó las instituciones de avanzada que rigen el devenir de la historia.


En la misma tenida histórica, nuestros antepasados se han valido de lenguajes formados por convenciones sociales, de forma hablada. Luego se utilizaron pictogramas en las cavernas, y finalmente se transitó al jeroglífico e ideogramas. Desde los tiempos de Nabucodonosor a esta parte, nos hemos valido de lenguajes escrito para conservar y transmitir las ideas. En base a ellos se crean los alfabetos de las grandes civilizaciones humanas.

No es secreto para nadie que, en la medida que existen diferencias entre las culturas que acunan a los hombres, existen diferenciaciones entre los distintos alfabetos, según los lenguajes e idiomas que utilicemos. Nosotros utilizamos el alfabeto latino, con particularidades que tiene el castellano traído a las Américas. En una serie fluida de convencionalismos, disponemos de nuestras propias reglas idiomáticas, las hacemos nuestras y son nuestro medio de expresión.
Pues bien, si a esto lo llevamos a la telemática, nos encontraremos con la necesidad de representar numéricamente  en la computadora (de forma binaria) varias decenas de caracteres para almacenar la información. Esta debe ser comprendida no sólo por el sistema informático, sino por todos los demás sistemas informáticos con los que deseemos intercomunicarnos; estamos - entonces - en la era de la información. Adicionalmente no podemos ser eurocéntricos: hemos de poder dar lugar también a centenas o miles de caracteres, según usemos alfabetos latinos, cirílicos, asiáticos, semitas, del valle del indo, etc; de todo hay en la viña del Xeñor...

El Movimiento Justicialista entiende esta panoplia necesaria para comunicarnos con todos los hombres de buena voluntad de la Tierra, pero esto no fue obvio para quienes - a través de su  pernicioso imperialismo cultural - intentan sojuzgar a los Pueblos. Ellos dieron en iniciar las convenciones para convertir información binarias a caracteres en base al alfabeto latino limitado que emplean los anglosajones. Esto es particularmente triste pues el inglés se trata de uno de los idiomas más simplones y que requiere menos caracteres, y que se presenta especialmente ilimitado para el resto de los ricos idiomas del mundo (el castellano entre ellos).

Esto obligó - con el correr de pocos años - a especificar distintas convenciones informáticas que extendieran la cantidad de caracteres y símbolos posibles de reproducir por un sistema computado. Estos múltiples estándares de codificación son bastante compatibles entre sí, pero no lo son completamente, y en ciertos casos pueden provocar discrepancias en la representación de un texto codificado con un formato antiguo o distinto a los actuales.

En GNU con Linux, este tipo de errores se da cuando transferimos archivos de texto originados en sistemas diferentes, específicamente cuando se emplean codificaciones de texto distintas a la UTF-8 que se usa actualmente. En otros casos puede suceder lo mismo, dependiendo de la codificación que use el sistema.

Un ejemplo suele aclararlo todo, como decía Napoleón. Si tenemos un texto codificado en el viejo estándar de M$-DO$ de los 90s, podríamos ver que al abrirlo con un editor actual, muchos caracteres del castellano los representa con errores. Por ejemplo:
Evitar este problema actualmente es simple: basta utilizar una codificación moderna, como la extendida Unicode o su variación más común, la UTF-8.  Naturalmente los editores modernos en GNU y otros sistemas actuales ya lo hacen por defecto.

Sin embargo, si el texto ya está realizado, parecería necesario el arduo trabajo de buscar y reemplazar los caracteres erróneos por los que corresponde. Afortunadamente en nuestro sistema GNU con Linux podremos convertir la codificación mediante el programa iconv.

Iconv es un pequeño conversor codificaciones para texto que opera en la consola terminal de un sistema GNU con Linux como lo es Ubuntu. Para abrir una terminal ingresamos Ctrl+Alt+T, y podremos emplear el comando.

Para que funcione debemos usar la siguiente sintaxis:

iconv -f codificación_de_origen -t conversión_destino archivo_original.txt archivo_destino.txt

Como vemos, es preciso conocer la codificación de origen del archivo de texto original y la codificación de destino que queremos darle. El problema es que las opciones de codificación son numerosísimas; en particular esta opción de iconv puede operar 588 conversiones distintas (ida y vuelta) para totalizar 1176 posibilidades. Si queremos verlas todas, podremos ingresar en nuestra terminal iconv -f y presionar la tecla Tab, y el sistema nos devolverá todas las opciones (debemos presionar la barra espaciadora para paginar la lista).

Para hacer las cosas mas sencillas os explicaré en detalle las conversiones más utilizadas, y por tanto las que cobran mas relevancia histórica.
  • US-ASCII: Es el estándar de codificación mas viejo para teletipos (télex tipo americano), y no permite acentos ni eñes, solo mayúsculas y minúsculas, junto con caracteres de comunicación y control. Esta prácticamente no requiere conversión, pues no presenta caracteres especiales.
  • CP437: Es la antigua codificación empleada en MS-DOS y las PC originales. Estaba limitada a la memoria ROM del hardware de video de las computadoras de los 80s que contenía el conjunto de caracteres (unas pocas docenas de ellos incluyendo caracteres gráficos. Se la usó mucho durante los 80s y 90s. No tenía mayúsculas acentuadas, diéresis ni ñ mayúsculas.
  • CP850: Codificación empleada en MS-DOS llamada "Europa Occidental", que extendía a través de un software residente en memoria del sistema operativo MS-DOS los caracteres de las plaquetas de video originales, a fin de para suplir los problemas de la anterior, con la que retenía compatibilidad. Se la llamaba "ANSI".
  • ISO-8859-1: Codificación llamada "Latin-1", europea. Es de principios de los 90s pero se extendió hasta mediados del 2000.
  • Windows-1252: Codificación empleada por Windows 95 y superiores. Es casi similar a ISO-8859-1 salvo por unos caracteres de monedas y puntuación, y encomillado. Es muy común confundir la codificación de caracteres Windows-1252 con la de ISO-8859-1. El resultado habitual era que todas las comillas y apóstrofos (producidos por las "comillas inteligentes" de Micro$oft) son reemplazadas por signos de interrogación o por cajas en sistemas operativos libres.
  • ISO-8859-15: Codificación llamada "Latin 9". Reemplaza algunos caracteres y agrega el de Euro (€), modernizando la ISO-8859-1. Sirve para todos los idiomas de Europa occidental.
  • UNICODE: también llamada UTF-16, En la medida que aumentó la memoria y capacidad gráfica de los sistemas, se propuso este conjunto de amplia estandarización, que pretende incluir todos los caracteres para intercambios multilingûes, por lo cual es preferida para evitar problemas de conversión. Incluye también miles de ideogramas asiáticos, e incluso caracteres históricos (arameo antiguo, hebreo, persas, etc). El Unicode dispone de varios ordenamientos, que varían en cuanto a la representación en bytes y orden. Esto no suele ser de gran importancia pues mayoritariamente se utiliza la codificación más simple, de Unicode, la UTF.8
    UTF-8: Codificación preferida por Linux y la mayoría de los sistemas modernos y normalmente es la recomendable.


Por lejos el caso más común es convertir entre codificaciones "viejas" de DOS o Windows a la nueva UTF-8. Si quisiéramos convertir el archivo original "razon.txt" codificado en Windows-1252 a la codificación actual UTF-8 y llamarlo "razon_corregido.txt", debemos ingresar el siguiente Comando de Organización:

iconv -f WINDOWS-1252 -t UTF-8 razon.txt > razon_corregido.txt 

Y el archivo será corregido, quedando de la siguiente manera:


Para colmo de complicaciones, existen distintos tipos de condificación para indicar la creación de una nueva línea. En archivos de texto DOS/Windows, un salto de línea, también conocido como nueva línea, es una combinación de dos caracteres: un retorno de carro (CR) seguido por un salto de línea (LF). En archivos de texto Unix, un salto de línea es solamente un carácter: el salto de línea (LF). En archivos de texto Mac, antes de Mac OS X, un salto de línea era sólo un carácter retorno de carro (CR). Actualmente, Mac OS usa el estilo Unix de saltos de línea (LF).

Esto hace que los archivos de DOS/Windows antiguos aparezcan con líneas "cortadas". Para este tipo de archivos no alcanza con convertir la codificación, y por ello existe un programa específico que se encarga de todo. Se trata del paquete dos2unix, que consta de dos programas, el mismo dos2unix y el conversor contrario, unix2dos. Ambos forman parte del primero y los instalamos con el siguiente comando de organización:

sudo apt-get install dos2unix

Para hacer la conversión usamos:

dos2unix parámetros -n archivo_original.txt archivo_destino.txt

...si necesitamos realizar el paso inverso, podremos usar:

unix2dos parámetros -n archivo_original.txt archivo_destino.txt

Los parámetros son:

-ascii: Sólo convierte los saltos de línea.
-iso: Convierte con ISO-8859-1
-1252: Convierte usando la codificacin Windows-1252
-437: Convierte usando la codificación CP437
-850: Convierte usando la codificación CP850 europea.
-7: Convierte usando la codificación de 7 bits (desde 1982 se usa de 8 bits, esta se usa para archivos de teletipo o codificaciones muy antiguas).
-i: muestra información sobre la coficación del archivo indicado.

lunes, 28 de diciembre de 2015

¿Cómo puedo encriptar archivos y mensajes de manera simple?

En una serie de exposiciones en el Círculo de Oficiales durante la primera semana de mayo de 1944, Juan Perón expone la necesidad de contar con un sistema de cifrado para los mensajes tácticos y estratégicos de la lucha, y dicta cómo realizar dicho cifrado táctico en Ubuntu.


¡Camaradas de armas!

Una oligarquía cipaya y vendepatria no ha hecho mas que encaramarse espuriamente en el poder, lo que nos llamó a aunar esfuerzos para combatirla. Para ello, hubimos de emplear todas las herramientas puestas a nuestra disposición.

Nuestras consignas son públicas y sabidas por todos. Sin embargo, nuestra acción de conducción ha de prevenir ciertos esquemas que podrían ser perjudiciales para la Acción de Masas que hemos de emprender.

Esto es así porque en conducción de la acción, ha de lograrse la condición potenciadora requerida para toda victoria, la condición de la sorpresa en tiempo y en terreno.

La sorpresa se plantea a nivel táctico, pero se decide a nivel estratégico. Es por ello que debemos plantearnos necesariamente un accionar sorpresivo en la mayor cantidad de niveles de la acción política si es que queremos vencer. Quien no tenga la sorpresa, será siempre derrotado o sufrirá un desgaste tal en su accionar que poco provecho obtendrá de lo que gane. Esto, que se conoce desde los tiempos de Aníbal, ha de repercutir hoy con mucho más fuerza que nunca.

Señores, a nivel táctico habremos de dar apreciaciones, analizar factibilidades de lugar, plantear acciones de conjunto y desarrollarlas de manera que hagan trastabillar a un enemigo que se cree seguro en pos de nuestro objetivo final. Es lo que se dice, planear con inteligencia. Para ello, hemos de estar mas seguros que el enemigo, aplomados en una organización embuida en defensiva u ofensiva según lo determine la estrategia que habremos de emplear.

Ahora bien, todo accionar político que se precie debe estar profundamente estudiado, y ese planeamiento a nivel táctico - que muchas veces es inmediato - debe sufrir un requerimiento indispensable: debe comunicarse exitosamente entre todos los elementos de cuadros. Y es esta comunicación la que proveerá el camino de la sorpresa. Un enemigo hábil en el dominio del terreno que pisa dificultará sin lugar a dudas la comunicación de los elementos de lucha a los que habrá de enfrentar. Por ello, los compañeros han de saber organizar un buen sistema de cifrado que permita gran agilidad y facilidad para lograr el secreto y la sorpresa, para todo estamento de la acción que hemos de realizar.

Un ejemplo suele aclararlo todo, como decía Napoleón.


En la guerra, los alemanes intentaron un dispositivo electromecánico llamado Enigma, que hacía las veces de codificador simétrico a través de permutaciones alfanuméricas cíclicas por medio de unos cilindros con piñones dotados de letras (los cuales a su vez debían disponerse según un código convencional militar). Estos dispositivos suelen tener un gran inconveniente: requieren gran potencia de cálculo para romper el código por medio de criptoanálisis o por medio de un ataque de fuerza bruta, pero siempre será posible hacerlo. Incluso con los primeros equipos computacionales modernos. La solución es imponer un cifrado computacionalmente tan complejo, que ahuyente la practicidad de intentar romperlo por medio de fuerza bruta de cálculo.

Vean señores, siempre es mejor un bruto que un malo. He visto brutos que se han vuelto buenos. Pero no he visto un malo que se haya vuelto bueno.

Por tanto, las encriptaciones modernas y prácticas han de ser de mayor complejidad para evitar a los brutos de la fuerza... Esto requiere que el código no sea una mera conversión a binario, sino que emplee una Clave Secreta específica para realizar (por medio de distintos algoritmos) la encriptación necesaria. Normalmente esto se logra a través de fórmulas de números compejos y primos grandes mutuamente recursivas.

 Este sistema es el de "encriptación simétrica por frase de paso", aunque también podríamos entenderla como "encriptación simple por contraseña", pueden emplearse en el nivel táctico en la acción que deseamos llevar a cabo, y ello es lo que enseñaré.

Ubuntu cuenta para estos menesteres con una excelente serie de herramientas, llamada GnuPG, o "Guardia de Privacidad". Este herramental consiste en una serie de funciones de seguridad para la Consola o integrada a nuestro escritorio gráfico, que permiten una comunicación electrónica y encriptación de archivos de variable complejidad, y nos aseguran ello a través de esquemas simples o los más complejos. También incluye funcionalidades avanzadas para protección de contraseñas.

Analicemos su uso práctico en un ejemplo simple y empleo táctico, pues ella es la mejor manera de aprender.

Supongamos que contamos con un archivo de texto con órdenes e instrucciones tácticas en formato ASCII (o sea, sin formato, texto plano) llamado resistencia.txt del que deseamos crear una copia cifrada para que sólo puedan leerlo quienes dispongan de la clave necesaria. Para ello usamos:

gpg -c resistencia.txt

Si es la primera vez que utilizamos nuestras herramientas GnuPG, el sistema nos devolverá algo como:

gpg: anillo «/home/usuario/.gnupg/secring.gpg» creado
gpg: datos cifrados CAST5
gpg: cifrado con 1 frase contraseña
gpg: AVISO: la integridad del mensaje no está protegida



Si estamos en modo gráfico, GnuPG arrancará un agente que nos solicitará contraseña (el sistema bloqueará otros programas en ejecución hasta que introduzcamos la contraseña para evitar filtrados):

Si cancelaramos el agente gráfico, o si estuviésemos en la Consola terminal, el sistema nos indicará:

Introduzca frase contraseña:
Repita frase contraseña:

Como ya es clásico en GNU con Linux, hemos de introducir una contraseña "a ciegas" y repetirla a fin de certificar que no existan errores de tipeo. Podremos utilizar caracteres alfanuméricos, y la clave es sensible a mayúsculas, por lo cual que las mismas también pueden utilizarse. Como en toda clave simple, cuanto mayor sea su longitud y menos palabras de diccionario utilice, mucha mayor será su seguridad relativa.

Conforme pongamos dos veces la misma contraseña, el sistema la utilizará el algoritmo de cifrado CAST5 y creará un nuevo archivo llamado resitencia.txt.gpg. El archivo .asc original todavía estará a mano, y podríamos triturarlo con el comando shred y luego borrarlo con el comando rm si deseamos solo conservar la versión cifrada.

Si deseáramos comprobar el encriptado, podríamos utilizar el comando cat para ver el contenido del archivo cifrado. Por ejemplo:

cat resistencia.txt.gpg

...pero ello no servirá de nada, pues lo que veamos será totalmente ininteligible.


Para descifrar el archivo, empleamos el comando:

gpg resistencia.txt.gpg

gpg: datos cifrados CAST5
gpg: cifrado con 1 frase contraseña

Introduzca la contraseña:
gpg: AVISO: la integridad del mensaje no está protegida


Al introducir la contraseña provista anteriormente, se descifrará el archivo .gpg y hará una copia del archivo original (tengamos en cuenta que si no la hubiésemos eliminado, naturalmente nos solicitará permiso para sobreescribirla).

Hemos de tener en cuenta que como nos informa el sistema, la integridad de este archivo .gpg no está garantizada. La codificación CAST5 es bastante potente para un esquema simple de transmisión de archivos a través de medios tácticos no telemáticos (o sea, sin transmisión en redes abiertas como Internet). Aunque por sí sola no impide que el archivo sea modificado/arruinado por un tercero durante su viaje a través de diferentes servidores, ni garantiza su autenticidad (no posee firma digital). Aún así, puede ser adecuado para codificar un archivo de forma fácil, para introducirlo en un medio de almacenamiento seguro, etc.

El problema de este esquema para la transmisión, es que ambas partes (remitente y receptor) deben estar de acuerdo en una única clave. Lograr esto en todas las condiciones tácticas no es problema, pero a nivel estratégico es una invitación al desastre. Convenir una clave entre dos que están al lado es fácil, el problema radica en transmitírsela a un tipo que no conocemos por medio de medios telemáticos que no dominamos ni podemos certificar en toda su extensión, o que para peor, están dominados por el enemigo.

Por ello, el tipo de cifrado expuesto sólo puede servir para cifrar documentos  locales de tipo táctico, material que revista importancia pero que no requiera transmitirse normalmente.

La transmisión de documentos cifrados a nivel estratégico necesita indudablemente un esquema más avanzado de seguridad. Este esquema más complejo para transmitir nos llevará a proponer pares de Claves Públicas y Privadas codificadas, sistema en el que nos extenderemos a continuación.