viernes, 26 de marzo de 2010

Insertar codigo funente en Blogger

En el post anterior me he encontrado con el problemilla: quería insertar un código C en blogger y no me dejaba. Solución: VIM

Los pasos que he seguido han sido estos:
[MODO FIKI]
1) Abrir con vim el documento con el código que quiero incluir en un post de Blogger ( o en una página web ).
2) Lo transformamos a HTML con VIM pulsando lo siguiente:
:TOhtml
3) Guardamos el nuevo documento en un fichero con el siguiente comando (opcional)
:w nombre_de_fichero.html
4 ) Quitamos todos los tags "br" para que no nos haga doble espaciado. Para ello escribimos[1***]:
:1,$ s/<>//g
5 ) Seleccionamos todo el documento con el comando (nótese que no se han puesto ":" al inicio )
ggVG
6) Copiamos con el comando
"+y
7) Pegamos en el lugar deseado de "Edición de HTML", en blogger.

[MODO MENOS FRIKI]
1) Abrir con GVim el documento con el código que quiero incluir en un post de Blogger ( o en una página web ).
2) Lo transformamos a HTML con GVim pulsando lo siguiente:
:TOhtml
3) Guardamos el nuevo documento en un fichero (opcional)
Archivo>Guardar
4 ) Quitamos todos los tags "br" para que no nos haga doble espaciado. Para ello escribimos:
Edición>Buscar y reemplazar
y buscamos "<>"[1***] y lo reemplazamos por "" (osea, nada. dejamos el campo vacío)
5 ) Seleccionamos todo el documento:
Editar>Select All
6) Copiamos:
Editar>Copiar
7) Pegamos en el lugar deseado de "Edición de HTML", en blogger.

[1***] Nótese que he escrito cada vez "<>". Así no está bien. Se tiene que escribir SIN espacios, ok?

Bueno! Y esto es todo por hoy! Saludos!

Pregunta: Como lo haces tú? Deja tu comentario! Gracias.

Criba de Eratóstenes

[Estoy de vacaciones.... y claro, me aburro. Lo mío es ir haciendo cositas, y ahora me encuentro con demasiadas horas por delante vacías]

Bueno, hoy quiero hablar de la Criba de Eratóstenes. Más información en su wiki. De manera resumida es algo así:
Explicación
La criba de Eratóstenes consiste en calcular los números primos menores que N. Este algoritmo es muy eficiente para calcular números primos pequeños ( menores de 10M ).
Para ello utilizaremos un vector de booleanos. Si una celda vale 1, es primo, si vale cero, no lo es. Bien. Al principio ponemos a 1 todos el vector, de modo que, en todos los números sean "primos". Ahora empezamos con el 2 ( ya que todos los números son divisibles entre 1 ). Por cada numero divisible entre 2 menor que N, lo tachamos (4, 6, 8, 10, .... ). Después hacemos lo mismo con el número 3 (6, 9 12...) . Cuando llegamos al número 4, vemos que está tachado ya que es múltiplo de 2, entonces lo ignoramos. Llegamos al 5, y tachamos todos los múltiplos de 5 menores que N. Y así... si llegamos a un número tachado, pasamos al siguiente. Si llegamos a un número que no está tachado, vamos tachando todos sus múltiplos. Al final, los números NO tachados ( con un 1 ), son los números primos. Vean su wiki para ver la representación visual.

Qué he hecho
Bien, pues he hecho un código en C ( estoy aprendiendo a programar ) para calcular los números primos entre 2 y N, siendo N=10.000.000 y que guarda los resultados en un fichero. En mi PC tarda aproximadamente 1.45 segundos. Me he complicado un poco la vida y lo he que uno pueda . Al final he conseguido poner el valor de N tan grande como quiera ( en realidad no es así, ya que estamos limitados por la memória RAM del sistema )calcular los números primos entre 2 y 450.000.000. El fichero resultante pesa unos 400MB.

Compilación
Para compilar el código fuente, lo grabamos en un fichero "criba.c" y lo compilamos así:
$ gcc criba.c -o criba -lm
Y para ejecutar el código tan solo tenemos que escribir:
$ ./criba
Esto nos creará un ficherito "primos.txt" con los resultados.

Configuración
Pues básicamente jugaremos con las constantes N y M. N es el tamaño del bloque y M en número de bloques. Osea, que se van a calcular los números primos que vayan desde 2 hasta N*M. En mi PC N=1M funciona, pero en otro PC igual podría dar fallo. Disminuyese esta cantidad y auméntese en numero de iteraciones ( M ). Recuerden que el algoritmo se vuelve ineficiente a partir de 10M!


Codigo

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
// Each size block
#define N 1000000
// Iterations
#define M 10
//Memory that will be used for store all primes( must be aviable )
#define memory_size M*N*sizeof(long int)*0.08

// Put all values to zero
void initialization(unsigned long int * primes_numbers[]){
int i;
for (i=0;i<memory_size;i++)
(*primes_numbers)[i] = 0;
}

// Save all primes calculated in a file
void save_in_file(unsigned long int * primes_numbers[]){
FILE * fp;
unsigned long long int i;
fp = fopen("primos.txt", "w");
for (i=0;(*primes_numbers)[i];i++)
fprintf(fp, "%ld\n", (*primes_numbers)[i]);
fclose(fp);
}

// Count all the primes calculated
void count(unsigned long int * primes_numbers[]){
unsigned long long int i,j;
j = 0;
for (i=0;(* primes_numbers)[i];i++)
j++;

printf("Total primos encontrados: %lld\n", j);

}

// Check that in the list of prime numbers all are primes
// alert: very slow in very large amount of numbers
void check(unsigned long int * primes_numbers[]){
unsigned long long int i;
for (i=1; (*primes_numbers)[i] != 0; i++){
if ( is_prime((*primes_numbers)[i]) != 1)
printf("FUckkk! %ld\n", (*primes_numbers)[i] );
}
}

// Print all primes calculated
void imprime(unsigned long int * datos[]){
unsigned long long int i;
printf("Llistat:\n");
for (i=0;(*datos)[i]!=0;i++)
printf("%ld\n", (*datos)[i]);
}



int sieve_of_eratosthenes(unsigned long int * primes[], long long int * last_prime_inserted){
char list[N];
unsigned long long int i, j, max;
list[0] = 0;
for (i=2;i<N;i++)
list[i] = 1;

max = sqrt(N)+1;

for (i=2;i<max;i++){
if (list[i])
for (j=2; i*j<N;j++)
list[i*j] = 0;
}
j = 0;
for (i=0;i<N;i++)
if (list[i]){
(*primes)[j] = i;
j++;
}
*last_prime_inserted = j - 1;
return 0;
}

// Calculate the next block of primes
int next(unsigned long int * prime[], unsigned long long int block_number, long long int * last_prime_inserted){
char list[N];
unsigned long long int i, j, min, max;
min = (block_number-1)*N;
max = block_number*N;

//Set all numbers as primes
for (i=0;i<N;i++)
list[i] = 1;
list[0] = 0;

// Mark all numbers alredy calculated
for (i=0;(*prime)[i];i++){
for (j=min/(*prime)[i]; (*prime)[i]*j<max; j++){
if ((*prime)[i]*j>min){
list[((*prime)[i]*j)%N] = 0;
}
}
}

j = *last_prime_inserted;
// Save the new primes
for (i=0;i<N;i++){
if (list[i]){
// printf("%ld j:%ld\n", i+min, j);
(*prime)[j] = i+min;
j++;
}
}
*last_prime_inserted = j - 1;
}

// Calculate all the primes
int calc(int n){
unsigned long long int position_last_prime;
unsigned long int * primes_numbers;
primes_numbers = malloc(memory_size * sizeof(unsigned long int));
initialization(&primes_numbers);
sieve_of_eratosthenes(&primes_numbers, &position_last_prime);
int j;
for (j=2; j<=n; j++){
printf("Calculando %d...\n", j);
next(&primes_numbers, j, &position_last_prime);
}
//imprime(numeros_primos);
printf("Guardando...\n");
save_in_file(&primes_numbers);
//check(&numeros_primos);
count(&primes_numbers);
printf("Done!\n");
free(primes_numbers);
return 0;
}

int main(void){
calc(M);
return 0;
}

int is_prime(int n){
int i, j, prime;
prime = 1;
for (j=2; j<n/2; j++)
if (n % j == 0){
prime = 0;
break;
}
return prime;
}

Fin Codigo

Pues esto es todo, señores. Espero no haberles aburrido demasiado.

lunes, 22 de marzo de 2010

Jugando con MongoDB y Python

Bien, siguiendo el post anterior, vamos a cargar de GeoNames todos los datos sobre España en una base de datos MongoDB. Aqui no se va a explicar como instalar un servidor de Mongo. Se pueden encontrar todas las indicaciones en su pagina web oficial si no sabes que es Mongo, visita esta página. No es nada complicado. Bien, al lío.

Primero tenemos que ir a GeoNames ir a la parte de "descargas" y bajarnos algún país. En mi caso me he descargado ES.txt, documento que contiene todos los todos sobre España. Descomprimido, el fichero pesa unos 6.8MiB. Bien, ahora tenemos que "meterlo" en la base de datos. Lo podemos hacer así:


#! /usr/bin/env python
# -*- coding: utf-8 -*-
#Filename: buscar.py
#Filename: cargar_datos.py
from pymongo.connection import Connection
#Abrimos una conexión con la BBDD de mongo y creamos una colección llamada ES.
connection = Connection()
db = connection.ES
collection = db.ES
#Estos son los campos que contiene el fichero
fields = [
"geonameid",
"name",
"asciiname",
"alternatenames",
"latitude",
"longitude",
"feature_class",
"feature_code",
"country_code",
"cc2",
"admin1_code",
"admin2_code",
"admin3_code",
"admin4_code",
"population",
"elevation",
"gtopo30",
"timezone",
"modification_date"
]

#Abrimos el fichero de datos
file = open('ES.txt', 'r')
#Insertamos todos los datos en la BBDD. Simple y llanamente.
for data in file:
collection.insert(dict(zip(fields, data.split('\t'))))
print 'Done! =)'
#Cerramos el fichero y la conexión.
file.close()
connection.disconnect()

Bien, señores. Ahora solo queda ejecutar el comando con un simple "python cargar_datos.py". En mi ordenador, el proceso tarda unos 25 segundos, aproximadamente. Carga 58.317 registros ( llamados documentos, en la jerga de Mongo ).
Y ya tenemos todos los datos en la BBDD!!

Pero claro, ahora con todos estos datos que hacemos? Pues vamos a crear un pequeño codigo para hacer consultas:
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import pymongo

import re
import sys
#Nos conectamos a la BBDD, a la colección ES
db = pymongo.Connection().ES
collection = db.ES

#Cogemos el primer argumentos que nos han pasado como parámetro
busca = sys.argv[1]
#Compilamos una expresión regular para la búsqueda
regex = re.compile(busca)
#Buscamos en la base de datos la expresión regular en el campo "alternatenames". Los resultados los guardamos en una lista.
resultados = [ n for n in collection.find({"alternatenames":regex})]
#Por cada elemento de la lista pintamos los siguientes datos.
for tupla in resultados:
print ">Nombre:",tupla["name"]
print "Nombres comunes:",tupla["alternatenames"]
print "Coordenadas [Longitud][Latitud]:", tupla["latitude"], tupla["longitude"]
print "Link:", "http://maps.google.com/?ie=UTF8&ll=" + str(tupla["latitude"]) + "," + str(tupla["longitude"]) + "&spn=0.047113,0.109863&t=h&z=12"
print "Resultados encontrados:", len(resultados)
print ""


Como funciona el programa? Muy simple:
$ python buscar.py Pollença
Y esto nos va a dar los resultados. Si usamos una terminal Bash, podemos hacer clic con Control pulsado sobre el link y automáticamente se abrirá en Google Maps el la posición exacta del lugar buscado. Espero que se haya entendido algo =). No dejen de postear sus dudas/mejoras. Gracias!

Base de datos GeoNames

Muy señores míos. Siento que haya estado un tiempo sin poner ningún post de interés. La semana pasada estuve de exámenes finales y ahora ya he terminado. Espero poder volver a coger un poquito la rueda.

Bien, dejémonos de historias. Que tengo para vosotros hoy? Pues os quiero presentar la página de GeoNames. Es una pagina web donde recopila información sobre: nombres de ciudades, de lagos, de pueblos, montañas, sobre municipios/provincias. Y contiene información, muuucha información. Entre otras la coordenadas del lugar que se busca, altitud, la población, el país, nombres similares que recibe este mismo sitio, wiki, etc...
Todos los datos del mundo en cleartext pesa unos 800MB aproximadamente. Bien. Pero me direis "si, ya, esto ya existe. Se llama Google Maps". Y lo cierto es que se parece, pero no es exactamente lo mismo. Las bases de datos de GeoNames se pueden descargar libremente. Es tan fácil como entrar en la página, ir a "Download server" y elegir el país que te quieres descargar.

Mas exactamente la información información que guardan es la siguiente:
The main 'geoname' table has the following fields :
---------------------------------------------------
geonameid : integer id of record in geonames database
name : name of geographical point (utf8) varchar(200)
asciiname : name of geographical point in plain ascii characters, varchar(200)
alternatenames : alternatenames, comma separated varchar(5000)
latitude : latitude in decimal degrees (wgs84)
longitude : longitude in decimal degrees (wgs84)
feature class : see http://www.geonames.org/export/codes.html, char(1)
feature code : see http://www.geonames.org/export/codes.html, varchar(10)
country code : ISO-3166 2-letter country code, 2 characters
cc2 : alternate country codes, comma separated, ISO-3166 2-letter country code, 60 characters
admin1 code : fipscode (subject to change to iso code), see exceptions below, see file admin1Codes.txt for display names of this code; varchar(20)
admin2 code : code for the second administrative division, a county in the US, see file admin2Codes.txt; varchar(80)
admin3 code : code for third level administrative division, varchar(20)
admin4 code : code for fourth level administrative division, varchar(20)
population : bigint (4 byte int)
elevation : in meters, integer
gtopo30 : average elevation of 30'x30' (ca 900mx900m) area in meters, integer
timezone : the timezone id (see file timeZone.txt)
modification date : date of last modification in yyyy-MM-dd format
Bueno, en el siguiente post os muestro como volcar todos estos datos en una BBDD como MongoDB.
Saludos!

jueves, 18 de marzo de 2010

Sobre la facilidad de criticar el trabajo de otros O como tu opinión no le importa a nadie....

[molesto]
Vía Ubuntizando el Planeta, en su post "Esto no es una democracia" me entero que Mark Suttleworth ha dado una respuesta contundente a la pregunta si Canonical es, o no, una democracia. Y la respuesta ha sido que no.



Faltaría mas. A mi modo de ver las cosas CREO que la gente que se queja ahora por una nimidad como la posición de unos botones y que por otra parte casi seguro que no ha hecho "nada" [1] para mejorar Ubuntu, son unos desagradecidos.

Osea, estas usando una distribución que mejora cada día. Cada 6 meses tienes una versión nueva. Los chicos de Canonical están haciendo un trabajo extraordinario [2]. Y las decisiones que toman ( como muy bien explica Mark ) las toman por algo, jefes de proyecto y decisiones que se toman conjuntamente con los equipos de trabajo que solo se dedican a esto, a tomar decisiones y a implementarlas. Y nosotros, evidentemente, podemos OPINAR. Y nada mas!

Hay quien piensa que todo el mundo tiene derecho a opinión y a voto. Esto es falso[3]. Y me explico:

Opinión siempre la puedes tener sobre un tema determinado. Faltaría mas! Pero no quiere decir que el hecho de que tú tengas opinión, vaya a interesarle a nadie. Yo soy de los que creo que las opiniones son validas, o no, dependiendo de la persona que las divulga. Si yo mismo empiezo a dar opinión sobre le mundillo de la física [ que no tengo absolutamente ni idea ] por un artículo que he leído o por algo que he visto en la televisión entiendo que mi opinión no tenga ninguna validez para un físico con 20 años de experiencia. Del mismo modo que no tiene validez para mi la opinión que pueda tener mi abuelo sobre el Software Libre por UN artículo que ha leído en el periódico esta mañana. Esto es así, señores. Opinar ( y querer ser tomado en serio ) es muy fácil, pero uno se tiene que ganar el derecho a ello.

Derecho a voto? Si. Si te preguntan. Si Canonical hace una encuestra. Si en Ubuntu sale un popup pidendo tu opinión/voto sobre algo. Adelante. Contesta. Ayuda. Te están pidiendo tu opinión. Ahora es tu oportunidad. Pero esto no significa que tu, cuando te apetezca y sobre el tema que te apetezca, puedas ir "reclamando" a Canonical el porqué lo han hecho así, y porque no lo cambian a tu gusto. Una gran mayoría de los usuarios consideran que el [polemico] alineamiento de los botones puede ser un problema muy grande a la hora de usar Ubuntul, algo crucial para el desarrollo del SO.... se puede cambiar. Un comando en la consola. UNO!! Y aún así nos seguimos quejando. Por favoooooor! Es normal ( si, si, he dicho normal ) que Canonical no nos tome enserio. Que un tema sin tan poca imprtáncia haya generado tanta polémica. Esto si, sobre la última versión del kernel no he leído ninguna queja, la verdad. Significa que esté bien al 100%? Pues seguramente no, lo que pasa es que el publico en general:
1) No está interesado en saber que maldita mejora se ha hecho en el kernel
2) Solo quieren que funcione
3) Las mejoras no parecen nada evidente, que resalte a la vista y por tanto la gente no se pude general una "opinión" de manera facil, sencilla y que no le cueste esfuerzo
4) No está interesado en estudiar y aprender la programación necesaria para poder efectuar juicios sobre el tema. Que por eso ya tenemos a los chicos de Canonical que ya saben, no?
5) Se están quejando de los botoncitos

Un post duro. Si.
Estoy de acuerdo con Mark? Completamente.
Me gusta el cambio de los botones? Pues todavía no los he probado. A primera vista suponen un cambio de lo "habitual" y el cambio me genera rechazo. Les daré una oportunidad de varias semanas. Sino yo se que con UN COMANDO lo dejo como antes. No problemo. Al menos no para mi.
Porque he escrito esto? Pues porque lo que me molesta es la hipocresía de la gente, que hace un par de semanas parece que todo el mundo quiere opinar/votar/cambiar una decisión tomada por otros, y que seguramente esta gente no se preocupa lo mas mínimo por temas mas importantes y menos populares ( a mi parecer, claro ) como podrían ser el rendimiento, la seguridad o la estabilidad del sistema. No he visto a NADIE que proponga poner un botón en Sistema>Preferencias>Apariencia para elegir la posición de los botones. A NADIE. Es una pena.
[/molesto]

Esta, Señores mios, es mi humilde opinión.

[1] Me refiero nada importante como desarrollar una apliación para Ubuntu, o hacer de betatester, o simplemente empezar a picar códio de algun proyecto. Lo digo porque es muy facil criticar desde fuera. Si realmente viesen el esfuerzo que se ha hecho y que se está haciendo, creo que se tomarían las cosas con mas calma. Por otra parte es muy posible que hayan hecho reportes de errores y consideren que esto es una colaboración muy importante ( que lo es). Pero esto es dar a siguiente>siguiente>explicación>finalizar. No son meses de trabajo, vaya.
[2] Tienen como competencia a empresas de la talla Microsoft o Apple.
[3] En el entorno del que estamos hablando, claro. Nuestro país es un país democrático y el derecho al voto y a la libertad de expresión son derechos fundamentales.

domingo, 14 de marzo de 2010

Siguiendo una meme que (creo) se inició en Ubuntizando el Planeta y siendo invitado por Clase Linux, me he dirigido a la pagina web para calcular el grafico inverso del nombre de mi blog ( sea lo que sea que signifique grafico inverso =) )
El resultado final ha sido algo así:


Saludos!

domingo, 7 de marzo de 2010

POR ALGO ERES INFORMÁTICO

Traducción comentada de una conversación con una amiga:

(16:43:12) Amiga: xurrrii #Emezamos mal, a mi no me llaman nunca xurri. Esto significa, "hola, quiero algo de tí y no te va a gustar"
(16:43:43) Jan> : hola guapisima # yo, como siempre tan cortés :P
(16:44:21) Amiga: mm # Duda, todavía no lo tiene claro, sería mejor que se retirara ahora....
(16:44:24) Amiga: quería hablar contigo #... y no. Se lanza... esto le va a doler.
(16:44:32) Jan> : :)
(16:44:36) Jan> : muy bien
(16:44:38) Jan> : dispara
(16:44:42) Amiga: jajaja
(16:44:48) Amiga: quiero que me hagas un regalo de cumpleaños # Buen intento, encanto
(16:44:49) Amiga: pero te pagar # Urooo, y encima es algo ilegal
(16:44:55) Amiga: pagaré*( no te asustes)
(16:45:19) Jan> : que no me asuste? ya tiemblo
(16:45:24) Amiga: jajajaja
(16:45:35) Amiga: alomejor me dices que no # Mierda, ya no es una noche de lujuria, sexo y pasión... una pena
(16:45:35) Jan> : osea, que te tengo que hacer un regalo de cumpleaños que tu me pagarás? ( no se si lo acabo de entender )
(16:45:40) Amiga: jaja # Es una risa, pero risa tonta... sabe que va a decir algo gordo y no sabe como
(16:45:43) Jan> : esto no puede acabar nunca bien :)
(16:45:49) Amiga: quiero que me hagas un DNI pero me han dicho que vale dinero #podeis imaginar que tiene menos de 18 años, la amiguita
(16:45:54) Amiga: pero me han dicho que tu sabes hacer #Fuck... alguien va a recibir una patada voladora...
(16:46:15) Jan> : que qué?!:|
(16:46:19) Amiga: un DNI
(16:46:21) Amiga: falso # soy tontito, pero ya había entendido que no quería una fotocopia por las dos caras del DNI...
(16:46:24) Jan> : quien te ha dicho esta tontería?
(16:46:27) Amiga: [nombre de mi mejor amigo]
(16:46:32) Amiga: bueno
(16:46:33) Amiga: igualmente
(16:46:38) Amiga: tu sabes hacer estas cosas
(16:46:41) Amiga: POR ALGO ERES INFORMÁTICO

unreadahead-other main process terminated with status 2 [SOLUCIONADO]

En el visor del sistemas se estaban consumiendo entre 40-60% de CPU sin hacer nada. He ido al registro del sistema y en "daemon.log" me he encontrado que cada segundo añadía unas 10 líneas con el texto del título del post. Esto se soluciona tan fácil como:
  • Abrir /etc/fstab con privilegios de superusuario
  • Borrar las entradas que se han añadido manualmente
  • Reiniciar le equipo
Y problema resuleto.

sábado, 6 de marzo de 2010

Envío y recepción de correos firmados o/y cifrados HOWTO

Descripción de la práctica.

Queremos reproducir cómo conseguir configurar un cliente de correo como el Thunderbid para recibir correos cifrados/firmados de manera transparente por parte del usuario.

Utilidad:

  • Los correos firmados nos aseguran que el correo procede de una persona en concreto, y es imposible falsificar esta firma.

  • Los correos cifrados nos permiten asegurar que el receptor será el único que podrá abrir la información enviada.

  • Si combinamos las dos características anteriores, podemos enviar correos de manera segura y con la seguridad que lo recibimos del remitente correcto.

Herramientas:

  • Utilizaremos nuestra distribución preferida ( en mi caso Ubuntu 9.10 )

  • Necesitamos tener instalado un cliente de correo que permita enviar/recibir correos cifrados. En mi caso usaré Thunderbird 2.0.0.23 ( alguien probó de hacer lo mismo en Evolution y no le funcionó, seguro que tiene arreglo, pero se deberá buscar )

  • Navegador web, en mi caso utilizaré Firefox 3.5.8

  • Autoridad certificadora. Usarem CACert en nuetro caso, ya que nos proporciona certificados gratuitos con tan solo especificar nuestro correo.

Descripción general del proceso:

Vamos a registrarnos en una página que nos permita generar certificados firmados para una dirección de correo determinada. Una vez tenemos el certificado lo importaremos a Thunderbird y configuraremos todos los parámetros para una cuenta de correo determinada. Hecho esto podremos empezar a enviar y recibir correos firmados/cifrados a otras personas.

Inconvenientes:

Quiero hacer saber los problemas que puede plantear usar este sistema antes de que tengas que deducirlo vosotros leyendo el manual.

  • CACert es una autoridad certificadora gratuita, pero algunos navegadores no la incluyen como “segura” por defecto ( ya se verá como se configura de manera manual ). Las alternativas son de pago, y que te tienes que autentificar en algún sitio con tu DNI, elegimos CACert por comodidad pero este manual se podría adaptar a cualquier otra Autoridad Certificadora.

  • Tanto el emisor como el remitente tienen que tener configurada una cuenta como aquí se detalla, de otro modo no podrán abrir los correos (esto siempre es así).


1. CACert

Lo primeros es crear un certificado en CACert. Para ello nos difigimos a www.cacert.org, tenemos que ir a “Root Certificate” del menú de la derecha. Después instalar el certificado de Cacert. Para instalar el certificado es sifuciente hacher click en “Root Certificate (PEM Format)”.




Nos tiene que aparecer un mensaje conforme la operación se ha realizado con éxito. Es posible que el certificado ya se encontrara instalado en nuestro navegador y que nos informe de esto mismo.

Bien, porque hemos hecho esto? Pues hemos configurado nuestro navegador de modo que confíe en la página de Cacert. Ahora vamos a proceder a registrarnos en la página. Ara ello vamos hacemos clic en “Join” del menú de la derecha.

No nos estamos registrando en una página web de contactos, esto es una pagina web para crear certificados, o sea que tenemos que dar información verídica del mismo modo que tenemos que poner una contraseña segura para que no puedan acceder a nuestra cuenta. Pensad que si alguien puede copiar un certificado que hayamos creado, se podría hacer pasar por nosotros igual como si tuviese nuestro DNI. Remarco la importancia de elegir contraseñas seguras para los certificados ( que en definitiva es tu identidad digital ).

Marca la casilla de “I AGREE” y dale a “Next”. De este modo creamos la cuenta. Ahora tienes la oportunidad de repetir las preguntas-respuestas secretas o password si habías sido perezoso y apuntado cualquier cosa. Tienes que hacerlo a conciencia! Piensa que es para tu seguridad!

Bien, una vez tenemos nuestra cuenta creada y validada ( mediante el proceso de abrir un mail que tenemos esperando en nuestra bandeja de entrada especificada ) nos logueamos en la pagina web mediante el botón “Password Login”.

Para crear un nuevo certificado vamos a “Client certificates” y marcamos la casilla con nuestro correo deseado:


En la nueva pestaña nos pide el tamaño de la clave que queremos generar, pudiendo elegir entre “alto” y “medio”. Eligir por elegir, le damos en “alto”, porque es el propuesto por defecto y porque es gratis ;)

Le damos al botón “Create Certificate Request” y nos tendremos que esperar un rato a que se genere el nuevo certificado. Porque tarda tanto? Porque está generando un par de claves RSA, por lo que tiene que buscar números primos realmente grandes. Bien, ya ha creado nuestro certificado. Ahora nos da la opción de “Click here to install your certificate.” Y volià! Ya tenemos nuestro certificado! Bien, como muy bien nos indica la misma página, deberíamos hacer una cópia del certificado digital, y esto es exactamente lo que haremos ahora.

  1. En el Firefox vamos a: Editar>Preferencias

  2. Hacemos clic en la última pestaña, la que pone AVANZADO

  3. Hacemos clic en el botón “Ver certificados”

  4. Nos quedamos en la pestaña “Sus certificados”, marcamos el certificado que acabamos de crear y le damos a “Hacer copia...”

  5. Elegimos un sitio seguro donde guardar el certificado y ponemos un nombre descriptivo y con la extensión que acabe con .p12 ( es solo para tener bien organizados nustros certificados, puedes poner la extensión que te parezca más conveniente )

  6. Nos pedirá un password. Es muy importante poner una contraseña segura. Recordemos ( una vez mas ) que se trata de nuestra identidad digital, esto es el tipo de información que buscaría un hacker.

  7. Repetimos el password y le damos a OK.

  8. Ya tenemos el backup hecho.

Ahora tenemos que hacer una copia del certificado de Cacert para instalarlo en Thunderbird. Lo mas simple es:

  1. En el Firefox vamos a: Editar>Preferencias

  2. Hacemos clic en la última pestaña, la que pone AVANZADO

  3. Hacemos clic en el botón “Ver certificados”

  4. Vamos a la pestaña “Autoridades” y buscamos “Root CA”

  5. Hacemos clic en “CA Cert Signing Authority”

  6. Clic en exportar y guardamos en el sitio donde guardamos nuestros certificados. Nombre de ejemplo: cacert.pem

  7. Hecho!

Nota: Es muy imporante que todos los pasos de “1. CAcert” los hagas en el mismo ordenador y con el mismo navegador, de otro modo no funcionará.


2. Thunderbird

Muy bien. Hasta ahora hemos creado nuestros certificados, ahora debemos configurar el cliente de mensajería deseado. En nuestro caso usaremos Thunderbird.

El primer paso que tenemos que hacer es instalar la Autoritdad Certificadora Cacacert:

  1. Abrimos Thunderbird

  2. Vamos a Editar>Preferencias>Avanzadas>Ver certificados

  3. Abrimos la pestaña “Autoridades” y le damos al botón “Importar”

  4. Elegimos nuestro ficherito “cacert.pem” ( o con el nombe que le pusistes en el paso anterior ) y le damos “Aceptar”

  5. Nos dice que ha instalado el certificado de manera correcta!

  6. Ahora buscamos en la lista “Root CA”

  1. Hacemos clic en “CA Cert Signing Authority”

  2. Vamos a “Editar” y marcamos todas las casillas ( tansolo haría falta la casilla referente al correo, pero para evitar problemas, mejor ). Aceptamos.

  3. Ahora vamos a la pestaña “Mis certificados”

  4. Le damos a “Importar” y buscamos nuestro certificado (el que acaba con “.p12”)

  5. Nos pide una contraseña con la que Thunderbird va a proteger el fichero ( poner una segura ) y después no pide la contraseña con la que está protegido ya el fichero ( lo que pusimos en el paso anterior )

  6. Damos a aceptar y ya tenemos nuestro certificado instalado!

Ahora nos queda configurar una cuenta de correo en Thunderbird para poder enviar y recibir correos de manera segura. AVISO: No voy a explicar aquí como se configura una cuenta POP3 o SMTP en Thunderbird ya que internet está repleta de manuales que lo explican perfectamente, daré por supuesto que se tiene una cuenta creada, con la que podemos mandar correos ya y podemos recibir. La cuenta configurada, evidentemente, tiene que ser la misma para la que hemos creado el certificado.

Para configurar el certificado para que funcione con una cuenta simplemente tenemos que ir a:

  1. Editar>Configuración de cuentas

  2. Abrir la casilla “Seguridad” de la cuenta que se quiera configurar ( como se ve en la imagen siguiente )

  3. Tanto en la casilla de firma digital como cifrado, seleccionar el certificado que hemos instalado anteriormente.

  4. Se recomienda mantener la opción de “Nunca usar cifrado” y desactivar la opción “firmar digitalmente”

Una vez hecho esto ya tenemos a Thunderbird preparado para enviar/recibir correos firmados o cifrados!! No ha sido tan difícil, verdad?


3. Prueba de concepto

Bien, ahora está ya todo configurado. Como funciona? Pues muy fácil.

Abrimos Thunderbird si lo habíamos cerrado. Vamos a REDACTAR y ponemos lo habitual: destino ( que para hacer una prueba podemos poner nuestro mismo mail) asunto, mensaje, etc... y en botón “SEGURIDAD”, le damos a la flechita que apunta hacia abajo y marcamos la opción “Firmar digitalmente este mensaje”.

Le damos a “ENVIAR” y el correo se ha mandado a nuestra misma dirección. Si abrimos el correo veremos todo como siempre, pero un un detalle: Ahora aparece un sobre con un punto amarillo que nos indica que este correo está firmado. En caso de recibir un correo firmado y cifrado aparecerá un candado con un sobre con punto rojo.

Porque no puedo mandarle un correo CIFRADO a un amigo mio? Bien, porque antes necesitas su clave pública. Para tener su clave publica puedes hacer dos cosas:

  • Que te mande un fichero “.pem” con su clave pública y la importas en el Thunderbird

  • O que te mande un correo firmado, que en él ya se incluye automáticamente la clave pública de tu amigo

A partir del momento que recibes un correo FIRMADO de alguien, ya puedes mandarle correos CIFRADOS cuando quieras. Lo mismo a la inversa. Si quieres que alguien te mande un correo CIFRADO, antes tienes que mandarle un correo a el FIRMADO, para que tenga tu clave pública y pueda cifrar los e-mails.

Espero que esto ayude a entender un poco como funciona el sistema de envío de datos seguros por SMIME, con certificados y un cliente.

Me ofrezco voluntario para recibir correos firmados/cifrados a mi cuenta de correo habitual, y a responder ( en la medida de lo posible ) estos mismos correos para comprobar que las configuraciones se han hecho correctamente y que el sistema funciona bien. El e-mail de contacto es inedit00@gmail.com

Dudas, sugerencias o aclaraciones, en los comentarios

Saludos!