<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8201731322115542179</id><updated>2012-01-27T15:41:43.562+01:00</updated><category term='Redes'/><category term='Vulnerabilidades'/><category term='Inteligencia Artificial'/><category term='Criptoanálisis'/><category term='Ingeniería inversa'/><category term='Arduino'/><category term='Factorización'/><category term='Esteganografía'/><category term='Enigmas'/><category term='Criptografía'/><category term='GTK+'/><category term='OpenDomo'/><category term='Programación'/><category term='Hardware'/><category term='Sistemas Operativos'/><category term='Retos 2009'/><category term='Retos 2008'/><category term='Retos 2010'/><title type='text'>El Blog de Daniel Lerch</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default?start-index=101&amp;max-results=100'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>118</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4369662236893931455</id><published>2012-01-26T18:33:00.000+01:00</published><updated>2012-01-27T15:25:29.623+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><category scheme='http://www.blogger.com/atom/ns#' term='GTK+'/><title type='text'>Sockets multiplataforma con GTK+</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://dlerch.blogspot.com/2012/01/compila-en-linux-y-ejecuta-en-windows.html"&gt;Recientemente&lt;/a&gt; hemos visto como realizar compilación cruzada con GTK+. Esto nos permite escribir aplicaciones que se ejecutan en diferentes plataformas, almenos a nivel gráfico.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Vamos a ver ahora como usar sockets TCP, algo que habitualmente suele estar muy ligado a una plataforma concreta. GTK+ (de hecho es GLIB) nos proporciona una API para acceder a la red. Esta API, al igual que GTK+ es multiplataforma.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Escribiremos un cliente TCP sencillo, que se conectará a un puerto, escribirá un mensaje, y leerá la respuesta.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Primero incluimos las cabeceras habituales en un programa C, junto con las cabeceras de GTK+.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="cpp" name="code"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;#include &amp;lt;gtk/gtk.h&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Necesitamos las siguientes variables;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="cpp" name="code"&gt;GError *err = NULL;&lt;br /&gt;GSocket *sock = NULL;&lt;br /&gt;GInetAddress *iaddr = NULL;&lt;br /&gt;GSocketAddress *saddr = NULL;&lt;br /&gt;GCancellable *cancel = NULL;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Usamos las siguientes funciones para inicializar las variables que contienen las direcciones de red. Lògicamente con la IP y puerto que convenga:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;g_type_init();&lt;br /&gt;iaddr = g_inet_address_new_from_string("192.168.1.1");&lt;br /&gt;saddr = g_inet_socket_address_new(iaddr, 23);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Abrimos el socket y nos conectamos a el:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;sock = g_socket_new(&lt;br /&gt;   G_SOCKET_FAMILY_IPV4,&lt;br /&gt;   G_SOCKET_TYPE_STREAM,&lt;br /&gt;   G_SOCKET_PROTOCOL_TCP,&lt;br /&gt;   &amp;amp;err);&lt;br /&gt;&lt;br /&gt;f(!g_socket_connect(sock, saddr, cancel, &amp;amp;err))&lt;br /&gt;{&lt;br /&gt;   printf("Cannot connect\n");&lt;br /&gt;   return -1;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y finalmente, enviamos y recibimos datos:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;   char buf[256];&lt;br /&gt;   strncpy(buf, "lst\n", sizeof(buf));&lt;br /&gt;   g_socket_send(sock, buf, strlen(buf), cancel, &amp;amp;err);&lt;br /&gt;   g_socket_receive(sock, buf, sizeof(buf), cancel, &amp;amp;err);&lt;br /&gt;&lt;br /&gt;   printf("received:\n%s\n", buf);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Sencillo, ¿no?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-4369662236893931455?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/4369662236893931455/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=4369662236893931455' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4369662236893931455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4369662236893931455'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2012/01/sockets-multiplataforma-con-gtk.html' title='Sockets multiplataforma con GTK+'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-6862065668430670160</id><published>2012-01-25T17:25:00.000+01:00</published><updated>2012-01-25T17:25:31.283+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Redes'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Sockets TCP con Bash</title><content type='html'>&lt;div style="text-align: justify;"&gt;Es muy habitual, cuando se escriben scripts en Bash, recurrir a herramientas como "netcat" para realizar comunicaciones de red. Sin embargo, aunque no es muy conocido, Bash soporta sockets.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Veamos como conectarnos, por ejemplo, a google.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Abrimos el socket y le asociamos el descriptor 3. Recordemos que 0, 1 y 2 se usan habitualmente para la entrada y salida estándard y para la salida de error.&lt;/div&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;$ exec 3&amp;lt;&amp;gt;/dev/tcp/www.google.com/80&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A continuación, enviamos un mensaje por el socket:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;$ echo "GET /" &amp;gt;&amp;amp;3&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y finalmente, leemos la respuesta del servidor:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;$ cat &amp;lt;&amp;amp;3&lt;br /&gt;&lt;br /&gt;HTTP/1.0 302 Found&lt;br /&gt;Location: http://www.google.es/&lt;br /&gt;Cache-Control: private&lt;br /&gt;Content-Type: text/html; charset=UTF-8&lt;br /&gt;Set-Cookie: PREF=ID=a38d7ed8770f70cb:FF=0:TM=1327418982:LM=1327418982:S=0tgHEV7GxJaC6Wl7; expires=Thu, 23-Jan-2014 15:29:42 GMT; path=/; domain=.google.com&lt;br /&gt;Date: Tue, 24 Jan 2012 15:29:42 GMT&lt;br /&gt;Server: gws&lt;br /&gt;Content-Length: 218&lt;br /&gt;X-XSS-Protection: 1; mode=block&lt;br /&gt;X-Frame-Options: SAMEORIGIN&lt;br /&gt;...&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-6862065668430670160?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/6862065668430670160/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=6862065668430670160' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6862065668430670160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6862065668430670160'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2012/01/sockets-tcp-con-bash.html' title='Sockets TCP con Bash'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4987040074085972052</id><published>2012-01-24T15:14:00.000+01:00</published><updated>2012-01-24T15:49:35.027+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><category scheme='http://www.blogger.com/atom/ns#' term='GTK+'/><title type='text'>Compila en Linux y ejecuta en Windows con GTK+</title><content type='html'>&lt;div style="text-align: justify;"&gt;Vamos a ver como realizar una compilación cruzada con las librerías de GTK+. Esto nos permitirá compilar el programa en Linux y ejecutarlo en Windows, por lo que podremos tener programas funcionando en Windows sin tener que usarlo. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Lo primero que tenemos que hacer es instalar el compilador mingw. En mi distribución vale con:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;sudo apt-get install mingw32&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A continuación tenemos que descargar las librerías necesarias de windows en nuestro Linux. Podemos encontrarlas en&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="cpp" name="code"&gt;$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/glib/2.28/glib-dev_2.28.8-1_win32.zip&lt;br /&gt;$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/atk/1.32/atk-dev_1.32.0-2_win32.zip&lt;br /&gt;$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/pango/1.29/pango-dev_1.29.4-1_win32.zip&lt;br /&gt;$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/cairo-dev_1.10.2-2_win32.zip&lt;br /&gt;$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/libpng-dev_1.4.3-1_win32.zip&lt;br /&gt;$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/gettext-runtime-dev_0.18.1.1-2_win32.zip&lt;br /&gt;$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-dev_2.24.8-1_win32.zip&lt;br /&gt;$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/fontconfig-dev_2.8.0-2_win32.zip&lt;br /&gt;$ wget http://ftp.gnome.org/pub/gnome/binaries/win32/gdk-pixbuf/2.24/gdk-pixbuf-dev_2.24.0-1_win32.zip&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Descomprimiremos los zip dentro del directorio donde se instala mingw. Habitualmente:&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;/usr/i586-mingw32msvc/&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;Entramos en dicho directorio y realizamos algunos ajustes:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;sed -i 's|^prefix=.*$|prefix=/usr/i586-mingw32msvc|g' lib/pkgconfig/*.pc&lt;br /&gt;cd ./lib&lt;br /&gt;for f in *.lib;&lt;br /&gt;   do mv $f lib${f%%lib}a;&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;En mi caso faltaba un archivo en pkgconfig, lo he corregido con:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;$ cp /usr/lib/i386-linux-gnu/pkgconfig/freetype2.pc  pkgconfig/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pero podría estar ubicado en otro sitio en otras distros. &lt;br /&gt;&lt;br /&gt;Llegados a este punto ya deberíamos poder compilar tanto para windows como para linux.&lt;br /&gt;&lt;br /&gt;Si compilamos con el siguiente comando: &lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;i586-mingw32msvc-gcc main.c `PKG_CONFIG_LIBDIR=/usr/i586-mingw32msvc/lib/pkgconfig PKG_CONFIG_PATH=/usr/i586-mingw32msvc/lib/pkgconfig pkg-config --cflags --libs gtk+-2.0`&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;generaremos un ejecutable para Windows. En este caso "a.exe".&lt;br /&gt;&lt;br /&gt;Y si compilamos con este comando:&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;gcc main.c `pkg-config --cflags --libs gtk+-2.0 gmodule-export-2.0`&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Obtendremos un ejecutable para Linux "a.out". Ya tenemos pues, nuestro sistema de compilación cruzada preparado.&lt;/div&gt;&lt;br /&gt;Ya podemos trasladar nuestro ejecutable a Windows y probarlo. Para que funcione es necesario haber instalado &lt;a href="http://sourceforge.net/projects/gtk-win/"&gt;GTK+ para Windows&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-4987040074085972052?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/4987040074085972052/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=4987040074085972052' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4987040074085972052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4987040074085972052'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2012/01/compila-en-linux-y-ejecuta-en-windows.html' title='Compila en Linux y ejecuta en Windows con GTK+'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4856277440419301960</id><published>2012-01-21T12:04:00.002+01:00</published><updated>2012-01-21T12:04:19.108+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Esteganografía'/><title type='text'>Esteganografía LSB en imágenes bitmap</title><content type='html'>&lt;div style="text-align: justify;"&gt;Uno de los métodos más populares de Esteganografía consiste en modificar el valor del bit menos significativo de cada píxel, el LSB (Least Significant Bit). En este artículo vemos como hacerlo en imágenes de tipo bitmap, es decir, aquellas que estan estructuradas como matrices de números donde cada número representa un píxel (eso solo es cierto en imágenes en escala de grises. En imágenes en color existen varias representaciones como la RGB donde cada píxel está representado por tres valores, correspondientes a la cantidad de color rojo, la cantidad de color verde y la cantidad de color azul).&lt;br /&gt;&lt;br /&gt;El motivo de usar el LSB es que su alteración no sueles ser perceptible visualmente (a menos que la imagen sea muy baja resolución) &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Inserción secuencial:&lt;/b&gt; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;El método más sencillo consiste en separar los bytes que forman el mensaje en bits individuales. A continuación se recorren los píxeles de la imagen modificando su LSB de manera que quede igual que el del mensaje. Supongamos que queremos esconder un mensaje que empieza por 'H'. El valor en binario de la letra 'H' es 1001000. Por lo tanto tendremos que insertar:&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;1 0 0 1 0 0 0&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Imaginemos ahora que los primeros 8 píxeles de la imagen corresponden a los bytes:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;100 101 101 102 102 101 103&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;El primer píxel, correspondiente al valor 100 se representa en binario como 1100100. Dado que tenemos que modificar su LSB y ponerlo a uno, como el primer bit del mensaje, tendremos 1100101, que corresponde al valor de píxel 101. La operación es muy sencilla, si tenemos un valor de píxel par y queremos insertar un cero, no modificaremos el valor del píxel, pero si queremos insertar un uno, le sumaremos uno. Si por el contrario tenemos un píxel impar y queremos insertar un uno, no modificaremos su valor, pero si queremos insertar un cero, le restaremos uno.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Así, el primer byte queda como 101, el segundo como 100, el tercero como 100, etc&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: large;"&gt;101 100 100 103 102 100 102&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Para leer el mensaje solo tendremos que extraer los LSB de todos los píxeles.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Inserción aleatoria:&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Insertar el mensaje de forma secuencial no es una forma muy acertada de hacerlo. Esto permite al atacante extraer el mensaje, por lo que, si no está cifrado, solo tiene que verificar que es legible (en una imagen sin mensaje oculto no lo sería).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Por este motivo es más aconsejable usar un &lt;a href="http://en.wikipedia.org/wiki/Pseudorandom_number_generator"&gt;generador pseudoaleatorio PRNG&lt;/a&gt; basado en una clave o contraseña, que eliga aleatoriamente los píxels en los que incrustar datos. De esta manera no bastaría con una simple extracción de todos los LSB.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Reducción del bitrate&lt;/b&gt;&lt;b&gt;:&lt;/b&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Aún y la enorme dificultad de conseguir el mensaje que ha sido ocultado usando un PRNG (necessitaríamos adivinar la contraseña), el objetivo de la esteganografía es hacer el mensaje indetectable, no indescifrable (de eso se encarga la criptografía). Por ello tenemos que intentar que la distribución estadística de los píxeles de la imagen se vea alterada lo menos posible. Si usamos bitrate 1, es decir, si modificamos todos los píxeles de la imagen, la distribución estadística se verá tan alterada que sermoes detectados sin demasiada dificultad. Por ello es conveniente reducir en la medida de lo posible el bitrate de inserción.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Los ataques existentes en la actualidad a los sistemas LSB son tan sofisticados que detectan alteraciones por encima de bitrates de 0,03. Es decir, que si no queremos ser detectados, deberíamos modificar como mucho el 3% de la imagen y hacerlo de forma aleatoria.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-4856277440419301960?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/4856277440419301960/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=4856277440419301960' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4856277440419301960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4856277440419301960'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2012/01/esteganografia-lsb-en-imagenes-bitmap.html' title='Esteganografía LSB en imágenes bitmap'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7724051650727969705</id><published>2012-01-20T22:28:00.001+01:00</published><updated>2012-01-20T22:39:35.422+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='Arduino'/><title type='text'>Introducción a Arduino Ethernet: Hello World</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.arduino.cc/"&gt;Arduino&lt;/a&gt; es una plataforma de Hardware abierto cada vez más popular. Permite, de forma sencilla, realizar montajes electrónicos y programarlos. Recientemente ha aparecido en escena Arduino Ethernet, que a diferencia de los anteriores (Arduino Uno y Arduino Duemilanove, entre otros) tiene conexión RJ45 y soporte TCP/IP.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-sBYBWDCA6ys/TxnLoPejbPI/AAAAAAAAEss/LKWJu_9iteA/s1600/Arduino_ETH_senza_POE.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://1.bp.blogspot.com/-sBYBWDCA6ys/TxnLoPejbPI/AAAAAAAAEss/LKWJu_9iteA/s320/Arduino_ETH_senza_POE.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En este post vamos a realizar una breve introducción a Arduino Ethernet, viendo como dar los primeros pasos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;El programador:&lt;/b&gt; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A difernecia de los arduinos anteriores, que tenían una conexión USB que permitía cargar el firmware y depurar, el Arduino Ethernet solo tiene la conexión RJ45. Por ello es necesario usar el conector de la foto para programarlo:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-XC4rFvUGyXo/TxnNh9QhUoI/AAAAAAAAEs0/KYgT1xmF2I8/s1600/Arduino_ETH_senza_POE.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://3.bp.blogspot.com/-XC4rFvUGyXo/TxnNh9QhUoI/AAAAAAAAEs0/KYgT1xmF2I8/s320/Arduino_ETH_senza_POE.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para poder usar este conector es necesario usar un programador. Existen multitud en el mercado. Por ejemplo &lt;a href="http://store.atmel.com/PartDetail.aspx?q=p:10500054"&gt;este de Atmel&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Otra opción más económica consiste en usar el&lt;a href="http://arduino.cc/en/Main/USBSerial"&gt; adaptador a USB&lt;/a&gt;. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_SyGBBgXxHQ/TxnPKR9I9FI/AAAAAAAAEs8/zX6d98BEK7k/s1600/USBSerial.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="206" src="http://1.bp.blogspot.com/-_SyGBBgXxHQ/TxnPKR9I9FI/AAAAAAAAEs8/zX6d98BEK7k/s320/USBSerial.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;El programa:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;El programa más sencillo que se puede hacer con Arduino, y que nos muestre su funcionamiento, es hacer parpadear un led. Concretamente el led 13, que es el único que tiene. Seria el equivalente al típico "Hello World". El programa es el siguiente:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="cpp" name="code"&gt;void setup()&lt;br /&gt;{&lt;br /&gt;   pinMode(13, OUTPUT);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void loop()&lt;br /&gt;{&lt;br /&gt;   digitalWrite(13, HIGH);&lt;br /&gt;   delay(1000);&lt;br /&gt;   digitalWrite(13, LOW);&lt;br /&gt;   delay(1000);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;El entorno&amp;nbsp; de Arduino llama a la función setup() al iniciar. Aprovechamos esta función para configurar el pin 13 como salida. La función loop() es llamada indefinidamente, por lo que en ella ponemos el cuerpo del programa. Lo que hacemos es encender el led, esperar un segundo, apagar el led y esperar de nuevo. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cargar el firmware:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Una vez tenemos el programa podemos&amp;nbsp; cargarlo al Arduino de dos formas, en función de si disponemos del adaptador USB o del programador.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En el primer caso podemos usar &lt;a href="http://arduino.cc/en/Main/Software"&gt;el software de Arduino&lt;/a&gt;.&amp;nbsp; Es la forma más sencilla, simplemente escribimos el programa en el entorno de programación y lo cargamos con la opción "Upload".&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Hp_ZaFkWbDs/TxnaulQuATI/AAAAAAAAEtE/Epb5cuFtAF4/s1600/300px-Arduino-ide-3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-Hp_ZaFkWbDs/TxnaulQuATI/AAAAAAAAEtE/Epb5cuFtAF4/s320/300px-Arduino-ide-3.jpg" width="289" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Si queremos usar el programador, la forma más sencilla de hacerlo consiste en usar el entorno de programación de Arduino para compilar el programa y el programa avrdude para subir el firmware. Podemos hacerlo con el siguiente comando:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;pre class="cpp" name="code"&gt;sudo avrdude -c avrispmkII -p m328p -u -U flash:w:firmware.hex -P usb&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Donde firmware.hex es el archivo generado por el entorno de programación de Arduino.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Resultados:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Si todo ha funcionado como es debido, veremos como el led de la placa parpadea. Ya tenemos nuestro "Hello World"!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7724051650727969705?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7724051650727969705/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7724051650727969705' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7724051650727969705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7724051650727969705'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2012/01/introduccion-arduino-ethernet-hello.html' title='Introducción a Arduino Ethernet: Hello World'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-sBYBWDCA6ys/TxnLoPejbPI/AAAAAAAAEss/LKWJu_9iteA/s72-c/Arduino_ETH_senza_POE.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-461053574532020831</id><published>2012-01-19T22:02:00.001+01:00</published><updated>2012-01-20T17:48:09.451+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Esteganografía'/><title type='text'>Esteganografía moderna</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La primera aparición de la Esteganografía en medios digitales la realizó G. J. Simmons &amp;nbsp;en 1983 [1]. En el se habla de las posibles implicaciones políticas de enviar datos a través de canales encubiertos y se plantea el problema del prisionero.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;El problema del prisionero:&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Alice y Bob son encarcelados en celdas separadas. Pueden comunicarse y quieren planear una fuga, pero sus mensajes son monitorizados por el carcelero Eve. Si Eve descubre que Alice y Bob están intercambiando mensajes secretos no dejará que vuelvan a comunicarse. Por ello, Alice y Bob recurren a la Esteganografía para comunicarse. &lt;br /&gt;&lt;br /&gt;En el problema el prisionero hay que destacar que Eve cortará la comunicación si detecta que Alice y Bob se comunican de manera secreta. No es necesario que Eve tenga acceso al mensaje, sólo que lo detecte. Así, un sistema de&amp;nbsp;&lt;b&gt;Esteganografía&lt;/b&gt;&amp;nbsp;se considerará roto si puede ser detectada la existencia de un mensaje. No es necesario acceder a su contenido, esto formaría parte del&lt;b&gt;&amp;nbsp;Estegoanálsisis forense&lt;/b&gt;&amp;nbsp;(extracción del mensaje) y del&amp;nbsp;&lt;b&gt;criptoanálisis&lt;/b&gt;&amp;nbsp;(descifrado del mensaje).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;En el problema del prisionero se asume que Eve conoce el algoritmo usado para esconder los datos pero no la clave. Este es un requisito tomado de la Criptografía, que forma parte de los conocidos&amp;nbsp;&lt;a data-mce-href="http://en.wikipedia.org/wiki/Kerckhoffs's_principle" href="http://en.wikipedia.org/wiki/Kerckhoffs%27s_principle"&gt;Principios de Kerchhoff&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Referencias:&lt;/b&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;[1] G. J. Simmons. The prisoner's problem and the subliminal channel. D. Chaum editor,&amp;nbsp;advances in Criptology, CRYPTO '83, pages 51-67, Santa Barbara, CA, August 22-24, 1983. New York: Plenum Press.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-461053574532020831?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/461053574532020831/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=461053574532020831' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/461053574532020831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/461053574532020831'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2012/01/la-primera-aparicion-de-la.html' title='Esteganografía moderna'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7113510524161302587</id><published>2010-12-29T17:07:00.001+01:00</published><updated>2012-01-20T09:26:10.585+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenDomo'/><title type='text'>Control del Árbol de Navidad con OpenDomo</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Vemos en OpenDomo un video donde se muestra paso a paso como usar el &lt;a href="http://opendomo.com/main/products"&gt;Kit de desarrollo de &amp;nbsp;OpenDomo&lt;/a&gt; para controlar un árbol de Navidad. Aunque serviría para controlar cualquier dispositivo eléctrico.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Os dejo la &lt;a href="http://es.opendomo.org/node/261"&gt;URL del video&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7113510524161302587?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7113510524161302587/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7113510524161302587' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7113510524161302587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7113510524161302587'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2010/12/control-del-arbol-de-navidad-con.html' title='Control del Árbol de Navidad con OpenDomo'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-8492517102335979987</id><published>2010-11-11T20:00:00.000+01:00</published><updated>2012-01-19T23:48:14.557+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Criptoanálisis'/><title type='text'>Cryptoland</title><content type='html'>Cryptograms, puzzles, programming and other challenges.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/#!/cryptoland"&gt;http://twitter.com/#!/cryptoland&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-8492517102335979987?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/8492517102335979987/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=8492517102335979987' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8492517102335979987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8492517102335979987'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2010/11/cryptoland.html' title='Cryptoland'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4083265431064921792</id><published>2010-06-13T13:31:00.004+02:00</published><updated>2012-01-20T09:26:10.577+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenDomo'/><title type='text'>OpenDomo 0.8.3 publicado</title><content type='html'>&lt;div style="text-align: justify;"&gt;La versión &lt;a href="http://opendomo.googlecode.com/files/opendomo-0.8.3-486.iso"&gt;0.8.3&lt;/a&gt; de OpenDomo ha visto la luz recientemente. Para el que todavía no lo sepa, OpenDomo es un sofware de domótica completamente libre,  que permite entre otras cosas, controlar dispositivos eléctricos o disponer de  un sistema de videovigilancia. Así que si no lo has probado todavía, a qué esperas!!!&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;A continuación dejo una lista de los cambios más importantes, respecto a la versión anterior.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p style="text-align: justify;"&gt;La distribución incluye:&lt;/p&gt; &lt;ul style="text-align: justify;"&gt;&lt;li&gt;Kernel linux versión 2.6.33&lt;/li&gt;&lt;li&gt;Kit de herramientas &lt;a href="http://www.busybox.net/" target="_blank"&gt;busybox&lt;/a&gt; versión 1.16.1 (toolchain actualizado a 2010.05)&lt;/li&gt;&lt;li&gt;&lt;a href="http://es.opendomo.org/odpkg" title="Administrador de paquetes"&gt;odpkg&lt;/a&gt;, &lt;a href="http://es.opendomo.org/odcgi" title="Interfaz web"&gt;odcgi&lt;/a&gt;, &lt;a href="http://es.opendomo.org/odcommon" title="Archivos comunes"&gt;odcommon&lt;/a&gt; y &lt;a href="http://es.opendomo.org/oddiscovery" title="Sincronización de la red OpenDomo"&gt;oddiscovery&lt;/a&gt; preinstalados en el sistema base&lt;/li&gt;&lt;/ul&gt; &lt;p style="text-align: justify;"&gt;Además de incluir gran parte de los paquetes habituales, las principales novedades son:&lt;/p&gt; &lt;ul style="text-align: justify;"&gt;&lt;li&gt;Nueva arquitectura de gestión de discos con &lt;strong&gt;libata&lt;/strong&gt;, el nuevo controlador del kernel de linux&lt;/li&gt;&lt;li&gt;Múltiples actualizaciones de las herramientas del sistema base, con importantes mejoras de estabilidad&lt;/li&gt;&lt;li&gt;&lt;a href="http://es.opendomo.org/cherokee" title="Cherokee"&gt;Cherokee&lt;/a&gt; incluido en el repositorio local, para un mayor rendimiento y seguridad en las conexiones&lt;/li&gt;&lt;li&gt;Nuevo formato unificado de configuración, empezando por los archivos &lt;a href="http://es.opendomo.org/system-network" title="Configuración de red"&gt;network.conf&lt;/a&gt; y &lt;a href="http://es.opendomo.org/opendomo.cfg" title="Archivo de configuración opendomo.cfg"&gt;opendomo.cfg&lt;/a&gt;, afectando también a la &lt;a href="http://es.opendomo.org/odvideo" title="Videovigilancia"&gt;videovigilancia&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Scripts de uso común optimizados para un máximo rendimiento en equipos pequeños&lt;/li&gt;&lt;li&gt;División por zonas soportada por &lt;a href="http://es.opendomo.org/odvideo" title="Videovigilancia"&gt;odvideo&lt;/a&gt; y &lt;a href="http://es.opendomo.org/odcontrol" title="Control de dispositivos"&gt;odcontrol&lt;/a&gt;, permitiendo configurar las cámaras y dispositivos que se encuentran en cada una de ellas&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Actualización manual desde ISO soportada, permitiendo una mejor transición entre versiones&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;a href="http://es.opendomo.org/odcgi" title="Interfaz web"&gt;Interfaz web&lt;/a&gt; parcialmente reescrita incorporando funciones complementarias en Javascript. Scripts de configuración de la interfaz integrados y temas visuales renovados. Caché habilitada, reduciendo en un 20% la transferencia por HTTP&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Posibilidad de almacenar librerías y archivos log en disco, permitiendo la instalación de paquetes de gran tamaño sin riesgo de agotar el ramdrive&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Mejoras en la gestión de almacenaje, permitiendo el arranque desde CD/ISO, almacenando la configuración en disco&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-4083265431064921792?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/4083265431064921792/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=4083265431064921792' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4083265431064921792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4083265431064921792'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2010/06/opendomo-083-publicado.html' title='OpenDomo 0.8.3 publicado'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-1795953814747087209</id><published>2010-06-10T20:00:00.000+02:00</published><updated>2012-01-19T23:36:19.432+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sistemas Operativos'/><title type='text'>Acceso 'tipo BSD' al histórico de Bash</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Una cosa que siempre añoré de la shell de los sistemas BSD es la posiblidad de recorrer el histórico de comandos que empiezan con los caracteres tecleados en consola. En ocasiones mucho más práctico que el Ctrl+R habitual de Bash.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Pues bien, ahora puedo tenerlos los dos :)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Solo es necesario añadir a /etc/inputrc estas dos lineas.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"\e[5~": history-search-backward&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"\e[6~": history-search-forward&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Lo que le dará a Bash esta interesante funcionalidad con las teclas RePag y AvPag.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-1795953814747087209?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/1795953814747087209/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=1795953814747087209' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1795953814747087209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1795953814747087209'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2010/06/acceso-tipo-bsd-al-historico-de-bash.html' title='Acceso &apos;tipo BSD&apos; al histórico de Bash'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-658036388696812999</id><published>2010-05-30T23:00:00.002+02:00</published><updated>2012-01-19T23:51:21.686+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2010'/><title type='text'>Criptograma  30/05/010</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;CSQSQ TLTDR UTOHT CRVHP WYETU SWSHT RYSHP &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;LETYT OSVSW RHHPW YETRE LTOCT PVHCT PV&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;XXX&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-658036388696812999?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/658036388696812999/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=658036388696812999' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/658036388696812999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/658036388696812999'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/09/criptograma-semanal-3005010.html' title='Criptograma  30/05/010'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-1892870662970781848</id><published>2010-02-19T08:27:00.000+01:00</published><updated>2012-01-19T23:51:21.610+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2010'/><title type='text'>Criptograma 19/02/10</title><content type='html'>Después de algun tiempo de descanso, vamos con uno de facilito:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;LDDOF ENADR AOCSL ASSGX APENU GZLEO DDYEL CAAAR HALSE AATMU &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;INAOA LMTIA URAUR DRAIC NEDLH ASORM MTNSZ OLSSH AIAOO AACEO &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-1892870662970781848?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/1892870662970781848/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=1892870662970781848' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1892870662970781848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1892870662970781848'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2010/02/criptograma-190210.html' title='Criptograma 19/02/10'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-9162399021124239006</id><published>2009-12-31T13:46:00.001+01:00</published><updated>2012-01-19T23:51:21.735+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 30/07/09: Solución</title><content type='html'>Viendo que acaba el año y el criptograma continúa inexpugnable, aquí os dejo la solución.&lt;br /&gt;&lt;br /&gt;CIFRADO:&lt;br /&gt;BPJTALUJBPUPRFBIISASIYRTJTMSAKGMCPCRRPPBALC&lt;br /&gt;AAKTPSOCUPFAPKIFKRNOPRSKABPUPSMDFSOKETCPFCP&lt;br /&gt;&lt;br /&gt;CLAVE:&lt;br /&gt;CRISIS&lt;br /&gt;&lt;br /&gt;MENSAJE:&lt;br /&gt;EN LOS MOMENTOS DE CRISIS SOLO LA IMAGINACION&lt;br /&gt;ES MAS IMPORTANTE QUE EL CONOCIMIENTO&lt;br /&gt;ALBERT EINSTEIN&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Aprovecho para desearos un feliz comienzo de año!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-9162399021124239006?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/9162399021124239006/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=9162399021124239006' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/9162399021124239006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/9162399021124239006'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/12/criptograma-300709-solucion.html' title='Criptograma 30/07/09: Solución'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4648505797063275353</id><published>2009-10-25T18:24:00.004+01:00</published><updated>2012-01-19T23:51:21.644+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 30/07/09: Pista</title><content type='html'>Dado que se resiste, y ni el increible Altair consigue dar con la solución, ahí va una pista.&lt;br /&gt;&lt;br /&gt;Se trata de un cifrado Playfair.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dlerch.blogspot.com/2009/07/criptograma-300709.html"&gt;Criptograma 30/07/09&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-4648505797063275353?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/4648505797063275353/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=4648505797063275353' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4648505797063275353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4648505797063275353'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/10/criptograma-300709-pista.html' title='Criptograma 30/07/09: Pista'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7749952474695662994</id><published>2009-10-25T18:18:00.002+01:00</published><updated>2012-01-19T23:51:21.709+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 16/07/09: Solución</title><content type='html'>Cada par de letras del criptograma correspondía a una letra del mensaje en claro. Tomando esto como hipótesis se podía recurrir a un análisis de frecuencias tradicional.&lt;br /&gt;&lt;br /&gt;Enhorabuena Altair.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;HO LA BU HO DE MI MA HO LA SI TU MA &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;E  S  M  E  J  O  R  E  S  T  A  R  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;CE TU NA NA TU BI MI CI RU TU MA HO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;C  A  L  L  A  D  O  Y  P  A  R  E  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;CE HO MA SI MI RU SI MI RE FA HO DO &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;C  E  R  T  O  N  T  O  Q  U  E  H  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;TU BL NA TU MA CI BI HO LA RU HO SS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;A  B  L  A  R  Y  D  E  S  P  E  J&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;TU MA NA TU LA BI FA BI TU LA BI HO &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;A  R  L  A  S  D  U  D  A  S  D  E  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;GR UX RU UX SI UX GU TU BU HO RU SI&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;F  I  N  I  T  I  V  A  M  E  N  T&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;HO RR MA MI FA YY MI BU TU MA YY&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;E  G  R  O  U  X  O  M  A  R  X&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7749952474695662994?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7749952474695662994/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7749952474695662994' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7749952474695662994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7749952474695662994'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/10/criptograma-160709-solucion.html' title='Criptograma 16/07/09: Solución'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-5377097655754036061</id><published>2009-09-04T10:02:00.003+02:00</published><updated>2012-01-19T23:22:23.667+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>ssh en batch sin expect</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ssh y scp no permiten pasar la contraseña como parámetro, lo que complica las cosas a la hora de automatizar tareas. Normalmente se suele recurrir a dos tipos de soluciones: distribuir claves sin password y/o usar expect. La primera no siempre es posible, pues a veces no se tiene el control del servidor. La segunda es más habitual, aunque en ocasiones no se dispone de 'expect', problema con el que me he encontrado recientemente en el proyecto &lt;a href="http://www.opendomo.org/"&gt;OpenDomo&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;Como consecuencia he desarrollado la herramienta sshbatch, que permite realizar comandos ssh y scp pasando la passwd como parámetro.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;Dejo &lt;a href="http://code.google.com/p/opendomo/source/browse/trunk/opendomo-discovery/src/sshbatch.c"&gt;aquí&lt;/a&gt; una copia del programa en C y un enlace al grupo de OpenDomo donde expliqué &lt;a href="http://groups.google.es/group/opendomo/browse_thread/thread/23674a43ca7b301b"&gt;como funciona&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-5377097655754036061?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/5377097655754036061/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=5377097655754036061' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/5377097655754036061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/5377097655754036061'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/09/ssh-en-batch-sin-expect.html' title='ssh en batch sin expect'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-3715228019273145153</id><published>2009-08-16T08:22:00.013+02:00</published><updated>2012-01-19T23:10:33.122+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vulnerabilidades'/><title type='text'>Cómo funciona el exploit sock_sendpage()</title><content type='html'>&lt;div style="text-align: justify;"&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;Tavis Ormandy y Julien Tinnes, del equipo de seguridad de Google, han descubierto un bug en el kernel Linux que nadie ha sido capaz de ver en los últimos ocho años. Este bug, que afecta a todas las versiones del kernel desde la 2.4.4 a la 2.4.37.4 y desde la 2.6.0 a la 2.6.30.4 permite escalar privilegios en el sistema. En este artículo vamos a analizar su funcionamiento.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Primer error:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Todo comienza en la función &lt;i&gt;sock_sendpage()&lt;/i&gt; situada en &lt;i&gt;net/socket.c&lt;/i&gt;. El problema reside en la llamada a sendpage() pues no se ha verificado que el puntero esté inicializado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name='code'&gt;static ssize_t sock_sendpage(struct file *file, struct page *page,&lt;br /&gt;              int offset, size_t size, loff_t *ppos, int more)&lt;br /&gt;{&lt;br /&gt;   struct socket *sock;&lt;br /&gt;   int flags;&lt;br /&gt;&lt;br /&gt;   sock = file-&gt;private_data;&lt;br /&gt;&lt;br /&gt;   flags = !(file-&gt;f_flags &amp;amp; O_NONBLOCK) ? 0 : MSG_DONTWAIT;&lt;br /&gt;   if (more)&lt;br /&gt;      flags |= MSG_MORE;&lt;br /&gt;&lt;br /&gt;   return sock-&gt;ops-&gt;sendpage(sock, page, offset, size, flags);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A continuación, dejo una copia de la función &lt;i&gt;sock_splice_read&lt;/i&gt;() que no tiene nada que ver ni con el bug ni con el exploit, pero nos sirve para ver como se podría haber evitado la vulnerabilidad.&amp;nbsp; En esta función se verifica el puntero a la función mediante &lt;i&gt;unlikely&lt;/i&gt;() antes su llamada.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name='code'&gt;static ssize_t sock_splice_read(struct file *file, loff_t *ppos,&lt;br /&gt;                 struct pipe_inode_info *pipe, size_t len,&lt;br /&gt;            unsigned int flags)&lt;br /&gt;{&lt;br /&gt;   struct socket *sock = file-&amp;gt;private_data;&lt;br /&gt;&lt;br /&gt;   if (unlikely(!sock-&amp;gt;ops-&amp;gt;splice_read))&lt;br /&gt;      return -EINVAL;&lt;br /&gt;&lt;br /&gt;   return sock-&amp;gt;ops-&amp;gt;splice_read(sock, ppos, pipe, len, flags);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Segundo error:&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hemos visto que no se verifica si el puntero a &lt;i&gt;sendpage&lt;/i&gt;() esta correctamente inicializado. Sera necesario ahora, encontrar situaciones en las que el puntero a la función &lt;i&gt;sendpage&lt;/i&gt;() no se haya inicialiado.&lt;br /&gt;&lt;br /&gt;Tavis Ormandy y Julien Tinnes en su investigación localizaron deficiencias en la incialización del puntero para la macro SOCKOPS_WRAP, definida en include/linux/net.h, que incluye PF_APPLETALK, PF_IPX, PF_IRDA, PF_X25 y PF_AX25. Tambien encontraron deficiencias en otros protocolos&amp;nbsp; como&amp;nbsp; PF_BLUETOOTH, PF_IUCV, PF_INET6 (con IPPROTO_SCTP), PF_PPPOX y PF_ISDN.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Veamos por ejemplo el caso del protocolo bluetooth. En &lt;i&gt;net/bluetooth/bnep/sock.c &lt;/i&gt;nos encontramos con la estructura &lt;i&gt;bnet_sock_ops&lt;/i&gt; en la que vemos que no se inicializa &lt;i&gt;sendpage&lt;/i&gt; con &lt;i&gt;sock_no_sendpage(&lt;/i&gt;), por lo que quedará apuntando a NULL. &lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name='code'&gt;static const struct proto_ops bnep_sock_ops = { &lt;br /&gt;        .family         = PF_BLUETOOTH,&lt;br /&gt;        .owner          = THIS_MODULE,&lt;br /&gt;        .release        = bnep_sock_release,&lt;br /&gt;        .ioctl          = bnep_sock_ioctl,&lt;br /&gt;#ifdef CONFIG_COMPAT&lt;br /&gt;        .compat_ioctl   = bnep_sock_compat_ioctl,&lt;br /&gt;#endif&lt;br /&gt;        .bind           = sock_no_bind,&lt;br /&gt;        .getname        = sock_no_getname,&lt;br /&gt;        .sendmsg        = sock_no_sendmsg,&lt;br /&gt;        .recvmsg        = sock_no_recvmsg,&lt;br /&gt;        .poll           = sock_no_poll,&lt;br /&gt;        .listen         = sock_no_listen,&lt;br /&gt;        .shutdown       = sock_no_shutdown,&lt;br /&gt;        .setsockopt     = sock_no_setsockopt,&lt;br /&gt;        .getsockopt     = sock_no_getsockopt,&lt;br /&gt;        .connect        = sock_no_connect,&lt;br /&gt;        .socketpair     = sock_no_socketpair,&lt;br /&gt;        .accept         = sock_no_accept,&lt;br /&gt;        .mmap           = sock_no_mmap&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El caso de SOCKOPS_WRAP es mas sutil, pues en &lt;i&gt;net/ipx/af_ipx.c&lt;/i&gt; todo parece correcto. Podemos ver la inicialización en la última linea. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name='code'&gt;static const struct proto_ops SOCKOPS_WRAPPED(ipx_dgram_ops) = {&lt;br /&gt;        .family         = PF_IPX,&lt;br /&gt;        .owner          = THIS_MODULE,&lt;br /&gt;        .release        = ipx_release,&lt;br /&gt;        .bind           = ipx_bind,&lt;br /&gt;        .connect        = ipx_connect,&lt;br /&gt;        .socketpair     = sock_no_socketpair,&lt;br /&gt;        .accept         = sock_no_accept,&lt;br /&gt;        .getname        = ipx_getname,&lt;br /&gt;        .poll           = datagram_poll,&lt;br /&gt;        .ioctl          = ipx_ioctl,&lt;br /&gt;#ifdef CONFIG_COMPAT&lt;br /&gt;        .compat_ioctl   = ipx_compat_ioctl,&lt;br /&gt;#endif&lt;br /&gt;        .listen         = sock_no_listen,&lt;br /&gt;        .shutdown       = sock_no_shutdown, /* FIXME: support shutdown */&lt;br /&gt;        .setsockopt     = ipx_setsockopt,&lt;br /&gt;        .getsockopt     = ipx_getsockopt,&lt;br /&gt;        .sendmsg        = ipx_sendmsg,&lt;br /&gt;        .recvmsg        = ipx_recvmsg,&lt;br /&gt;        .mmap           = sock_no_mmap,&lt;br /&gt;        .sendpage       = sock_no_sendpage,&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Sin embargo, si estudiamos con detenimiento la macro SOCKOPS_WRAP en &lt;i&gt;include/linux/net.h&lt;/i&gt; vemos que mietras otras llamadas se inicializan correctamente, no se realiza la inicialización de &lt;i&gt;sendpage&lt;/i&gt;. &lt;br /&gt;No pego el código por que es demasiado largo, consultar en &lt;i&gt;include/linux/net.h&lt;/i&gt; y ver que la última inicialización es la de &lt;i&gt;mmap&lt;/i&gt;(), olvidando &lt;i&gt;sendpage&lt;/i&gt;().&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cómo explotarlo?&lt;/b&gt;&lt;br /&gt;Lo primero que necesitaremos para explotar esta vulnerabilidad es una función que podamos ejecutar en espacio de usuario que use &lt;i&gt;sock_sendpage&lt;/i&gt;(). Hay muchas funciones que lo hacen, una de ellas es &lt;i&gt;sendfile()&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tavis Ormandy y Julien Tinnes y proponen como secuencia válida de llamadas para forzar el uso de &lt;i&gt;sendpage()&lt;/i&gt;, la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre class='cpp' name='code'&gt;/* ... */&lt;br /&gt;int fdin = mkstemp(template);&lt;br /&gt;int fdout = socket(PF_PPPOX, SOCK_DGRAM, 0);&lt;br /&gt;&lt;br /&gt;unlink(template);&lt;br /&gt;&lt;br /&gt;ftruncate(fdin, PAGE_SIZE);&lt;br /&gt;&lt;br /&gt;sendfile(fdout, fdin, NULL, PAGE_SIZE);&lt;br /&gt;/* ... */&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cuando se ejecute la función &lt;i&gt;sendpage&lt;/i&gt;(), si esta no está inicializada y apunta a NULL, el kernel intentará ejecutar las instrucciones que hay en la dirección 0. Podemos aprovechar esto mapeando la dirección 0 y almacenando allí las instrucciones que queremos que ejecute el kernel. Así, cuando se intente ejecutar &lt;i&gt;sendpage&lt;/i&gt;() realmente se ejecutará nuestro código en espacio de kernel. Podremos escalar privilegios haciendo que el código almecando en la dirección 0 ponga nuestros uid a cero (root).&lt;br /&gt;&lt;br /&gt;Este tipo de bugs son muy comunes en el kernel Linux y se conocen como bugs por 'NULL pointer dereference'. Ya vimos aquí uno de estos con &lt;a href="http://dlerch.blogspot.com/2008/02/cmo-funciona-el-exploit-vmsplice.html"&gt;el exploit vmsplice&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En las referencias dejo un ejemplo de exploit.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;b&gt;referencias:&lt;/b&gt;&lt;/div&gt;- &lt;a href="http://www.securityfocus.com/archive/1/505751"&gt;http://www.securityfocus.com/archive/1/505751&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://blog.cr0.org/2009/08/linux-null-pointer-dereference-due-to.html"&gt;http://blog.cr0.org/2009/08/linux-null-pointer-dereference-due-to.html&lt;/a&gt;&lt;br /&gt;- exploit: &lt;a href='http://www.frasunek.com/proto_ops.tgz'&gt;http://www.frasunek.com/proto_ops.tgz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-3715228019273145153?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/3715228019273145153/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=3715228019273145153' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3715228019273145153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3715228019273145153'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/08/como-funciona-el-exploit-socksendpage.html' title='Cómo funciona el exploit sock_sendpage()'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-5231737811640327244</id><published>2009-08-05T14:00:00.000+02:00</published><updated>2012-01-19T23:51:21.656+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma Principiantes 05/08/09</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;RJ BZR KWPSJHLMHZR CJMJLRLG LAJVJMJZR AL BK NJRNK VZWNK LG PSL BZR UWZOWKNKAZWLR LRMWJTLG UWZOWKNKR, LB UWJNLW UKQKWZ MKWUJGHLWZ PSL UKRKRL UZW KPSJ ALRHWSJWJK BK MJXJBJFKMJZG.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;OLWKBA ILJNTLWO&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-5231737811640327244?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/5231737811640327244/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=5231737811640327244' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/5231737811640327244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/5231737811640327244'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/08/criptograma-principiantes-050809.html' title='Criptograma Principiantes 05/08/09'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-6315775483529318464</id><published>2009-07-30T13:48:00.002+02:00</published><updated>2012-01-19T23:51:21.680+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 30/07/09</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;BPJTALUJBPUPRFBIISASIYRTJTMSAKGMCPCRRPPBALC&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;AAKTPSOCUPFAPKIFKRNOPRSKABPUPSMDFSOKETCPFCP&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-6315775483529318464?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/6315775483529318464/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=6315775483529318464' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6315775483529318464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6315775483529318464'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/07/criptograma-300709.html' title='Criptograma 30/07/09'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-2543239157626428562</id><published>2009-07-24T22:13:00.001+02:00</published><updated>2012-01-19T23:34:48.155+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inteligencia Artificial'/><title type='text'>El impresionante Robot Asimo de Honda</title><content type='html'>&lt;div style="text-align: justify;"&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;Empezó siendo un robot torpón que a duras penas andaba. Después nos sorprendió subiendo escalareas... e incluso corriendo. Increible lo que estan consiguiendo los ingenieros de Honda.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp; &lt;/div&gt;&lt;center&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WwP0rdh-w7Q&amp;hl=es&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/WwP0rdh-w7Q&amp;hl=es&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-2543239157626428562?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/2543239157626428562/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=2543239157626428562' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2543239157626428562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2543239157626428562'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/07/el-impresionante-robot-asimo-de-honda.html' title='El impresionante Robot Asimo de Honda'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7584525516065973444</id><published>2009-07-16T01:08:00.001+02:00</published><updated>2012-01-19T23:51:21.707+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 16/07/09</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;HOLAB UHODE MIMAH OLASI TUMAC ETUNA NATUB IMICI RUTUM &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;AHOCE HOMAS IMIRU SIMIR EFAHO DOTUB LNATU MACIB IHOLA &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;RUHOS STUMA NATUL ABIFA BITUL ABIHO GRUXR UUXSI UXGUT &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;UBUHO RUSIH ORRMA MIFAY YMIBU TUMAY YXXXX&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7584525516065973444?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7584525516065973444/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7584525516065973444' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7584525516065973444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7584525516065973444'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/07/criptograma-150709.html' title='Criptograma 16/07/09'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-2898000520864869134</id><published>2009-07-09T08:27:00.007+02:00</published><updated>2012-01-19T23:21:50.754+01:00</updated><title type='text'>Comandos útiles para Vim</title><content type='html'>&amp;nbsp; &lt;br /&gt;" las funciones de autocompletado buscan en los directorios indicados&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;: set path=/usr/include,/usr/local/include&lt;/div&gt;&lt;br /&gt;" Habilita el coloreado de sintaxis&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;: syntax on&lt;/div&gt;&lt;br /&gt;" habilita el auto indentado&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;: set autoindent&lt;/div&gt;&lt;br /&gt;" habilita el auto indentado inteligente&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;: set smartindent&lt;/div&gt;&lt;br /&gt;" Define 3 espacios para el indentado&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;:set shiftwidth=3&lt;/div&gt;&lt;br /&gt;" Convierte tabulados en espacios. Deshabilitar con :set noexpandtab &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;: set expandtab&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" Hace que los tabuladores sean de tres espacios &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;: set tabstop=3&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" Plega bloques delimitados por {{{ }}}. Usando fdm=syntax no se necesitan marcas&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;: set fdm=marker&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" Establece los nivels de anidamiento para plegar código.&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;: set foldnestmax=1&lt;/div&gt;&lt;br /&gt;" Marca el parentesis/llave que abre y el que cierra al situarse encima. &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;: set showmatch&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" La marca habilitada con 'showmatch' dura un segundo. &lt;br /&gt;&lt;span style="color: #93c47d;"&gt;: set matchtime=1&amp;nbsp;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;" Aparecen indicadores con el numero de linea, de columna, etc. &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;: set ruler&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" Cuando se abre un archivo coloca el cursor en su posicion del ultimo cierre&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;if has("autocmd")&lt;/div&gt;&lt;div style="color: #93c47d;"&gt;&amp;nbsp; au BufReadPost * if line("'\"") &amp;gt; 0 &amp;amp;&amp;amp; line("'\"") &amp;lt;= line("$")&lt;/div&gt;&lt;div style="color: #93c47d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; \| exe "normal! g'\"" | endif&lt;/div&gt;&lt;div style="color: #93c47d;"&gt;endif&lt;/div&gt;&lt;br /&gt;" Pinta los resultados de la busqueda&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;: set hlsearch&lt;/div&gt;&lt;br /&gt;" Cierra un bloque delimitado por {{{ }}}.&amp;nbsp; &lt;br /&gt;" Se abre pulsando el espacio sobre el bloque. &lt;br /&gt;&lt;span style="color: #93c47d;"&gt;: foldclose&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;" Entra en modo insercion a continuacion de la posicion actual &lt;br /&gt;&lt;span style="color: #93c47d;"&gt;a&amp;nbsp;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;" Entra en modo insercion en la posicion actual &lt;br /&gt;&lt;span style="color: #93c47d;"&gt;i&amp;nbsp;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;" Deshace los cambios &lt;br /&gt;&lt;span style="color: #93c47d;"&gt;u&amp;nbsp;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;" Rehace los cambios &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;:redo&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" Guarda los cambios &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;:w!&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" Guarda los cambios en el fiechero 'file' &lt;br /&gt;&lt;span style="color: #93c47d;"&gt;:w! file&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;" Sale sin guardar &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;:q!&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" Mueve el cursor al final del fichero &lt;br /&gt;&lt;span style="color: #93c47d;"&gt;G&lt;/span&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;" Mueve el cursor al principio del fichero &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;gg &lt;/div&gt;&lt;br /&gt;" Mueve el cursor a la linea N &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;N G&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" Entra en modo visual. Seleccion a nivel de columnas. &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;ctrl + v&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" Entra en modo visual. Seleccion de todo el texto. &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;ctrl + v v&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" Corta/borra el texto seleccionado &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;dd&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" Copia el texto seleccionado &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;y&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" Pega el texto del portapapeles &lt;br /&gt;&lt;div style="color: #93c47d;"&gt;p&amp;nbsp; &lt;/div&gt;&lt;br /&gt;" Sustituye from por to, pidiendo confirmacion &lt;br /&gt;&lt;span style="color: #93c47d;"&gt;:%s/from/to/gc&lt;/span&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;" Sustituye from por to, pidiendo confirmacion de un texto seleccionado.&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;:'&amp;lt;,'&amp;gt;s/from/to/gc&lt;/div&gt;&lt;br /&gt;" Ir al principio de la linea&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;0&lt;/div&gt;&lt;br /&gt;" Ir al final de la linea&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;$&lt;/div&gt;&lt;br /&gt;" Ir a la palabra siguiente&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;w&lt;br /&gt;&lt;/div&gt;" Busca palabras como la situada debajo del cursor&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;#&lt;/div&gt;&lt;br /&gt;" Abre la pagina man de la función sobre la que se encuentra el cursor&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;K&lt;/div&gt;&lt;br /&gt;" Salta a la definición/declaración de la variable sobre la que se encuentra el cursor&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;gd&lt;/div&gt;&lt;br /&gt;" Salta al parentesis/llave asociado al parentesis/llave sobre el que se encuentra el cursor&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;%&lt;/div&gt;&lt;br /&gt;" Abre una pestaña con el fichero 'file'&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;: tabnew file&lt;/div&gt;&lt;br /&gt;# Salta de una pestaña a otra&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;gt&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;" Divide la ventana en dos abriendo el fichero 'file'&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;: split file&lt;/div&gt;&lt;br /&gt;" Salta de una ventana a otra&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;Ctrl+w w&lt;/div&gt;&lt;br /&gt;" Autocompleta la palabra&lt;br /&gt;&lt;div style="color: #93c47d;"&gt;Ctrl + p&lt;/div&gt;&lt;div style="color: #93c47d;"&gt;Ctrl + n&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-2898000520864869134?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/2898000520864869134/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=2898000520864869134' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2898000520864869134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2898000520864869134'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/07/comandos-utiles-para-vim.html' title='Comandos útiles para Vim'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4708882978922891302</id><published>2009-07-06T07:31:00.000+02:00</published><updated>2012-01-19T23:10:33.144+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sistemas Operativos'/><category scheme='http://www.blogger.com/atom/ns#' term='Vulnerabilidades'/><title type='text'>Estamos dentro de VMWare?</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A continuacion dejo un programa que permite detectar si nuestro servidor se encuentra dentro de una maquina virtual VMWare. Utiliza una tecnica descubierta por Ken Kato que consiste en encontrar el Backdoor I/O port. Este puerto es el que utiliza VMWare para comunicarse con la maquina virtual. Como dicho puerto no existe en un servidor normal su deteccion indica que nos encontramos bajo VMWare.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;/*&lt;br /&gt; * 4tphi-vmchk.c&lt;br /&gt; * Detects if you are in a VMWare virtual machine.&lt;br /&gt; *&lt;br /&gt; * Written by Andrew Hintz &lt;http://guh.nu&gt;&lt;br /&gt; * and AAron Walters&lt;br /&gt; * Fortify Research Laboratories &lt;http://4tphi.net&gt;&lt;br /&gt; *&lt;br /&gt; * "Oft at the hives of his tame bees&lt;br /&gt; * They would their sugary thirst appease."&lt;br /&gt; *&lt;br /&gt; * This program is based on info and code from:&lt;br /&gt; * http://chitchat.tripod.co.jp/vmware/&lt;br /&gt; * by chitchat_at_lycos.jp&lt;br /&gt; *&lt;br /&gt; * Notes:&lt;br /&gt; * The program can be run as a normal user.&lt;br /&gt; * We tested the program only in x86 Linux.&lt;br /&gt; * The m4dn3ss lives on!&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/signal.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#if __INTSIZE == 2 /* 16 bit environment */&lt;br /&gt;typedef unsigned int uint16;&lt;br /&gt;typedef unsigned long uint32;&lt;br /&gt;#else /* 32 bit environment */&lt;br /&gt;typedef unsigned short uint16;&lt;br /&gt;typedef unsigned int uint32;&lt;br /&gt;#endif /* __INTSIZE */&lt;br /&gt;&lt;br /&gt;void segfault()&lt;br /&gt;{&lt;br /&gt;  printf("Not running inside VMware.\n");&lt;br /&gt;  exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;  uint32 verMajor, verMinor, magic, dout;&lt;br /&gt;&lt;br /&gt;  signal(SIGSEGV, segfault);&lt;br /&gt;&lt;br /&gt;  __asm__ __volatile__ &lt;br /&gt;   (&lt;br /&gt;   "mov $0x564D5868, %%eax; /* magic number */"&lt;br /&gt;   "mov $0x3c6cf712, %%ebx; /* random number */"&lt;br /&gt;   "mov $0x0000000A, %%ecx; /* specifies command */"&lt;br /&gt;   "mov $0x5658, %%edx; /* VMware I/O port */"&lt;br /&gt;   "in %%dx, %%eax;"&lt;br /&gt;   "mov %%eax, %0;"&lt;br /&gt;   "mov %%ebx, %1;"&lt;br /&gt;   "mov %%ecx, %2;"&lt;br /&gt;   "mov %%edx, %3;"&lt;br /&gt;    : "=r"(verMajor), "=r"(magic), "=r"(verMinor), "=r"(dout)&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;  if (magic == 0x564D5868) &lt;br /&gt;  {&lt;br /&gt;    printf("Running inside VMware. ");&lt;br /&gt;    printf("(Version %lu,%lu)\n", verMajor, verMinor);&lt;br /&gt;    /* I'm not really sure what the versions mean. */&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return 0;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/http://4tphi.net&gt;&lt;/http://guh.nu&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-4708882978922891302?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/4708882978922891302/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=4708882978922891302' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4708882978922891302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4708882978922891302'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/07/estamos-dentro-de-vmware.html' title='Estamos dentro de VMWare?'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-3335344056997058206</id><published>2009-06-17T23:40:00.004+02:00</published><updated>2012-01-20T09:26:10.573+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenDomo'/><title type='text'>OpenDomo visto desde un iPod touch</title><content type='html'>Dejo una foto de un sistema OpenDomo controlado desde un iPod Touch, en el se accede al sistema de videovigilancia.&lt;br /&gt;Cortesía de Isidro, uno de los desarrolladores principales de &lt;a href="http://www.opendomo.org/"&gt;OpenDomo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.opendomo.com/files/ipod.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="420" src="http://www.opendomo.com/files/ipod.jpg" width="312" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enlace original:&lt;br /&gt;&lt;a href="http://www.opendomo.com/drupal/node/55"&gt;http://www.opendomo.com/drupal/node/55&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-3335344056997058206?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/3335344056997058206/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=3335344056997058206' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3335344056997058206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3335344056997058206'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/06/opendomo-visto-desde-un-ipod.html' title='OpenDomo visto desde un iPod touch'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7817493702394739801</id><published>2009-06-17T23:28:00.001+02:00</published><updated>2012-01-20T09:26:10.587+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenDomo'/><title type='text'>Control de sensores e interruptores con OpenDomo</title><content type='html'>&amp;nbsp; &lt;br /&gt;Recientemente he publicado un manual en OpenDomo que explica como controlar sensores e interruptores.&lt;br /&gt;Por fin opendomo puede usarse en sistemas reales, aunque esté todavía en fase alpha.&lt;br /&gt;&lt;br /&gt;Dejop un enlace al manual:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.opendomo.com/drupal/node/54"&gt;¿Cómo controlar sensores e interruptores con OpenDomo y Micropik PS3X8?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7817493702394739801?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7817493702394739801/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7817493702394739801' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7817493702394739801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7817493702394739801'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/06/control-de-sensores-e-interruptores-con.html' title='Control de sensores e interruptores con OpenDomo'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4014202511462320563</id><published>2009-06-12T07:31:00.004+02:00</published><updated>2012-01-19T23:51:21.636+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 11/04/09: Solución</title><content type='html'>&amp;nbsp; &amp;nbsp; &lt;br /&gt;Se trataba de un autocifrado, cuya clave era nada más y nada menos que "AUTOCIFRADO" ;)&lt;br /&gt;&lt;br /&gt;Aquí tenéis un ejemplo de como se hace el cifrado:&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;SIHEVISTOMASLEJOSESPORQUEESTOYSENTADOSOBREHOMBROSDEGIGANTESISAACNEWTON&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;AUTOCIFRADOSIHEVISTOMASLEJOSESPORQUEESTOYSENTADOSOBREHOMBROSDEGIGANTES&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;======================================================================&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;SCASXQXKOPOKTLNJAWLDARIFINGLSQHSEJUHSKHPPWLBFBUCKRFXMNOZUVGAVEGKTEJMSF&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;y un ejemplo de como se descifra:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;SCASXQXKOPOKTLNJAWLDARIFINGLSQHSEJUHSKHPPWLBFBUCKRFXMNOZUVGAVEGKTEJMSF&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;AUTOCIFRADO&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;===========&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;SIHEVISTOMA&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIHEVISTOMA&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ===========&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SLEJOSESPOR&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SLEJOSESPOR&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ===========&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QUEESTOYSEN&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QUEESTOYSEN&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ===========&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TADOSOBREHO&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TADOSOBREHO&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ===========&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MBROSDEGIGA&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MBROSDEGIGA&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ===========&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NTESISAACNE&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NTES&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ====&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WTON&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Habéis perdido el interés o es que era muy difícil?! :)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-4014202511462320563?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/4014202511462320563/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=4014202511462320563' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4014202511462320563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4014202511462320563'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/06/criptograma-110409-solucion.html' title='Criptograma 11/04/09: Solución'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-474231802644478823</id><published>2009-06-07T22:27:00.001+02:00</published><updated>2012-01-19T23:34:48.184+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inteligencia Artificial'/><title type='text'>Librerías para Visión Artificial</title><content type='html'>&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;Excelente colección de código que implementa diferentes técnicas de visión artificial. Desde algoritmos 'sueltos' hasta librerías completas.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cs.cmu.edu/%7Ecil/v-source.html"&gt;http://www.cs.cmu.edu/~cil/v-source.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-474231802644478823?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/474231802644478823/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=474231802644478823' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/474231802644478823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/474231802644478823'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/06/librerias-para-vision-artificial.html' title='Librerías para Visión Artificial'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-9014164087751263143</id><published>2009-05-13T22:56:00.007+02:00</published><updated>2012-01-19T23:36:19.633+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sistemas Operativos'/><title type='text'>OpenBSD en el escritorio</title><content type='html'>&lt;div style="text-align: justify;"&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.openbsd.org/"&gt;OpenBSD&lt;/a&gt; es un Sistema Operativo centrado en la seguridad. Es muy apreciado en el mundo de los servidores no tan solo por su seguridad, si no por su gran estabilidad y su política de 'corrección' del código.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Desde hace algún tiempo he ido viendo posts de gente que lo usaba como entorno de escritorio. lo que me ha llevado a hacer mis propias pruebas. Esta no es su mejor baza, ni mucho menos. Pero si se quiere una roca como Sistema Operativo, hay que tenerla en cuenta.&lt;br /&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En este post explico el procedimiento para instalar OpenBSD en el escritorio. No es &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;, así que no esperéis nada parecido, pero tampoco resulta excesivamente complicado. Usaré OpenBSD 4.5 (la última en el momento de escribir el post) en una arquitectura AMD64. El que tenga otra arquitectura solo tendrá que sustituir en las URL amd64.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Instalación del sistema base&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Descargamos la imagen y la quemamos en un CD:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="ftp://ftp.openbsd.org/pub/OpenBSD/4.5/amd64/install45.iso"&gt;ftp://ftp.openbsd.org/pub/OpenBSD/4.5/amd64/install45.iso&lt;/a&gt;&lt;br /&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Arrancamos desde el CD y seguimos los pasos que se nos indican. En general, aunque es unainstalación en modo texto, no supone mucho problema: configuración de teclado, red, etc.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Lo que sí puede resultar difícil si no se está acostumbrado es el particionado de disco. Si no se sabe lo que se esta haciendo lo mejor es usar el disco entero para OpenBSD, o la pérdida de datos estará garantizada. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Esta parte está explicada en detalle en el siguiente enlace, en el punto 4.5.2:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.openbsd.org/faq/faq4.html"&gt;http://www.openbsd.org/faq/faq4.html&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Selección de paquetes&lt;/b&gt; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Durante la instalación se nos solicitarán los paquetes que queremos instalar. Los seleccionaremos todos, o como mínimo, los paquetes relacionados con las X.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Ejecutando las X&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En estos momentos tenemos un sistema base con las X, las cuales podemos ejecutar mediante el comando startx. Si no funcionan correctamente tendremos que revisar /etc/X11/xorg.conf y adaptarlo a nuestro sistema.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Instalando GNOME&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Habrá quien quiera instalar &lt;a href="http://www.kde.org/"&gt;KDE&lt;/a&gt;. Googlead un poco, no creo que sea muy diferente. Aquí instalaremos &lt;a href="http://www.gnome.org/"&gt;GNOME&lt;/a&gt;.&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Para poder instalar binarios de forma cómoda tendremos que establecer la variable de entorno&amp;nbsp;  PKG_PATH. Lo haremos añadiendo:&lt;br /&gt;&lt;br /&gt;export  PKG_PATH=&lt;a href="ftp://ftp.openbsd.org/pub/OpenBSD/4.5/packages/amd64/gnome-session-2.24.3p4.tgz"&gt;ftp://ftp.openbsd.org/pub/OpenBSD/4.5/packages/amd64/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;en el fichero ~/.profile. Así quedara configurada al reiniciar. &lt;br /&gt;&lt;br /&gt;Ahora, para instalar GNOME haremos: &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;$ pkg_add gnome-session&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&amp;nbsp; &lt;br /&gt;Y para que GNOME arranque al iniciar el sistema pondremos en /etc/rc.local&lt;br /&gt;/usr/local/bin/gdm -nodaemon &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Creación de usuarios &lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ejecutaremos:&lt;br /&gt;$ adduser&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Este nos irá preguntando lo típico: nombre de usario, shell a usar, contraseña, etc.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Si queremos que el usuario se pueda convertir en root con el comando 'su' necesitaremos añadirlo al grupo wheel. Lo haremos con:&lt;/div&gt;&lt;br /&gt;$ moduser -G wheel usuario&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y con esto, ya tenemos un espléndido OpenBSD en nuestro escritorio.&lt;br /&gt;&lt;br /&gt;Solo faltará instalar los paquetes que creamos necesarios como:&lt;br /&gt;&lt;br /&gt;$ pkg_add openoffice-3.0.1p2&lt;br /&gt;$ pkg_add firefox-i18n-es-ES-3.0.6&lt;br /&gt;&lt;br /&gt;etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-9014164087751263143?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/9014164087751263143/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=9014164087751263143' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/9014164087751263143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/9014164087751263143'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/05/openbsd-en-el-escritorio.html' title='OpenBSD en el escritorio'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7525137816325430642</id><published>2009-05-12T12:50:00.001+02:00</published><updated>2012-01-19T23:51:21.705+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Factorización'/><title type='text'>Factorización en tiempo  polinómico!?</title><content type='html'>&amp;nbsp;&amp;nbsp; &lt;br /&gt;Claus P. Schnorr ha presentado en el Eurocrypt 2009 "&lt;a href="http://eurocrypt2009rump.cr.yp.to/e074d37e10ad1ad227200ea7ba36cf73.pdf"&gt;Average Time Fast SVP and CVP Algorithms: Factoring Integers in Polynomial Time&lt;/a&gt;". &lt;br /&gt;&lt;br /&gt;Habría que ver el impacto que puede tener este documento en la criptografía de clave pública. Pero si es correcto, podría representar el fin de &lt;a href="http://en.wikipedia.org/wiki/RSA"&gt;RSA&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Se ha iniciado un hilo de discusión en &lt;a class="ln" href="http://groups.google.com/group/sci.crypt.research/browse_thread/thread/a59a39ce28578972?hl=en"&gt;sci.crypt.research&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7525137816325430642?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7525137816325430642/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7525137816325430642' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7525137816325430642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7525137816325430642'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/05/factorizacion-en-tiempo-polinomico.html' title='Factorización en tiempo  polinómico!?'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7227429978439819237</id><published>2009-05-09T23:18:00.004+02:00</published><updated>2012-01-19T23:34:48.228+01:00</updated><title type='text'>Free Mathematics Books</title><content type='html'>Estupenda colección de libros de matemáticas distribuidos gratuitamente:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.e-booksdirectory.com/mathematics.php"&gt;http://www.e-booksdirectory.com/mathematics.php&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7227429978439819237?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7227429978439819237/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7227429978439819237' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7227429978439819237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7227429978439819237'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/05/free-mathematics-books.html' title='Free Mathematics Books'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-3828712191252887650</id><published>2009-05-07T23:42:00.005+02:00</published><updated>2012-01-19T23:34:48.169+01:00</updated><title type='text'>The P-versus-NP page</title><content type='html'>Dejo un enlace a una página estupenda que recopila todos los intentos de demostrar el problema &lt;a href="http://en.wikipedia.org/wiki/P_%3D_NP_problem"&gt;P?=NP&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.win.tue.nl/%7Egwoegi/P-versus-NP.htm"&gt;http://www.win.tue.nl/~gwoegi/P-versus-NP.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Después de todo, hay un &lt;a href="http://www.claymath.org/millennium/"&gt;suculento premio&lt;/a&gt; para el que lo consiga.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-3828712191252887650?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/3828712191252887650/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=3828712191252887650' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3828712191252887650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3828712191252887650'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/05/p-versus-np-page.html' title='The P-versus-NP page'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-1051767522051573120</id><published>2009-05-05T00:56:00.000+02:00</published><updated>2012-01-19T23:51:21.601+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 11/04/09</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Pista: Autocifrado&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;SCASXQX KOPOKTL NJAWLDA RIFINGL SQHSEJU&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;HSKHPPW LBFBUCK RFXMNOZ UVGAVEG KTEJMSF&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-1051767522051573120?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/1051767522051573120/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=1051767522051573120' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1051767522051573120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1051767522051573120'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/criptograma-110409.html' title='Criptograma 11/04/09'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-3361465815998842631</id><published>2009-04-23T20:00:00.000+02:00</published><updated>2012-01-19T23:51:21.629+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 07/04/09: Solución</title><content type='html'>&lt;div style="text-align: justify;"&gt;Una combinación de transposición y sustitución. Primero había que transponer las letras del criptograma:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TRJVMFPTTFIEPFNCCFSFFTTDIVBDOIOBBSDZJNEJPSDBPSOEEPPTTWPFKDP&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;FTTEBPOTUPFSTFEKFBITBZCVMOBBSTNPBMEBBMNFFOEHFVTBFFWTJQHPOS&lt;/span&gt;F&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cogiendolas con un periodo de dos: una si, una no, ... Obteníamos:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TJMPTIPNCSFTIBOOBDJEPDPOEPTPKPTEPTPSFKBTZVOBTPMBMFOHVBFTQPS&lt;br /&gt;RVFTFEFCFFTDVDIBSZNJSBSEPTWFDFTBOUFTEFIBCMBSNBEBNFEFTFWJHOF&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Finalmente con un desplazamiento de una letra en el abecedario inglés:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SILOSHOMBRESHANNACIDOCONDOSOJOSDOSOREJASYUNASOLALENGUAESPOR&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;QUESEDEBEESCUCHARYMIRARDOSVECESANTESDEHABLARMADAMEDESEVIGNE&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-3361465815998842631?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/3361465815998842631/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=3361465815998842631' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3361465815998842631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3361465815998842631'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/criptograma-070409-solucion.html' title='Criptograma 07/04/09: Solución'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-8338998747652023674</id><published>2009-04-22T14:05:00.002+02:00</published><updated>2012-01-19T23:36:19.611+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Redes'/><category scheme='http://www.blogger.com/atom/ns#' term='Sistemas Operativos'/><title type='text'>Evitar timeouts en conexiones ssh</title><content type='html'>&amp;nbsp;&lt;br /&gt;echo "ServerAliveInterval 60" &amp;gt;&amp;gt; ~/.ssh/config&lt;br /&gt;&lt;br /&gt;Y se acabaron los timeouts por inactividad.&lt;br /&gt;&lt;br /&gt;Gracias Jordi!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-8338998747652023674?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/8338998747652023674/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=8338998747652023674' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8338998747652023674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8338998747652023674'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/evitar-timeouts-en-conexiones-ssh.html' title='Evitar timeouts en conexiones ssh'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-6180648068578988328</id><published>2009-04-21T20:00:00.001+02:00</published><updated>2012-01-19T23:51:21.678+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 05/04/09: Solución</title><content type='html'>Observando los números con atención se veía que 'todos' se podían descomponer en, únicamente, dos números primos. Dado que había un total de 26 números primos, se podía deducir que había un primo por letra del abecedario inglés.&lt;br /&gt;&lt;br /&gt;La asignación era la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;A: 002, B: 003, C: 005, D: 007, E: 011, F: 013, G: 017,&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;H: 019, I: 023, J: 029, K: 031, L: 037, M: 041, N: 043,&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;O: 047, P: 053, Q: 059, R: 061, S: 067, T: 071, U: 073,&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;V: 079, W: 083, X: 089, Y: 097, Z: 101&lt;/div&gt;&lt;br /&gt;El problema añadido del criptograma, era que al asignar cada letra a su número primo correspondiente las letras podían quedar desordenadas, pues dependía del orden en que se colocaban los dos factores. Aun así, después de la sustitución, no ser dificil finalizar el criptograma.&lt;br /&gt;&lt;br /&gt;Despues de factorizar los números originales quedaba como:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;37&amp;nbsp; 2&amp;nbsp; 5&amp;nbsp; 23&amp;nbsp; 11&amp;nbsp; 43&amp;nbsp; 5&amp;nbsp; 23&amp;nbsp; 2&amp;nbsp; 43&amp;nbsp; 47&amp;nbsp; 43&amp;nbsp; 47&amp;nbsp; 67&amp;nbsp; 19&amp;nbsp; 2&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;11&amp;nbsp; 43&amp;nbsp; 67&amp;nbsp; 11&amp;nbsp; 43&amp;nbsp; 2&amp;nbsp; 7&amp;nbsp; 47&amp;nbsp; 2&amp;nbsp; 73&amp;nbsp; 43&amp;nbsp; 67&amp;nbsp; 23&amp;nbsp; 37&amp;nbsp; 2&amp;nbsp; 37&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;47&amp;nbsp; 5&amp;nbsp; 73&amp;nbsp; 61&amp;nbsp; 2&amp;nbsp; 11&amp;nbsp; 67&amp;nbsp; 47&amp;nbsp; 43&amp;nbsp; 47&amp;nbsp; 37&amp;nbsp; 47&amp;nbsp; 41&amp;nbsp; 2&amp;nbsp; 67&amp;nbsp; 67&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;73&amp;nbsp; 3&amp;nbsp; 37&amp;nbsp; 23&amp;nbsp; 41&amp;nbsp; 11&amp;nbsp; 7&amp;nbsp; 11&amp;nbsp; 37&amp;nbsp; 2&amp;nbsp; 23&amp;nbsp; 43&amp;nbsp; 71&amp;nbsp; 11&amp;nbsp; 37&amp;nbsp; 23&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;17&amp;nbsp; 11&amp;nbsp; 43&amp;nbsp; 5&amp;nbsp; 23&amp;nbsp; 2&amp;nbsp; 11&amp;nbsp; 7&amp;nbsp; 17&amp;nbsp; 2&amp;nbsp; 61&amp;nbsp; 2&amp;nbsp; 37&amp;nbsp; 37&amp;nbsp; 2&amp;nbsp; 43&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;53&amp;nbsp; 47&amp;nbsp; 11 101&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;br /&gt;Y finalmente, después de sustituir:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;LACIENCIANONOSHAENSENADOAUNSILALOCURAESONO&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;LOMASSUBLIMEDELAINTELIGENCIAEDGARALLANPOEX&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-6180648068578988328?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/6180648068578988328/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=6180648068578988328' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6180648068578988328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6180648068578988328'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/criptograma-050409-solucion.html' title='Criptograma 05/04/09: Solución'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4231247539849675244</id><published>2009-04-20T17:39:00.000+02:00</published><updated>2012-01-19T23:36:19.505+01:00</updated><title type='text'>Catástrofe!!</title><content type='html'>&lt;a href="http://www.oracle.com/"&gt;Oracle&lt;/a&gt; compra &lt;a href="http://www.sun.com/"&gt;Sun Microsystems,&lt;/a&gt; y con ella MySQL, Java, OpenOffice, OpenSolaris, VirtualBox, ...&lt;br /&gt;&lt;br /&gt;Esta noche voy a tener pesadillas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-4231247539849675244?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/4231247539849675244/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=4231247539849675244' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4231247539849675244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4231247539849675244'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/catastrofe.html' title='Catástrofe!!'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-3903314965807204688</id><published>2009-04-19T20:00:00.001+02:00</published><updated>2012-01-19T23:51:21.634+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 26/03/09: Solución</title><content type='html'>&amp;nbsp; &lt;br /&gt;&lt;div style="text-align: justify;"&gt;Volvíamos con Kasiski, esta vez con una clave un poquito más larga...&lt;/div&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VRBCI UGJZB JMCJK EVMBF ZSCNX&lt;br /&gt;NIWAN CEGYI UVIQV FRWUZ ANWEH&lt;br /&gt;VLPAT EUQUH RPIIW ONWQB EWXXX&lt;br /&gt;RCVAN CCDHH PKMBF FTJYL HCKSE&lt;br /&gt;EMCAN NFIBB HYTLB EPLCI ZZXLY&lt;br /&gt;UGZOQ VPGYU APWBB RPPAX NVMBB&lt;br /&gt;XYHNT QWMIA FXTHZ AUCDE FTXUY&lt;br /&gt;EPWOY RKTHM EPWUH JXPKN EWVCG&lt;br /&gt;VRVUL URZCC ZEUYM OFWGG FHDMF&lt;br /&gt;EOQFN EQPFL ANDCY FWRCX GQASF&lt;br /&gt;EEIOK ANIPP UIUAA ILSZZ FTFLL&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;CLAVE: REPUTACION&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ENMIP UEBLO SINPR ETENS IONTE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NGOMA LAREP UTACI ONHAG ALOQU&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;EHAGA ESIGU ALTOD OLOCO NSIDE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;RANMA LYONO PIENS OPUES HACER&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NINGU NDANO QUERI ENDOV IVIRF&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;UERAD ELREB ANONO ALAGE NTENO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;GUSTA QUEUN OTENG ASUPR OPIAF&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ENOAL AGENT ENOGU STAQU EUNOT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ENGAS UPROP IAFET ODOST ODOSM&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;EMIRA NMALS ALVOL OSCIE GOSES&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NATUR ALABC DEFGH IJKLM OPQRS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-3903314965807204688?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/3903314965807204688/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=3903314965807204688' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3903314965807204688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3903314965807204688'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/criptograma-260309-solucion.html' title='Criptograma 26/03/09: Solución'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-9154821200034872322</id><published>2009-04-17T20:00:00.002+02:00</published><updated>2012-01-19T23:51:21.733+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 20/03/09: Solución</title><content type='html'>&lt;div style="text-align: justify;"&gt;Como ya se decía en la pista del criptograma se trataba de un cifrado Vigenere susceptible al ataque Kasiski.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;BEAOSERIPMXAQUTLXTDMTLDDTCXABIEAEABEAOSIYEGOCMJCWAHVTCTS&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NLDOAVXDPBPMJCWAHMPSIRPBPJPNXNDNDTTPXECSTSFUTSXNSICEGOKI&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;KIGAHJJNIATLTSUUTROONEAAWOGRDAQRTTTPPSDYPVTRPSROBOAAKISA&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;IESEEAGAQUTNDSBOBECTDSIEPLOAGAHSDBGEAOHPDBGEHYBEOQJICOHQ&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;JECOWACSPBXDDDTSROALPRBEAOSERIPMXAQUTLXTDMTLDDTCXABIEAEA&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;BEAOSIYEGOCMJCWAHVTCTSNLDOAVXDPBPMJCWAHMPSAAKISATSAURHPD&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TSEIPDPDPNPDXEIEPYJDPAHICOBAHYHIIUHOAOCOPDTLPNIAHTTIGACD&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TJPNSOPTGAHAIRPSPNSABURHPCWOSAAESUGOAAIITRGAIOSATLHOAITL&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;BAGSDNEAGAPQJEALDSFUTHPNHAQISOHECTPRHEHOQRTLDSSEBAHMTLDD&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TCXABIPBJEAIIOBEAOSERIPMXPPPPMTLDDXJTRDNBURHPSKEREHYAOWE&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DLKISASOHITMERTMPSYOHEPGJSIICGDYIIHOAOPBRDTFVHXJZLBNDPFR&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CLAVE : PAPA&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MELODECIAMIABUELITOMELODECIAMIPAPAMELODIJERONMUCHASVECES&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;YLOOLVIDABAMUCHASMASTRABAJANINONOTEPIENSESQUESINDINEROVI&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VIRASJUNTAELESFUERZOYELAHORROABRETEPASOYAVERASCOMOLAVIDA&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TEDEPARABUENOSMOMENTOSTEALZARASSOBRELOSPOBRESYMEZQUINOSQ&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;UENOHANSABIDODESCOLLARMELODECIAMIABUELITOMELODECIAMIPAPA&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MELODIJERONMUCHASVECESYLOOLVIDABAMUCHASMASLAVIDAESLUCHAD&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ESPIADADANADIETEAYUDAASINOMASYSITUSOLONOADELANTASTEIRAND&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;EJANDOATRASATRASANDAMUCHACHODALEDUROLATIERRATODAELSOLIEL&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;MARSONPARAAQUELLOSQUEHANSABIDOSENTARSESOBRELOSDEMASMELOD&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ECIAMIABUELITOMELODECIAMIPAPAMELODIJERONMUCHASVECESYLOHE&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;OLVIDADOSIEMPREMASJOSEAGUSTINGOYTISOLOABCDEFGHIJKLMNOPQR&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-9154821200034872322?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/9154821200034872322/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=9154821200034872322' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/9154821200034872322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/9154821200034872322'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/criptograma-200309-solucion.html' title='Criptograma 20/03/09: Solución'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4951539961647855400</id><published>2009-04-13T00:07:00.008+02:00</published><updated>2012-01-20T09:26:10.581+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Vectores Dinámicos en C</title><content type='html'>&lt;div style="text-align: justify;"&gt;Si queremos usar vectores dinámicos en C necesitamos recurrir a funciones de manejo de memoria de la familia *alloc(). En este post explico cómo hacerlo de forma sencilla y añado algunas macros que facilitan la tarea.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para empezar necesitaremos declarar el vector. Lo haremos como apuntador a NULL, creando así, un vector vacío. Necesitaremos también una variable que almacene el tamaño del vector, es decir, la cantidad de elementos que contiene.&lt;br /&gt;&lt;br /&gt;Como ejemplo crearemos un vector de números enteros.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;int *v = NULL;&lt;br /&gt;size_t v_size = 0;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Tenemos un vector vacío, por lo que el siguiente paso no puede ser otro que añadir elementos. Lo haremos mediante realloc(), función que permite reasignar el tamaño reservado en memoria.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;v_size++;&lt;br /&gt;v = realloc(v, sizeof(int)*v_size);&lt;br /&gt;v[v_size-1] = 5;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;De esta manera podemos añadir tantos elementos como creamos oportuno. El acceso a ellos se realizará mediante la tradicional indexación de vectores v[i], donde i es el índice del vector. Así podremos acceder al contenido de las diferentes posiciones del vector tanto para leerlas como para escribir en ellas.&lt;br /&gt;&lt;br /&gt;Finalmente, tendremos que liberar la memoria asignada al vector mediante la función free().&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;free(v);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;A continuación pego un ejemplo completo del uso de vectores dinámicos con las sentencias comentadas anterioremente. Añado tambien un ejemplo de uso de la función qsort() que permite ordenar el vector.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int cmp(const void *a, const void *b)&lt;br /&gt;{&lt;br /&gt;   int *ia, *ib;&lt;br /&gt;&lt;br /&gt;   ia = (int *) a;&lt;br /&gt;   ib = (int *) b;&lt;br /&gt;&lt;br /&gt;   return (*ia - *ib);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;   /* Declaracion del vector y de su tamaño */&lt;br /&gt;   int *v = NULL;&lt;br /&gt;   size_t v_size = 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   /* Añade un elemento al vector con valor 5 */&lt;br /&gt;   v_size++;&lt;br /&gt;   v = realloc(v, sizeof(int)*v_size);&lt;br /&gt;   v[v_size-1] = 5;&lt;br /&gt;&lt;br /&gt;   /* Añade un elemento al vector con valor 3 */&lt;br /&gt;   v_size++;&lt;br /&gt;   v = realloc(v, sizeof(int)*v_size);&lt;br /&gt;   v[v_size-1] = 3;&lt;br /&gt;&lt;br /&gt;   /* Añade un elemento al vector con valor 1 */&lt;br /&gt;   v_size++;&lt;br /&gt;   v = realloc(v, sizeof(int)*v_size);&lt;br /&gt;   v[v_size-1] = 1;&lt;br /&gt;&lt;br /&gt;   /* Mofifica el valor del primer elemento del vector */&lt;br /&gt;   v[0] = 2;&lt;br /&gt;&lt;br /&gt;   /* Ordena el contenido del vector */&lt;br /&gt;   qsort(v, v_size, sizeof(int), cmp);&lt;br /&gt;&lt;br /&gt;   /* Muestra los elementos del vector */&lt;br /&gt;   int i;&lt;br /&gt;   for(i=0; i&amp;lt;v_size; i++)&lt;br /&gt;      printf("%d ", v[i]);&lt;br /&gt;   printf("\n");&lt;br /&gt;&lt;br /&gt;   /* Libera la memoria asignada */&lt;br /&gt;   free(v);&lt;br /&gt;&lt;br /&gt;   return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;La sintaxis usada es un poco engorrosa, principalmente cuando se trata de añadir elementos a un vector. Esto puede solucionarse mediante el uso de macros. A continuación pego un ejemplo usando macros. En el puede verse también cómo pasar un vector como parámetro a una función.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;#define VECTOR(v_var,v_size_var,type) \&lt;br /&gt;   type *v_var = NULL; \&lt;br /&gt;   size_t v_size_var = 0;&lt;br /&gt;&lt;br /&gt;#define VECTOR_ADD(v_var,v_size_var,type,value) \&lt;br /&gt;   (v_size_var)++; \&lt;br /&gt;   v_var = realloc(v_var, sizeof(type)*(v_size_var)); \&lt;br /&gt;   v_var[v_size_var-1] = value;&lt;br /&gt;   &lt;br /&gt;#define VECTOR_FREE(v_var) if(v_var) free(v_var);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void add_elements(int *v, size_t *v_size)&lt;br /&gt;{&lt;br /&gt;   VECTOR_ADD(v, *v_size, int, 3);&lt;br /&gt;   VECTOR_ADD(v, *v_size, int, 5);&lt;br /&gt;   VECTOR_ADD(v, *v_size, int, 7);&lt;br /&gt;}  &lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;   VECTOR(v, v_size, int);&lt;br /&gt;   VECTOR_ADD(v, v_size, int, 2);&lt;br /&gt;   &lt;br /&gt;   add_elements(v, &amp;v_size);&lt;br /&gt;&lt;br /&gt;   int i;&lt;br /&gt;   for(i=0; i&amp;lt;v_size; i++)&lt;br /&gt;      printf("%d ", v[i]);&lt;br /&gt;   printf("\n");&lt;br /&gt;   &lt;br /&gt;   VECTOR_FREE(v);&lt;br /&gt;&lt;br /&gt;   return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Para finalizar, solo recordar que el punto fuerte de los vectores es el acceso directo a los elementos (solo es necesaria una operación - O(1) ). Esto permite por ejemplo ordenar los elementos del vector a gran velocidad.&lt;br /&gt;&lt;br /&gt;Por el contrario son costosas las inserciones de elementos. Pueden añadirse con facilidad al final, pero insertar un elemento en el medio, obliga a recolocar todos los demás elementos. Si se requiere una estructura de datos que permita estas operaciones es mejor recurrir a las listas dinámicas. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-4951539961647855400?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/4951539961647855400/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=4951539961647855400' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4951539961647855400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4951539961647855400'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/vectores-dinamicos-en-c.html' title='Vectores Dinámicos en C'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-654499352829127484</id><published>2009-04-10T00:43:00.004+02:00</published><updated>2012-01-19T23:51:21.684+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 01/04/09: Solución</title><content type='html'>&lt;div style="text-align: justify;"&gt;Se trataba de un cifrado de sustitución homofónica que usaba dos valores para cada letra. A contnuación, la solución propuesta por Izzec.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mis felicitaciones, Izzec!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;dEbo decir que soy un priNcipiante en esto, y que a pesar de Haberme informadO sobRe Algunos aspectos de la criptografía tengo que decir que no tengo aún una haBilidad adqUirida. aún así mE gusta, y con coNstancia, en mi tiempo libre le dedico lo suficiente pAra intentar saber semana tras semana (aunque siemPre se nOs adelante altaiR) que nos escondes en los cripTogramas, daniel.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bUeno el método que seguí fue Bastante sencilLo la verdad. en primera instancia hice una lectura rápida de los númerOs, y me di cuenta que todos eran curiosamente impares. alGo me Hizo pensar en esE momento que serían números impares sustituidos por letras. así que me puse a contar caDa númEro impar las veces que aparecía en dicho criptograma (esto no me serviría de mucho más adelante). hecho esto los clasifique por orden ascendente 002 (el único que no era impar) -003-005, etc. y me di cuenta que eran primos.así que los reordené todos de forma ascendente de tal forma que quedasen cuadrados con el alfabeto (sin utilizar la ñ). adjunto eJemplo;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 002&amp;nbsp;&amp;nbsp; A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 003&amp;nbsp;&amp;nbsp; b&amp;nbsp;&amp;nbsp;&amp;nbsp; 005&amp;nbsp;&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 007&amp;nbsp;&amp;nbsp; D&amp;nbsp;&amp;nbsp; 011&amp;nbsp;&amp;nbsp; e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 013&amp;nbsp;&amp;nbsp; f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 017&amp;nbsp;&amp;nbsp; g&amp;nbsp;&amp;nbsp;&amp;nbsp; 019&amp;nbsp;&amp;nbsp; h&amp;nbsp;&amp;nbsp;&amp;nbsp; 023&amp;nbsp;&amp;nbsp; i&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 029&amp;nbsp;&amp;nbsp; j&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿? k&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 037&amp;nbsp;&amp;nbsp; l&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 041&amp;nbsp;&amp;nbsp; m&amp;nbsp;&amp;nbsp;&amp;nbsp; 043&amp;nbsp;&amp;nbsp; n&amp;nbsp;&amp;nbsp;&amp;nbsp; 047&amp;nbsp; O&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 053&amp;nbsp;&amp;nbsp; p&amp;nbsp;&amp;nbsp;&amp;nbsp; 059&amp;nbsp;&amp;nbsp; q&amp;nbsp;&amp;nbsp;&amp;nbsp; 061&amp;nbsp;&amp;nbsp; r&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 067&amp;nbsp; s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 071&amp;nbsp;&amp;nbsp; t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 073&amp;nbsp;&amp;nbsp; U&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿? v&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿? w&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 089&amp;nbsp; x&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 097&amp;nbsp; y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿? z&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 103&amp;nbsp; a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 107&amp;nbsp; b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 109&amp;nbsp; c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 113&amp;nbsp; d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 127&amp;nbsp; e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp;&amp;nbsp; f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp; g&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 139 h&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 149&amp;nbsp; i&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp;&amp;nbsp; j&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp;&amp;nbsp; k&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 163 l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 167 m&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 173 N&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 179 o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp; p&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 191&amp;nbsp; q&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 193&amp;nbsp; r&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 197&amp;nbsp; s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 199&amp;nbsp; t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 211&amp;nbsp; u&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp;&amp;nbsp; v&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp; w&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp; x&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 233&amp;nbsp; y&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp;&amp;nbsp; z&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 241&amp;nbsp; a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp;&amp;nbsp; b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 257&amp;nbsp; C&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 263&amp;nbsp; d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 269&amp;nbsp; e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp; f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp; g&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp; h&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 283&amp;nbsp; i&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp;&amp;nbsp; j&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp; k&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 311&amp;nbsp; l&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 313&amp;nbsp; m&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 317&amp;nbsp; n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 331&amp;nbsp; o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp; p&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿?&amp;nbsp; q&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 349&amp;nbsp; R&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 353&amp;nbsp; s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 359&amp;nbsp; t&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 367&amp;nbsp; u&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y luego lo demás fue cambiar las cifras Por las leTras. El texto queda así:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; l a d i f e r e N c&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; i a q u e e x i s t&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e e n t r e l o s h&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; o M b r e s n e c I&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; o s y l o s h o m B&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; r e s d e t a L e n&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; t O s u e l e s e r&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; q u e l o s p r i m&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e r o s d i c e n n&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e c e d a d e s y l&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; o s s e G u n d o s&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; l a s c o m e t e n&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m a r i a n o j o s&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e d e l a r r a&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Lo habéis leído con atención? ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-654499352829127484?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/654499352829127484/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=654499352829127484' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/654499352829127484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/654499352829127484'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/criptograma-010409-solucion.html' title='Criptograma 01/04/09: Solución'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-3939505381267599544</id><published>2009-04-08T00:56:00.002+02:00</published><updated>2012-01-19T23:34:48.172+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Criptoanálisis'/><title type='text'>Búsqueda de Patrones en Cifrados de Sustitución</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Cuando se realiza el criptoanálisis de un cifrado de sustitución monoalfabética, suele ser necesario encontrar palabras que encajen en ciertos patrones de letras. Por ejemplo, en un patroón como AACBBDA encajarían palabras como &lt;i&gt;arrollar&lt;/i&gt;, &lt;i&gt;guerrillero&lt;/i&gt; o&amp;nbsp; &lt;i&gt;encarrillar&lt;/i&gt;. Muchas veces, para encontrar estas palabras no es suficiente con nuestra imaginación y conocimiento de la lengua, por lo que suele ser útil recurrir al ordenador.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A continuación, pego un programa que permite realizar este tipo de búsquedas de forma muy sencilla.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp" name="code"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;&lt;br /&gt;void remove_nl(char *str)&lt;br /&gt;{&lt;br /&gt;   if(str[strlen(str)-1]=='\n')&lt;br /&gt;      str[strlen(str)-1]=0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int match_pattern(char *match, const char *pattern, size_t pattern_len)&lt;br /&gt;{&lt;br /&gt;   int i,j;&lt;br /&gt;&lt;br /&gt;   for(i=0; i&amp;lt;pattern_len; i++)&lt;br /&gt;   {&lt;br /&gt;      for(j=i; j&amp;lt;pattern_len; j++)&lt;br /&gt;      {&lt;br /&gt;         if(pattern[i]==pattern[j])&lt;br /&gt;            if(match[i]!=match[j])&lt;br /&gt;               return 0;&lt;br /&gt;&lt;br /&gt;         if(pattern[i]!=pattern[j])&lt;br /&gt;            if(match[i]==match[j])&lt;br /&gt;               return 0;&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;   char word[64];&lt;br /&gt;   char *pattern = NULL;&lt;br /&gt;   int pattern_len = 0;&lt;br /&gt;&lt;br /&gt;   if(argc!=3)&lt;br /&gt;   {&lt;br /&gt;      printf("Usage: %s [word list] [crypto-pattern]\n\n", argv[0]);&lt;br /&gt;      return 0;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   pattern = argv[2];&lt;br /&gt;   pattern_len = strlen(pattern);&lt;br /&gt;&lt;br /&gt;   FILE *file = fopen(argv[1], "r");&lt;br /&gt;   if(!file)&lt;br /&gt;   {&lt;br /&gt;      perror("fopen()");&lt;br /&gt;      exit(0);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   while(!feof(file))&lt;br /&gt;   {&lt;br /&gt;      fgets(word, sizeof(word), file);&lt;br /&gt;      remove_nl(word);&lt;br /&gt;&lt;br /&gt;      char *substr = word;&lt;br /&gt;&lt;br /&gt;      while(strlen(substr)&amp;gt;=pattern_len)&lt;br /&gt;      {&lt;br /&gt;         if(strlen(substr)&amp;lt;pattern_len)&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;         char match[pattern_len];&lt;br /&gt;         strncpy(match, substr, pattern_len);&lt;br /&gt;         match[pattern_len]=0;&lt;br /&gt;&lt;br /&gt;         if(match_pattern(match, pattern, pattern_len))&lt;br /&gt;            printf("%s\n", word);&lt;br /&gt;&lt;br /&gt;         substr++;&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   fclose(file);&lt;br /&gt;&lt;br /&gt;   return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para el patrón del ejemplo bastarí con compilar el programa con:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ gcc pattern.c -o pattern&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y ejecutarlo con:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$&amp;nbsp; ./pattern ../dict/spanish AACBBDA&lt;br /&gt;acurrullar&lt;br /&gt;aporrillarse&lt;br /&gt;arrollar&lt;br /&gt;arrullar&lt;br /&gt;aturrullar&lt;br /&gt;barrillar&lt;br /&gt;barrillera&lt;br /&gt;barrillero&lt;br /&gt;carrillera&lt;br /&gt;cerrillar&lt;br /&gt;churrillera&lt;br /&gt;churrillero&lt;br /&gt;churrullera&lt;br /&gt;churrullero&lt;br /&gt;corrillera&lt;br /&gt;corrillero&lt;br /&gt;desarrollar&lt;br /&gt;descarrillar&lt;br /&gt;emborrullarse&lt;br /&gt;emparrillar&lt;br /&gt;encarrillar&lt;br /&gt;guerrillero&lt;br /&gt;marrullera&lt;br /&gt;marrulleria&lt;br /&gt;marrullero&lt;br /&gt;pantorrillera&lt;br /&gt;zarzaparrillar&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Espero que os sirva para vuestros cripoanalisis!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-3939505381267599544?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/3939505381267599544/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=3939505381267599544' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3939505381267599544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3939505381267599544'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/busqueda-de-patrones-en-cifrados-de.html' title='Búsqueda de Patrones en Cifrados de Sustitución'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-1096033047639714335</id><published>2009-04-07T22:41:00.002+02:00</published><updated>2012-01-19T23:51:21.603+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 07/04/09</title><content type='html'>&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TRJVMFPTTFIEPFNCCFSFFTTDIVBDOIOBBSDZJNEJPSDBPSOEEPPTTWPFKDP&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;FTTEBPOTUPFSTFEKFBITBZCVMOBBSTNPBMEBBMNFFOEHFVTBFFWTJQHPOSF&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-1096033047639714335?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/1096033047639714335/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=1096033047639714335' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1096033047639714335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1096033047639714335'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/criptograma-070409.html' title='Criptograma 07/04/09'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4212275974838160028</id><published>2009-04-05T23:44:00.000+02:00</published><updated>2012-01-19T23:51:21.639+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 05/04/09</title><content type='html'>0074 0115 0473 0115 0086 2021 3149 0038 0473 0737 0086 &lt;br /&gt;0329 0146 2881 0851 0074 0235 4453 0022 3149 2021 1739 &lt;br /&gt;0082 4489 0219 0851 0451 0077 0074 0989 0781 0621 0187 &lt;br /&gt;0215 0046 0077 0034 0122 1369 0086 2491 1111&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Podéis enviar vuestro procedimiento de solución a dlerch (en gmail) o publicar un comentario. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-4212275974838160028?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/4212275974838160028/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=4212275974838160028' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4212275974838160028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4212275974838160028'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/criptograma-050409.html' title='Criptograma 05/04/09'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-289651698416243236</id><published>2009-04-05T22:53:00.001+02:00</published><updated>2012-01-19T22:08:53.210+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Criptoanálisis'/><title type='text'>The General Number Field Sieve</title><content type='html'>Actualmente, el algoritmo de factorización más rápido que existe. Dejo aquí mi colección de &lt;i&gt;papers&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Antecedents&lt;/b&gt;&lt;br /&gt;-&lt;a href="http://www.std.org/~msm/common/f9paper.ps"&gt; The Factorization of the Ninth Fermat Number&lt;/a&gt; , A.K. Lenstra, H.W. Lenstra, M.S. Manasse, and J.M. Pollard (1993).&lt;br /&gt;- &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.24.1306"&gt;The Number Field Sieve&lt;/a&gt; , A. K. Lenstra, M. S. Manasse, J. M. Pollard (1990).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Introduction to the GNFS algorithm&lt;/b&gt;&lt;br /&gt;- &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.96.6146"&gt;An Introduction to the General Number Field Sieve&lt;/a&gt; , Matthew E. Briggs (1998).&lt;br /&gt;- &lt;a href="http://islab.oregonstate.edu/koc/ece575/03Project/Case/paper.pdf"&gt;A Beginner's Guide To The General Number Field Sieve&lt;/a&gt; , Michael Case.&lt;br /&gt;- &lt;a href="http://websites.math.leidenuniv.nl/algebra/nfs.pdf"&gt;The Number Field Sieve&lt;/a&gt; , Peter Stevenhagen.&lt;br /&gt;- &lt;a href="http://www.geocities.com/sbyrnes321/math129-finalpaper.pdf"&gt;The Number Field Sieve&lt;/a&gt; , Steven Byrnes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Polynomial Selection&lt;/b&gt;&lt;br /&gt;- &lt;a href="http://citeseer.ist.psu.edu/murphy99polynomial.html"&gt;Polynomial Selection for the Number Field Sieve Factorisation Algorithm&lt;/a&gt; , Brian Murphy (1999).&lt;br /&gt;- &lt;a href="http://citeseer.ist.psu.edu/458063.html"&gt;On quadratic polynomials for the number field sieve&lt;/a&gt; , Brian Murphy and Richard P. Brent (1998).&lt;br /&gt;- &lt;a href="http://www.iacr.org/archive/asiacrypt2003/07_Session07/04_021/28940055.pdf"&gt;Rotations and Translations of Number Field Sieve Polynomials&lt;/a&gt; Jason Gower (2003).&lt;br /&gt;- &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.29.2036"&gt;The multiple-lattice number field sieve&lt;/a&gt; , Daniel J Bernstein.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sieve&lt;/b&gt;&lt;br /&gt;- &lt;a href="http://www.hyperelliptic.org/tanja/SHARCS/talks/FrankeKleinjung.pdf"&gt;Continued Fractions and Lattice Sieving&lt;/a&gt; , Jens Franke, Thorsten Kleinjung.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Filtering&lt;/b&gt;&lt;br /&gt;-&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.27.5186"&gt; Strategies in filtering in the number field sieve&lt;/a&gt; , S. Cavallar (2000).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Linear Algebra&lt;/b&gt;&lt;br /&gt;- &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.36.9222"&gt;Solving Large Sparse Linear Systems over Finite Fields&lt;/a&gt; , B. A. LaMacchia and A. M. Odlyzko (1991).&lt;br /&gt;- &lt;a href="http://dsns.csie.nctu.edu.tw/research/crypto/HTML/PDF/E95/106.PDF"&gt;A Block Lanczos Algorithm for Finding Dependencies over GF(2)&lt;/a&gt; , Peter L. Montgomery.&lt;br /&gt;- &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.36.9222"&gt;Solving large sparse linear systems over finite fields&lt;/a&gt; , B. A. Lamacchia, A. M. Odlyzko (1991).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Square Root&lt;/b&gt;&lt;br /&gt;-&lt;a href="http://citeseer.ist.psu.edu/nguyen98montgomerylike.html"&gt; A Montgomery-like square root for the Number Field Sieve&lt;/a&gt; , Phong Nguyen, Ecole Normale Superieure (1998).&lt;br /&gt;- &lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.39.5935"&gt;Computing a Square Root for the Number Field Sieve&lt;/a&gt; , Jean-Marc Couveignes (1993).&lt;br /&gt;-&lt;a href="ftp://ftp.cwi.nl/pub/pmontgom/sqrt.ps.gz"&gt; Square Roots of Products of Algebraic Numbers&lt;/a&gt; , Peter L. Montgomery.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-289651698416243236?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/289651698416243236/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=289651698416243236' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/289651698416243236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/289651698416243236'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/general-number-field-sieve_03.html' title='The General Number Field Sieve'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7210099157267224021</id><published>2009-04-03T12:58:00.010+02:00</published><updated>2012-01-19T23:34:48.225+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Criptoanálisis'/><title type='text'>Cómo diferenciar entre cifrados de transposición y de sustitución</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;En criptoańalisis de cifrados clásicos, el primer problema con el que se enfrenta el criptoanalista es el desconocimiento del tipo de cifrado usado en el criptograma.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En criptografía clásica existen dos grandes grupos de sistemas de cifrado: los cifrados de sustitución y los cifrados de transposición.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Los primeros son aquellos en los que cada letra es sustituida por otra letra o símbolo. En los segundos, en cambio, no hay sustitución, pues solo se realiza una mezcla de las letras.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mientras que en el caso de los cifrados de sustitución, nuestro objetivo será averiguar que símbolo corresponde a cada letra, en los cifrados de transposición tendremos que encontrar el patrón de 'mezcla' utilizado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Características del Texto Cifrado:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Dado que en los cifrados de transpoción, únicamente se mezclan letras, en el resultado cifrado tendremos las misma letras que en el mensaje en claro. Así pues se mantendrán los porcentajes de vocales y de consonantes de la lengua usada.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Sin embargo, en los cifrados de sustitución, cada símbolo será sustituido por otro, de manera que no se mantendrá la distribución de vocales y consonantes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Técnicas disponibles:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Las características del texto cifrado nos ofrecen dos técnicas para distinguir entre&amp;nbsp; cifrados de sustitución y cifrados de transposición: El porcentaje de vocales y el &lt;a href="http://dlerch.blogspot.com/2007/09/criptoanlisis-anlisis-de-recuencias.html"&gt;análisis de frecuencias&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;El porcentaje de vocales en castellano, ronda el 47%. Así pues, si contamos las vocales y las consonantes del criptograma y nos encontramos con un procentaje similar, sabremos que no se han realizado sustituciones y que con alta probabilidad nos encontramos ante un cifrado de transposición.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Si, por otra parte, los porcentajes que obtenemos están lejos del 47%, probablemente se trate de un cifrado de sustitución.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para afiinar un poco más realizaremos un&lt;a href="http://dlerch.blogspot.com/2007/09/criptoanlisis-anlisis-de-recuencias.html"&gt; análisis de frecuencias&lt;/a&gt;. Sabemos que, por ejemplo, en castellano, las letras más frecuentes son la 'a' y la 'e'. Si estas se corresponden con la 'a' y la 'e' del criptagrama, más probabilidades a favor del cifrado por transposición. Si por el contrario, las más frecuentes son letras de baja frecuencia en castellano, como la 'x' o la 'k', dificilmente se tratará de un cifrado de transposición.&amp;nbsp; Podremos suponer entonces que letras de aparición frecuente han sido sustituidas por 'x' y 'k'.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ejemplos de Criptogramas Anteriores:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Vamos a apoyar la información expuesta con algunos criptogramas&amp;nbsp; propuestos anterioremente.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dlerch.blogspot.com/2009/04/criptograma-280309-solucion.html"&gt;Criptograma 28/03/09&lt;/a&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;OTUOBLBNOA LIERYBHAEO ATAMSIEOYS AHRNPIRMUI URNPBENCIP&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NIMOAUNEAR UJALBREAUN EAEZUNSVUA RLTQETABAM ASTCASAESA&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SHSOBUVNAA IZCUAAEDON SONOBAUNYA UORALMNVES XDETOOSLNO&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;CORDDSTOAN RAAOTODHD&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;El porcentaje de vocales es del 45%.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Las letras más frecuentes son la 'a', la 'o', la 'n', la 'e' y la 's'.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Así pues, queda claro que se trata de un cifrado de transposición.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;a href="http://dlerch.blogspot.com/2009/02/el-criptograma-del-2008-solucion.html"&gt;Criptrograma del 2008:&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;pre&gt;&lt;span style="font-size: 130%;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: 130%;"&gt;ADZMO YHADG TIYMM ZCAUG CZYJA DYJTG LKSKM DKOZJ&lt;br /&gt;OKEIG JHKAC EZSGQ HYZOG EZMVG HAZSG MYJOZ MNJEG&lt;br /&gt;SZENH GHEIZ JHKDG COMKS ZCCAB IYFAJ GSZMY JOGMN&lt;br /&gt;JZEON FNHGH CNACO ZEYME GHADY JABNT KVZHY VGEAM&lt;br /&gt;DYEMA YMPIA YCOZD ARKCC NYCOG DARKC ZSGMY JOZMP&lt;br /&gt;IACYA COGEY MEZSK JAMEY UKCSG MZGOM ZAMGD YJABN&lt;br /&gt;TKTKD SYZMG DAJYB NTKEI ZJHKA COGHY CKMHA JZHKS&lt;br /&gt;MYSGM ZMCAE KJOMG YDEIZ JHKAC OGCYT IMKAJ OKHZC&lt;br /&gt;SGMOY CAFNO ZMDYH IMGJO AIJON YBSKE IZJHK ACBGC&lt;br /&gt;XIYMO ACNOI KSKJY JOAON YJAIJ OYBSA MZBYJ OKEKD&lt;br /&gt;AMNEK NJOYJ OGNMM NOZMD ACNYC GMMKT ZJOAO MGOZH&lt;br /&gt;YXKBA JOGMC IYTKO NCBKC NDZCO MKSGC AJYBN TZCCA&lt;br /&gt;VGDDZ JUNYJ SMASG MZHGC OMZCI JGMYK MTZJN QGENK&lt;br /&gt;JNJOA JOZHY CKMHA JGMDZ CCNYC OGJIJ NHZCC NABUM&lt;br /&gt;GDZHN CYJCN KJAJO MYCIC XNDGC ZOGEZ GDAJY BNTKE&lt;br /&gt;IZJHK JKACO GSMYS ZMGHK WZSGM AEYEI ZJHKJ KOAYC&lt;br /&gt;SAMGY COZCC KJDGC EDZFA CHYDG FNEOK MNZSG MZADY&lt;br /&gt;COMGO ATZCI JOQIY DGMOA HYDZT IAMMG&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;El porcentaje de vocales es del 23%.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Las letras más frecuentes son la 'm', la 'z', la 'g', la 'y' y la 'a'.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Así pues, queda claro que se trata de un cifrado de sustitución.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7210099157267224021?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7210099157267224021/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7210099157267224021' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7210099157267224021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7210099157267224021'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/como-diferenciar-entre-cifrados-de.html' title='Cómo diferenciar entre cifrados de transposición y de sustitución'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7011286469547221336</id><published>2009-04-02T00:04:00.011+02:00</published><updated>2012-01-19T23:51:21.690+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 28/03/09: Solución</title><content type='html'>&lt;div style="text-align: justify;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;El criptograma corresponde a una doble transposición. Ha sido resuelto únicamente por Altair, que me ha enviado su solución. La adjunto a continuación.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;En primer lugar decirte que no soy experto en criptografia, simplemente me gusta y paso algún buen rato intentando descifrar mensajes. He leído un poquito a nivel básico, pero no tengo mas formación sobre estos temas, ni tampoco herramientas potentes, es mas casi no tengo herramientas.&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;Lo que si tengo claro es que para descifrar un mensaje, se ha de tener en cuenta todo lo que sepamos sobre el mensaje, las circunstancias en las que el mensaje se genera, la personalidad y gustos de autor, en fin, cualquier cosa relacionada con lo que queremos descifrar.&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;En este caso, los dos mensajes anteriores, eran poesías que había cantado Paco Ibáñez, y en los comentarios se habían hecho referencias a el y a los poetas que los habían compuesto, incluso yo te había hecho un comentario sobre la canción “A galopar”.&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;Esto era algo que tenia en mente cuando comencé con el mensaje. Miré la frecuencia de aparición de las letras, y ví podía cuadrar con la frecuencia normal en castellano, pero probando sustituciones no llegaba a nada.&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;Examinando el mensaje con atención ví “fragmentos” de palabras SONOBA, CORD, UJALBR, RNPBENCIP … Esto me hizo suponer que lo que habías hecho era mover las letras de su posición inicial. ¿Pero como?, probaba a mover las columnas de lugar pero no me salía nada en claro, las filas no creía que estuvieran cambiadas, porque todos los “fragmentos” los habia encontrado en horizontal. Y aquí es donde viene la suerte, o la intuición, como quieras llamarlo. Los fragmentos, me hicieron pensar en “erase se una vez un principe malo …..”. Estaban prácticamente las palabras Bruja, CORDeros, Soñaba (Sonoba) etc. En ese momento estaba casi convencido de que el texto era ese poema, pero no sabia por donde empezar con el método de cifrado, porque las trasposiciones que probaba no me llevaban a ninguna parte. Para asegurarme de que el texto era el que yo creía, busque el poema y calculé la frecuencia de aparición de cada letra. Solo había tres pequeñas diferencias, en el cripto habia una N mas que en el poema, en el el poema había una Ñ que no estaba en el criptograma, y en el criptograma había una X. Las dos primeras diferencias estaban claras, no habias usado un alfabeto con Ñ, tu alfabeto era de 26 letras y la Ñ la codificabas como N. Con esto, la frecuencia de las letras cuadraba perfectamente excepto por la X.&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;Pensé que la X podía ser algún signo de puntuación, un punto, un guión, algo así, pero no me convencía porque en el poema original había mas de un signo, y no tenia sentido que pusieras uno si y los otros no. La otra alternativa era un carácter de relleno, la X. Esta última posibilidad me llamo la atención, porque normalmente un carácter se pone porque nos faltan letras para completar un grupo, y en este caso el ultimo bloque solo tenía 9 letras y no 10 como los demás. Era contradictorio. Pensé que podía ser una variante del que habías puesto de la rejilla de Cardano, pero tampoco encontraba un patrón. Además, las letras no formaban un cuadrado …&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;Aquí me quedé atascado, hasta que se me ocurrió contar las letras que había y ¡Bingo¡ 169 caracteres, o sea 13x13.&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;Lo reordené en un cuadrado de estas dimensiones descarte rapidamente la rejilla. Al mirar el mensaje ordenado así, estaba claro que habías jugado con las filas y las columnas. Como estaba seguro de cual era el texto ya fue fácil reordenar las columnas y las filas.&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;Más o menos, este fue el proceso que seguí.&lt;/i&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Adjunto también el proceso usado en el cifrado, paso a paso.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para poder realizar una transposición doble, basada en una clave, es necesario poder representar el texto en un cuadrado.  El lado del cuadrado se corresponderá con la longitud de la clave:6  1  7 12  2  4  5  3  13 8  9 10 11.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Realizamos primero la transposición de las columnas:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;6 1  7 12  2  4  5  3  13 8  9 10 11&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;======================================&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;E  R  A  S&amp;nbsp;  E  U  N  A&amp;nbsp;  V  E  Z&amp;nbsp;  U  N&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;L  O  B  I&amp;nbsp; T  O  B  U&amp;nbsp;  E  N  O&amp;nbsp;  A  L&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Q  U  E  M&amp;nbsp;  A  L  T  R&amp;nbsp;  A  T  A&amp;nbsp;  B  A&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;N  T  O  D&amp;nbsp;  O  S  L  O&amp;nbsp;  S  C  O&amp;nbsp;  R  D&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;E  R  O  S&amp;nbsp;  Y  H  A  B&amp;nbsp;  I  A  T&amp;nbsp;  A  M&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;B  I  E  N&amp;nbsp;  U  N  P  R&amp;nbsp;  I  N  C&amp;nbsp;  I  P&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;E  M  A  L&amp;nbsp;  O  U  N  A&amp;nbsp;  B  R  U&amp;nbsp; J  A&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;H  E  R  M&amp;nbsp;  O  S  A  Y&amp;nbsp;  U  N  P&amp;nbsp;  I  R&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;A  T  A  H&amp;nbsp;  O  N  R  A&amp;nbsp;  D  O  T&amp;nbsp;  O  D&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;A  S  E  S&amp;nbsp;  T  A  S  C&amp;nbsp;  O  S  A&amp;nbsp;  S  H&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;A  B  I  A&amp;nbsp;  U  N  A  V&amp;nbsp;  E  Z  C&amp;nbsp;  U  A&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;N  D  O  Y&amp;nbsp;  O  S  O  N&amp;nbsp;  A  B  A&amp;nbsp;  U  N&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;M  U  N  D&amp;nbsp;  O  A  L  R&amp;nbsp;  E  V  E&amp;nbsp;  S  X&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TRANSPOSICION DE COLUMNAS&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;R E A U N E A E Z U N S V&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;O T U O B L B N O A L I E&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;U A R L T Q E T A B A M A&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;T O O S L N O C O R D D S&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;R Y B H A E O A T A M S I&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I U R N P B E N C I P N I&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;M O A U N E A R U J A L B&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;E O Y S A H R N P I R M U&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;T O A N R A A O T O D H D&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;S T C A S A E S A S H S O&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;B U V N A A I Z C U A A E&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;D O N S O N O B A U N Y A&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;U O R A L M N V E S X D E&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A continuación realizamos la transposición de las filas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;6&amp;nbsp;  R E A U N E A E Z U N S V&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1&amp;nbsp;  O T U O B L B N O A L I E&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;7&amp;nbsp;  U A R L T Q E T A B A M A&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;12  T O O S L N O C O R D D S&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;2&amp;nbsp;  R Y B H A E O A T A M S I&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;4&amp;nbsp;  I U R N P B E N C I P N I&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;5&amp;nbsp;  M O A U N E A R U J A L B&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;3&amp;nbsp;  E O Y S A H R N P I R M U   &lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;13  T O A N R A A O T O D H D&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;8&amp;nbsp;  S T C A S A E S A S H S O&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;9&amp;nbsp;  B U V N A A I Z C U A A E&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;10 D O N S O N O B A U N Y A &lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;11  U O R A L M N V E S X D E&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TRANSPOSICION DE FILAS&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;O T U O B L B N O A L I E&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;R Y B H A E O A T A M S I&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;E O Y S A H R N P I R M U&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I U R N P B E N C I P N I&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;M O A U N E A R U J A L B&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;R E A U N E A E Z U N S V&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;U A R L T Q E T A B A M A&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;S T C A S A E S A S H S O&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;B U V N A A I Z C U A A E&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;D O N S O N O B A U N Y A&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;U O R A L M N V E S X D E&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;T O O S L N O C O R D D S&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;T O A N R A A O T O D H D&lt;/div&gt;&lt;br /&gt;De donde obtenemos el mensaje cifrado:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;OTUOBLBNOA LIERYBHAEO ATAMSIEOYS AHRNPIRMUI URNPBENCIP&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NIMOAUNEAR UJALBREAUN EAEZUNSVUA RLTQETABAM ASTCASAESA&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SHSOBUVNAA IZCUAAEDON SONOBAUNYA UORALMNVES XDETOOSLNO&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;CORDDSTOAN RAAOTODHD&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Desde aquí, mis felicitaciones a Altair.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7011286469547221336?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7011286469547221336/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7011286469547221336' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7011286469547221336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7011286469547221336'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/criptograma-280309-solucion.html' title='Criptograma 28/03/09: Solución'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-310951099150757246</id><published>2009-04-01T23:24:00.010+02:00</published><updated>2012-01-19T23:51:21.625+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 01/04/09</title><content type='html'>&lt;pre style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;037 002 007 023 013 011 061 127 043 005 &lt;br /&gt;149 103 059 073 269 011 089 283 067 071 &lt;br /&gt;127 269 173 199 193 011 163 047 197 019 &lt;br /&gt;179 041 003 349 127 353 317 269 109 023 &lt;br /&gt;331 067 097 311 047 197 139 179 167 107 &lt;br /&gt;061 011 353 113 127 359 241 037 269 043 &lt;br /&gt;071 331 067 211 011 163 127 197 269 193 &lt;br /&gt;191 367 011 311 047 353 053 349 149 313 &lt;br /&gt;127 061 179 067 263 283 257 269 173 317&lt;br /&gt;011 005 127 007 002 113 269 197 233 037 &lt;br /&gt;331 353 067 011 017 073 043 263 047 197 &lt;br /&gt;163 103 353 109 179 041 127 199 269 173 &lt;br /&gt;167 241 193 023 002 317 331 029 047 067 &lt;br /&gt;011 007 127 311 103 349 061 241&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-310951099150757246?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/310951099150757246/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=310951099150757246' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/310951099150757246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/310951099150757246'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/04/criptograma-010409.html' title='Criptograma 01/04/09'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7945586801222479267</id><published>2009-03-28T00:15:00.001+01:00</published><updated>2012-01-19T23:51:21.711+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 28/03/09</title><content type='html'>&amp;nbsp; &lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; OTUOBLBNOA LIERYBHAEO ATAMSIEOYS AHRNPIRMUI URNPBENCIP&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; NIMOAUNEAR UJALBREAUN EAEZUNSVUA RLTQETABAM ASTCASAESA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; SHSOBUVNAA IZCUAAEDON SONOBAUNYA UORALMNVES XDETOOSLNO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; CORDDSTOAN RAAOTODHD&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7945586801222479267?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7945586801222479267/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7945586801222479267' title='12 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7945586801222479267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7945586801222479267'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/03/criptograma-280309.html' title='Criptograma 28/03/09'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-544623659625871357</id><published>2009-03-27T22:55:00.007+01:00</published><updated>2012-01-19T23:51:21.664+01:00</updated><title type='text'>Military Cryptanalysis</title><content type='html'>&lt;div style="text-align: justify;"&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;Desde hace ya bastante tiempo, en la web de la NSA está disponible la conocida obra de William F. Friedman "Military Cryptanalysis". Dejo un enlace: &lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.nsa.gov/public_info/declass/military_cryptanalysis.shtml"&gt;http://www.nsa.gov/public_info/declass/military_cryptanalysis.shtml&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-544623659625871357?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/544623659625871357/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=544623659625871357' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/544623659625871357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/544623659625871357'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/03/military-cryptanalysis.html' title='Military Cryptanalysis'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7228344033904617989</id><published>2009-03-26T20:21:00.001+01:00</published><updated>2012-01-19T23:51:21.696+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 26/03/09</title><content type='html'>Y después del aperitivo Kasiski, el plato fuerte!&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VRBCI UGJZB JMCJK EVMBF ZSCNX&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NIWAN CEGYI UVIQV FRWUZ ANWEH&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VLPAT EUQUH RPIIW ONWQB EWXXX&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;RCVAN CCDHH PKMBF FTJYL HCKSE&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;EMCAN NFIBB HYTLB EPLCI ZZXLY&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;UGZOQ VPGYU APWBB RPPAX NVMBB&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;XYHNT QWMIA FXTHZ AUCDE FTXUY&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;EPWOY RKTHM EPWUH JXPKN EWVCG&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VRVUL URZCC ZEUYM OFWGG FHDMF&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;EOQFN EQPFL ANDCY FWRCX GQASF&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;EEIOK ANIPP UIUAA ILSZZ FTFLL&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7228344033904617989?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7228344033904617989/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7228344033904617989' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7228344033904617989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7228344033904617989'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/03/criptograma-260309.html' title='Criptograma 26/03/09'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-2166664516265187103</id><published>2009-03-20T20:12:00.010+01:00</published><updated>2012-01-19T23:51:21.612+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 20/03/09</title><content type='html'>Para practicar Kasiski ...&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;BEAOSERIPMXAQUTLXTDMTLDDTCXABIEAEABEAOSIYEGOCMJCWAHVTCTS&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;NLDOAVXDPBPMJCWAHMPSIRPBPJPNXNDNDTTPXECSTSFUTSXNSICEGOKI&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;KIGAHJJNIATLTSUUTROONEAAWOGRDAQRTTTPPSDYPVTRPSROBOAAKISA&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;IESEEAGAQUTNDSBOBECTDSIEPLOAGAHSDBGEAOHPDBGEHYBEOQJICOHQ&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;JECOWACSPBXDDDTSROALPRBEAOSERIPMXAQUTLXTDMTLDDTCXABIEAEA&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;BEAOSIYEGOCMJCWAHVTCTSNLDOAVXDPBPMJCWAHMPSAAKISATSAURHPD&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;TSEIPDPDPNPDXEIEPYJDPAHICOBAHYHIIUHOAOCOPDTLPNIAHTTIGACD&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;TJPNSOPTGAHAIRPSPNSABURHPCWOSAAESUGOAAIITRGAIOSATLHOAITL&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;BAGSDNEAGAPQJEALDSFUTHPNHAQISOHECTPRHEHOQRTLDSSEBAHMTLDD&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;TCXABIPBJEAIIOBEAOSERIPMXPPPPMTLDDXJTRDNBURHPSKEREHYAOWE&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;DLKISASOHITMERTMPSYOHEPGJSIICGDYIIHOAOPBRDTFVHXJZLBNDPFR&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-2166664516265187103?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/2166664516265187103/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=2166664516265187103' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2166664516265187103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2166664516265187103'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/03/criptograma-20032009.html' title='Criptograma 20/03/09'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-2487706829729565999</id><published>2009-03-17T20:31:00.006+01:00</published><updated>2012-01-19T23:51:21.616+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma II 04/02/09: Solución</title><content type='html'>&lt;div style="text-align: justify;"&gt;El criptograma es una aplicación de los antiguos criptogramas de tipo rejilla. Podemos pensar en ellos como una hoja de papel cuadriculada en la que se realizan diversos agujeros. Aplicando esta rejilla sobre otro papel escribiremos el mensaje en los agujeros. Finalmente, el papel donde se encuentra el mensaje, lo rellenaremos con letras aleatorias.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Así pues, la rejilla sera nuestra clave. Pues aplicandola sobre la "sopa de letras" podremos leer el mensaje en los agujeros.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En nuetro criptograma, se usa la partida mencionada de Kasparov como rejilla, usando la posición final de la partida, cuando en la jugada 19 Kasparov se rinde. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En la posicion final quedan ocupadas las siguientes casillas:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; X . X . . . . X&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; X . . X X . X .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; . . X . . . . X&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; . X . X . X . .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; . . X X . . . .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; . . . X . X X .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; . X . . . X X X&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; X . . . . . X .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y esta es la rejilla que descifra el mensaje.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si ordenamos el criptograma:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; KALU MNIA ASAT UPBA RTAM EPIR CAUD NANN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; HUNI EEVO ALAK MTOI EKSS GLAA TFAG RIUT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;en un cuadro de 8x8, como un tablero de ajedrez:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; K A L U M N I A&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; A S A T U P B A&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; R T A M E P I R&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; C A U D N A N N&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; H U N I E E V O&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; A L A K M T O I&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; E K S S G L A A&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; T F A G R I U T&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aplicando nuestra rejilla, obtenemos nuestro mensaje:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; K . L . . . . A&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; A . . T U . B .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; . . A . . . . R&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; . A . D . A . .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; . . N I . . . .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; . . . K . T O .&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; . K . . . L A A&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; T . . . . . U .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mensaje: KLAATU BARADA NIKTO&lt;br /&gt;&lt;br /&gt;Las celebres palabras de Gort.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-2487706829729565999?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/2487706829729565999/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=2487706829729565999' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2487706829729565999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2487706829729565999'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/03/criptograma-ii-040209-solucion.html' title='Criptograma II 04/02/09: Solución'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-2107300684513935478</id><published>2009-02-14T00:05:00.010+01:00</published><updated>2012-01-20T09:26:10.571+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenDomo'/><title type='text'>OpenDomo visto desde una PSP</title><content type='html'>&lt;div style="text-align: justify;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;Oriol Palenzuela nos muestra en su artículo "&lt;a href="http://www.opendomo.com/drupal/node/30"&gt;Accediendo a OpenDomo desde dispositivos móviles&lt;/a&gt;", cómo se ve OpenDomo desde la PSP.&lt;/div&gt;&lt;br /&gt;Adjunto las capturas:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_TcA3Br7bURY/SZX8niAh0jI/AAAAAAAAAEI/CLoWRmygfKc/s1600-h/1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_TcA3Br7bURY/SZX8niAh0jI/AAAAAAAAAEI/CLoWRmygfKc/s400/1.JPG" style="cursor: move;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_TcA3Br7bURY/SZX8rmBnzhI/AAAAAAAAAEQ/I6mbC37-QqU/s1600-h/2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_TcA3Br7bURY/SZX8rmBnzhI/AAAAAAAAAEQ/I6mbC37-QqU/s400/2.JPG" style="cursor: move;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_TcA3Br7bURY/SZX8wUoLLfI/AAAAAAAAAEY/-oFd7SWCfCI/s1600-h/3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_TcA3Br7bURY/SZX8wUoLLfI/AAAAAAAAAEY/-oFd7SWCfCI/s400/3.JPG" style="cursor: move;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-2107300684513935478?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/2107300684513935478/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=2107300684513935478' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2107300684513935478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2107300684513935478'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/02/opendomo-visto-desde-una-psp.html' title='OpenDomo visto desde una PSP'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_TcA3Br7bURY/SZX8niAh0jI/AAAAAAAAAEI/CLoWRmygfKc/s72-c/1.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-471428836471359677</id><published>2009-02-11T23:46:00.021+01:00</published><updated>2012-01-19T23:34:48.182+01:00</updated><title type='text'>Documentación sobre la Mente y la Consciencia</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;El siguiente enlace contiene una gran colección de enlaces a documentación sobre la mente y la consciencia. Sin duda, una mina para todo aquel interesado en la vertiente más pura de la Inteligencia Artificial. No esperéis encontrar muchos algoritmos ;)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://consc.net/mindpapers/"&gt;MindPapers: A Bibliography of the Philosophy of Mind and the Science of Consciousness&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;También pueden consultarse únicamente los enlaces a &lt;a href="http://consc.net/online/"&gt;documentos on-line&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-471428836471359677?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/471428836471359677/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=471428836471359677' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/471428836471359677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/471428836471359677'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/02/papers-sobre-inteligencia-artificial.html' title='Documentación sobre la Mente y la Consciencia'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-253454439518345323</id><published>2009-02-06T07:47:00.001+01:00</published><updated>2012-01-19T23:36:19.446+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Redes'/><category scheme='http://www.blogger.com/atom/ns#' term='Sistemas Operativos'/><title type='text'>Cómo agilizar conexionex SSH</title><content type='html'>&lt;div style="text-align: justify;"&gt;Dejo aquí una pequeña receta que permite agilizar las conexiones ssh, de manera que solo pedirá la contraseña la primera vez. A partir de ese momento las conexiones usarán el mismo canal multiplexado.&lt;/div&gt;&lt;br /&gt;Solo hay que añadir en ~/.ssh/config lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre class="programlisting"&gt;Host *&lt;br /&gt;ControlMaster auto&lt;br /&gt;ControlPath ~/.ssh/master-%r@%h:%p&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-253454439518345323?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/253454439518345323/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=253454439518345323' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/253454439518345323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/253454439518345323'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/01/como-agilizar-conexionex-ssh.html' title='Cómo agilizar conexionex SSH'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7423224522009714969</id><published>2009-02-04T19:00:00.001+01:00</published><updated>2012-01-19T23:51:21.702+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma II 04/02/09</title><content type='html'>&lt;a href="https://www.blogger.com/comment.g?blogID=8201731322115542179&amp;amp;postID=5011971749510092148"&gt;Altair&lt;/a&gt; se los come como rosquillas, así que ahí va otro.&lt;br /&gt;No será por falta de criptogramas ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pista:&amp;nbsp;&amp;nbsp; Deep Blue - Kasparov, 1997, Game 6&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;KALU MNIA ASAT UPBA RTAM EPIR CAUD NANN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;HUNI EEVO ALAK MTOI EKSS GLAA TFAG RIUT&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7423224522009714969?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7423224522009714969/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7423224522009714969' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7423224522009714969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7423224522009714969'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/02/criptograma-ii-040209.html' title='Criptograma II 04/02/09'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-5011971749510092148</id><published>2009-02-04T07:54:00.005+01:00</published><updated>2012-01-19T23:51:21.652+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><title type='text'>Criptograma 04/02/09</title><content type='html'>&lt;div style="text-align: justify;"&gt;No me gusta dejar a los lectores sin 'material' para romperse el coco. Por suerte, aún y con la rapidez de &lt;a href="https://www.blogger.com/comment.g?blogID=8201731322115542179&amp;amp;postID=2412044699493947810"&gt;Altair&lt;/a&gt;, todavía me quedan unos cuantos criptogramas en la manga.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Que os divirtáis!&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;TCZVAUAOOQOVNVDMULIAIOPEUTG&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DELSMAUALEEETJECJENOELOONSR&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;RUNYCUIONJEUFONIUNARYEVNODI&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SGETREEERROMRRCOSDENOODOEQA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NNOYRURUVUTEEONIGOGLNCRLDLA&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;EOTAOAUNLISLSNUAEAOEINPRDDS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;CSSOAETAOONMMAVLGESANEORNLS&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-5011971749510092148?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/5011971749510092148/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=5011971749510092148' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/5011971749510092148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/5011971749510092148'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/02/criptograma-040209.html' title='Criptograma 04/02/09'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-484424557679036764</id><published>2009-02-03T07:02:00.008+01:00</published><updated>2012-01-19T23:51:21.649+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2008'/><title type='text'>El criptograma del 2008: solución</title><content type='html'>&lt;div style="text-align: justify;"&gt;Finalmente nadie ha sido capaz de resolver &lt;a href="http://dlerch.blogspot.com/2008/08/criptograma-verano-2008.html"&gt;el criptograma del 2008&lt;/a&gt;.&lt;br /&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Lo cierto es que de entrada, no era nada fàcil, aunque hay que decir que la pista que di facilitaba bastante las cosas. A continuación voy a poner un ejemplo de como resolver el criptograma partiendo de la pista.&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;Pista:&lt;br /&gt;Es un texto de Sun Tzu 'El Arte de la Guerra'.&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;A parte de probar todos les textos del libro:) se podía probar a sustituir "el arte de la guerra" como frase inicial, y partir de ella:&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;elartedelaguerraCeUaCaeJeleJgaLKSKrlKtaJ&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;tKEuaJdKeCEaSaQdeataEarVadeaSareJtarNJEa&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SaENdadEuaJdKlaCtrKSaCCeBueFeJaSareJtarN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;JaEtNFNdadCNeCtaEerEadeleJeBNgKVadeVaEer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;leEreerPueeCtaleRKCCNeCtaleRKCaSareJtarP&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ueCeeCtaEerEaSKJerEeUKCSaraatraeraleJeBN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;gKgKlSearaleJeBNgKEuaJdKeCtadeCKrdeJadKS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;reSararCeEKJtraelEuaJdKeCtaCegurKeJtKdaC&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SarteCeFNtarleduraJteuJtNeBSKEuaJdKeCBaC&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;XuerteCNtuKSKJeJtetNeJeuJteBSeraBeJtKEKl&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;erNEKNJteJtaNrrNtarleCNeCarrKgaJtetratad&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;eXKBeJtarCuegKtNCBKCNlaCtrKSaCeJeBNgaCCe&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;VallaJUNeJSreSaradaCtraCuJareKrgaJNQaENK&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;JNJteJtadeCKrdeJarlaCCNeCtaJuJNdaCCNeBUr&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;aladNCeJCNKJeJtreCuCXNlaCataEaaleJeBNgKE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;uaJdKJKeCtaSreSaradKWaSareEeEuaJdKJKteeC&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SeraeCtaCCKJlaCElaFeCdelaFNEtKrNaSaraele&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;CtrategaCuJtQuelartedelaguerra&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Un buen indicio de que al hacer esto vamos bien encaminados sería ver que la frase final también es "el arte de la guerra". Ademas, dado que los últimos criptogramas siempre han sido de tipo frase-autor es de esperar que la 'u' que aparece antes de "el arte de la guerra" del final del criptograma, corresponda a "Sun Tzu".&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;elartedelaguerraseUasaenelengaLKSKrlKtan&lt;br /&gt;tKEuandKesEaSazdeataEarVadeaSarentarNnEa&lt;br /&gt;SaENdadEuandKlastrKSasseBueFenaSarentarN&lt;br /&gt;naEtNFNdadsNestaEerEadeleneBNgKVadeVaEer&lt;br /&gt;leEreerPueestaleRKssNestaleRKsaSarentarP&lt;br /&gt;ueseestaEerEaSKnerEeUKsSaraatraeraleneBN&lt;br /&gt;gKgKlSearaleneBNgKEuandKestadesKrdenadKS&lt;br /&gt;reSararseEKntraelEuandKestasegurKentKdas&lt;br /&gt;SarteseFNtarleduranteuntNeBSKEuandKesBas&lt;br /&gt;XuertesNtuKSKnentetNeneunteBSeraBentKEKl&lt;br /&gt;erNEKNntentaNrrNtarlesNesarrKgantetratad&lt;br /&gt;eXKBentarsuegKtNsBKsNlastrKSaseneBNgasse&lt;br /&gt;VallanUNenSreSaradastrasunareKrganNzaENK&lt;br /&gt;nNntentadesKrdenarlassNestanunNdassNeBUr&lt;br /&gt;aladNsensNKnentresusXNlasataEaaleneBNgKE&lt;br /&gt;uandKnKestaSreSaradKWaSareEeEuandKnKtees&lt;br /&gt;SeraestassKnlasElaFesdelaFNEtKrNaSaraele&lt;br /&gt;strategasuntzuelartedelaguerra&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En este punto, observando las sustituciones ya vemos que se trata de un &lt;a href="http://dlerch.blogspot.com/2008/08/cifrados-de-sustitucin-homofnica.html"&gt;cifrado de sustitución homofónica&lt;/a&gt;. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;A partir de aquí resulta sencillo terminar de resolver el criptograma. Solo es necesario ir mirando las palabras incompletas e intentar completarlas con un poco de imaginación.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Por ejemplo, en las lineas 6-7 encontramos:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;atraeraleneBNgK &lt;/div&gt;&lt;div style="text-align: justify;"&gt;de lo que podemos deducir que B=m, N=i, K=o.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Tambien podemos ver que E=c a partir de "Euando", que S=p de "escaSaz", que U=b de "seUasa", etc.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Finalmente, este es el resultado (he añadido los signos de puntuación que no estan en el criptograma):&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;El arte de la guerra se basa en el engaño&lt;/i&gt;. Por lo tanto, cuando es capaz de atacar, ha de aparentar incapacidad; cuando las tropas se mueven, aparentar inactividad. Si está cerca del enemigo, ha de hacerle creer que está lejos; si está lejos, aparentar que se está cerca. Poner cebos para atraer al enemigo. Golpear al enemigo cuando está desordenado. Prepararse contra él cuando está seguro en todas partes. Evitarle durante un tiempo cuando es más fuerte. Si tu oponente tiene un temperamento colérico, intenta irritarle. Si es arrogante, trata de fomentar su egotismo. Si las tropas enemigas se hallan bien preparadas tras una reorganización, intenta desordenarlas. Si están unidas, siembra la disensión entre sus filas. Ataca al enemigo cuando no está preparado, y aparece cuando no te espera. Estas son las claves de la victoria para el estratega.&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sun Tzu, 'El Arte de la Guerra' &lt;/blockquote&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Alguno se preguntará como resolverlo sin la pista. Pues bien, es bastante complicado. de entrada no nos podemos fiar de las frecuencias, por ser homofónico, así que solo nos queda probar palabras. Dado que no sabemos de que trata el criptograma el tema se complica.&lt;br /&gt;El único punto donde nos podemos agarrar es en la frecuencia de ciertos bloques de letras o en patrones comunes en castellano, como puden ser las LL. A partir de aquí, imaginación y un poco de ayuda del ordenador para aplicar fuerza bruta.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fuentes:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.gorinkai.com/textos/suntzu.htm"&gt;http://www.gorinkai.com/textos/suntzu.htm&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-484424557679036764?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/484424557679036764/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=484424557679036764' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/484424557679036764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/484424557679036764'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/02/el-criptograma-del-2008-solucion.html' title='El criptograma del 2008: solución'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-2412044699493947810</id><published>2009-01-31T20:00:00.002+01:00</published><updated>2012-01-19T23:51:21.614+01:00</updated><title type='text'>Criptograma 31/01/09</title><content type='html'>&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: left;"&gt;BRGOK OJBJT MJVQL&lt;br /&gt;LJLQV QTQMB JOGAJ&lt;br /&gt;KTFQL GJLVJ MJCQO&lt;br /&gt;QSJVF LKOJW RQQVB&lt;br /&gt;JLLQB FJTJM JCQYL&lt;br /&gt;JIKOJ OJTKM OUTRF &lt;br /&gt;C&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-2412044699493947810?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/2412044699493947810/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=2412044699493947810' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2412044699493947810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2412044699493947810'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/01/criptograma-310109.html' title='Criptograma 31/01/09'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4846533685091414643</id><published>2009-01-29T08:42:00.015+01:00</published><updated>2012-01-20T09:26:10.579+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenDomo'/><title type='text'>Nueva web de OpenDomo</title><content type='html'>Despues de tener que dejar el antiguo hosting y de una problemática migración en la que el &lt;a href="http://www.joomla.org/"&gt;maldito Joomla&lt;/a&gt; nos impidió restaurar la base de datos&amp;nbsp; de forma correcta, &lt;a href="http://www.opendomo.org/"&gt;OpenDomo&lt;/a&gt; se pasa a &lt;a href="http://drupal.org/"&gt;Drupal&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;De momento estamos muy contentos con el, así que os invito a echarle un &lt;a href="http://www.opendomo.org/"&gt;vistazo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-4846533685091414643?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/4846533685091414643/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=4846533685091414643' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4846533685091414643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4846533685091414643'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/01/nueva-web-de-openddomo.html' title='Nueva web de OpenDomo'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-6315523770857928829</id><published>2009-01-27T19:11:00.006+01:00</published><updated>2012-01-19T23:22:23.683+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Bash: printf() en color</title><content type='html'>El siguiente código permite escribir 'en color' en terminales bash.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define COLOR_RED "\e[31m"&lt;br /&gt;#define COLOR_B_RED "\e[31;1m"&lt;br /&gt;#define COLOR_GREEN "\e[32m"&lt;br /&gt;#define COLOR_B_GREEN "\e[32;1m"&lt;br /&gt;#define COLOR_YELLOW "\e[33m"&lt;br /&gt;#define COLOR_B_YELLOW "\e[33;1m"&lt;br /&gt;#define COLOR_BLUE "\e[34m"&lt;br /&gt;#define COLOR_B_BLUE "\e[34;1m"&lt;br /&gt;#define COLOR_MAGENTA "\e[35m"&lt;br /&gt;#define COLOR_BRIGHT "\e[1m"&lt;br /&gt;#define COLOR_CYAN "\e[36m"&lt;br /&gt;#define COLOR_NONE "\e[m"&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(COLOR_RED "hello world\n" COLOR_NONE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(COLOR_B_RED "hello world\n" COLOR_NONE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(COLOR_GREEN "hello world\n" COLOR_NONE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(COLOR_B_GREEN "hello world\n" COLOR_NONE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(COLOR_YELLOW "hello world\n" COLOR_NONE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(COLOR_B_YELLOW "hello world\n" COLOR_NONE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(COLOR_BLUE "hello world\n" COLOR_NONE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(COLOR_B_BLUE "hello world\n" COLOR_NONE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(COLOR_CYAN "hello world\n" COLOR_NONE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(COLOR_MAGENTA "hello world\n" COLOR_NONE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(COLOR_BRIGHT "hello world\n" COLOR_NONE);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-6315523770857928829?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/6315523770857928829/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=6315523770857928829' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6315523770857928829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6315523770857928829'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2009/01/bash-printf-en-color.html' title='Bash: printf() en color'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-6062416356723571632</id><published>2009-01-17T10:42:00.001+01:00</published><updated>2012-01-19T23:51:21.673+01:00</updated><title type='text'>Criptograma 17/01/2009</title><content type='html'>&lt;div style="text-align: justify;"&gt;IGCBIHKHEGEATNGZGPBZBSGINBZLBZUFBIUPSGKUZPSGZEBFPUIMBFEBFTBSLB,VTBMTBEBZ UKTSSHSMUKGFRBKBF, FHZUKUZMBVTB~GFKUFGFVTBUKTSSBZLUEUFIUFEHGF.&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;QBZJGNHZCSGZWIHZ&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-6062416356723571632?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/6062416356723571632/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=6062416356723571632' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6062416356723571632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6062416356723571632'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/08/criptograma-semanal-160808.html' title='Criptograma 17/01/2009'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-3827740222656259026</id><published>2008-12-14T20:00:00.027+01:00</published><updated>2012-01-19T23:34:48.167+01:00</updated><title type='text'>Inteligencia Artificial: los chatbots</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Actualmente dedico la mayor parte de mi tiempo libre al proyecto &lt;a href="http://www.opendomo.com/"&gt;OpenDomo&lt;/a&gt;, lo que me resta tiempo para investigar sobre seguridad y criptografía, que siempre han sido mis hobbies principales. Así pues, a partir de ahora, la temática del blog girará alrededor de OpenDomo, tratando de seguridad, Inteligencia Artificial, electrónica o lo que se cueza en ese momento en dicho proyecto.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Con este objetivo y el de ampliar un poco los horizontes del blog, he decidido crear una nueva sección de Inteligencia Artificial, donde iré publicando pequeños artículos de todo tipo, tal y como he ido haciendo con las seguridad informática.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Parecería lógico empezar esta entrada sobre Inteligencia Artifical con una definición del concepto, pero resulta que el tema es motivo de conflicto. Dado que no existe una definición totalmente aceptada he decido tirar de la más polémica: la usada en el &lt;a href="http://www.loebner.net/Prizef/loebner-prize.html"&gt;Premio Loebner&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En 1950, Alan Madison Turing en su artículo &lt;a href="http://loebner.net/Prizef/TuringArticle.html" target="_blank"&gt;&lt;i&gt;&lt;/i&gt;&lt;/a&gt;&lt;i&gt;&lt;a href="http://www.loebner.net/Prizef/TuringArticle.html"&gt;Computing Machinery and Intelligence&lt;/a&gt;&lt;/i&gt; se planteó si las máquinas podían llegar a pensar, y en caso de poder hacerlo, cómo podríamos saberlo. La conclusión de Turing fué que sabremos que una máquina piensa cuando sus respuestas sean indistinguibles de las de un humano.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Así, en 1990 Hugh Loebner implementaba un Test de Turing, en el que se ofrecía 100.000$ y una medalla de oro a la primera computadora cuyas respuestas fuesen indistinguibles de las de un humano. Daba origen así al &lt;a href="http://www.loebner.net/Prizef/loebner-prize.html"&gt;Premio Loebner&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Con el objetivo de ganar dicho galardon y marcar un antes y un después en la historia de la IA son muchos los que lo han intentado. Bastan unas pocas búsquedas en google para encontrar gran cantidad de chatbots.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Si bien es cierto que desarrollar un buen chatbot es realmente difícil, hasta el punto de que hoy por hoy, ninguno ha conseguido pasar el test de Turing, es sorprendente lo fácil que es crear un bot que 'de el pego'.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Adjunto uno que he hecho en shellscript en unas pocas lineas.&lt;/div&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;DATABASE=database&lt;br /&gt;&lt;br /&gt;touch $DATABASE&lt;br /&gt;&lt;br /&gt;while true; &lt;br /&gt;do&lt;br /&gt;   read -p "humano: " line&lt;br /&gt;   echo $line &amp;gt;&amp;gt; database&lt;br /&gt;   &lt;br /&gt;   data_size=`wc -l $DATABASE | cut -d' ' -f1`&lt;br /&gt;   nline=$(( $RANDOM % $data_size + 1 ))&lt;br /&gt;   new_line=`tail -$nline $DATABASE | head -1`&lt;br /&gt;   echo "bot: $new_line"&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Como es lógico, no se puede esperar mucha inteligencia de este bot, pero aun y así, se desprenden conversaciones sorprendentes. &lt;br /&gt;&lt;br /&gt;Empezando con una base de datos simple como la siguiente:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;$ cat database&lt;br /&gt;Hola&lt;br /&gt;Que tal estas?&lt;br /&gt;Me llamo bot y soy un Bot&lt;br /&gt;Como te llamas?&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;He tenido la siguiente conversación: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;humano: Hola&lt;br /&gt;bot: Me llamo bot y soy un Bot&lt;br /&gt;humano: Hola Bot&lt;br /&gt;bot: Hola&lt;br /&gt;humano: Quieres conversar conmigo?&lt;br /&gt;bot: Hola Bot&lt;br /&gt;humano: No, bot eres tu&lt;br /&gt;bot: Que tal estas?&lt;br /&gt;humano: bien&lt;br /&gt;bot: Me llamo bot y soy un Bot&lt;br /&gt;humano: ya lo se&lt;br /&gt;bot: Como te llamas?&lt;br /&gt;humano: Dani &lt;br /&gt;bot: Hola Bot&lt;br /&gt;humano: ese eres tu&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;bot: ese eres tu&lt;br /&gt;humano: no, tu&lt;br /&gt;bot: Hola&lt;br /&gt;humano: me estas mosqueando ...&lt;br /&gt;bot: me estas mosqueando ...&lt;br /&gt;humano: por que te mosqueas?&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;bot: Como te llamas?&lt;br /&gt;humano: Dani&lt;br /&gt;bot: Dani&lt;br /&gt;humano: Si, dime&lt;br /&gt;bot: Hola Bot&lt;br /&gt;humano: que no, que soy Dani&lt;br /&gt;bot: Me llamo bot y soy un Bot&lt;br /&gt;humano: vale, captado&lt;br /&gt;bot: por que te mosqueas?&lt;br /&gt;humano: es que eres muy pesado&lt;br /&gt;bot: no, tu&lt;br /&gt;humano: yo no soy pesado!&lt;br /&gt;bot: Si, dime&lt;br /&gt;humano: Que no soy pesado&lt;br /&gt;bot: Que no soy pesado&lt;br /&gt;humano: que no&lt;br /&gt;bot: ya lo se&lt;br /&gt;humano: ah, bueno&lt;br /&gt;bot: Quieres conversar conmigo?&lt;br /&gt;humano: eso estamos haciendo&lt;br /&gt;bot: vale, captado&lt;br /&gt;humano: entonces, de que quieres hablar?&lt;br /&gt;bot: Dani&lt;br /&gt;humano: Si&lt;br /&gt;bot: me estas mosqueando ...&lt;br /&gt;humano: ui!&lt;br /&gt;bot: vale, captado&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Aunque la conversación carece de sentido, lo cierto es que no resulta del todo inverosímil. El problema con este tipo de bots y otros de más sofisticados pero que usan las mismas técnicas, es que no llegan a comprender las frases. Se dedican simplemente a realizar construcciones habituales y a repetir frases. Sin duda, no parece la técnica adecuada para superar el Test de Turing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-3827740222656259026?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/3827740222656259026/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=3827740222656259026' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3827740222656259026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/3827740222656259026'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/12/inteligencia-artificial.html' title='Inteligencia Artificial: los chatbots'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4244830030492812881</id><published>2008-12-07T09:31:00.003+01:00</published><updated>2012-01-19T22:32:24.784+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Cómo crear usuarios en C / Linux</title><content type='html'>&lt;div style="text-align: justify;"&gt;En ocasiones necesitamos crear usuarios desde un programa en C y aunque podría bastar haciendo una llamada a 'useradd' siempre es más elegante usar las llamadas al sistema. En este artículo voy a  explicar cómo crear un usuario con su correspondiente registro en /etc/passwd y en /etc/shadow.&lt;br /&gt;&lt;br /&gt;Lo primero que necesitamos es una estructura donde guardar los datos que almacenaremos en /etc/passwd, para usar esta estructura 'struct passwd' necesitaremos la cabecera 'pwd.h'.&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;struct passwd p;&lt;br /&gt;&lt;br /&gt;p.pw_name = "myusername";&lt;br /&gt;p.pw_passwd = "x";&lt;br /&gt;p.pw_uid = 1000;&lt;br /&gt;p.pw_gid = 1000;&lt;br /&gt;p.pw_gecos = "Test User";&lt;br /&gt;p.pw_dir = "/home/myusername";&lt;br /&gt;p.pw_shell = "/bin/sh";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A destacar la 'x' en pw_passwd, pues recordemos que estamos usando shadow passwords y por lo tanto la password se guardará en /etc/shadow. Respecto a los demas campos, a elegir.&lt;br /&gt;&lt;br /&gt;Aun así, es interesante ver como podemos escoger un id para un usuario para no repetirlo.&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;struct passwd *pw = NULL;&lt;br /&gt;int min = 1000;&lt;br /&gt;int max = 65000;&lt;br /&gt;&lt;br /&gt;f = fopen("/etc/passwd", "r");&lt;br /&gt;&lt;br /&gt;/* check user and get valid id */&lt;br /&gt;while ((pw = fgetpwent(f)))&lt;br /&gt;{&lt;br /&gt;if (strcmp(pw-&amp;gt;pw_name, p.pw_name) == 0)&lt;br /&gt;{&lt;br /&gt;perror("user_add(): user exists");&lt;br /&gt;exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if ((pw-&amp;gt;pw_uid &amp;gt;= p.pw_uid) &amp;amp;&amp;amp; (pw-&amp;gt;pw_uid &amp;lt;&amp;gt;pw_uid &amp;gt;= min))&lt;br /&gt;{&lt;br /&gt;p.pw_uid = pw-&amp;gt;pw_uid + 1;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;fclose(f);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ya tenemos la entrada de /etc/passwd preparada, así que la añadiremos al fichero de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;f = fopen("/etc/passwd", "a+");&lt;br /&gt;if(!f)&lt;br /&gt;{&lt;br /&gt;perror("user_add(): cannot open /etc/passwd");&lt;br /&gt;exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (putpwent(&amp;amp;p, f) == -1)&lt;br /&gt;{&lt;br /&gt;perror("user_add(): putpwent() error");&lt;br /&gt;exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;fclose(f);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vayamos ahora a por las shadow. El proceso es similar al anterior, solo que ahora usaremos una estructura 'struct spwd sp;' para la cual necesitamos la cabecera 'shadow.h'.&lt;br /&gt;Además ha llegado el momento de crear la contraseña, para lo que usaremos la función 'crypt()'. Esta a su vez, necesita una salt, que la crearemos tal y como vemos a continuación.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;struct timeval tv;&lt;br /&gt;static char salt[40];&lt;br /&gt;&lt;br /&gt;salt[0] = '\0';&lt;br /&gt;&lt;br /&gt;gettimeofday (&amp;amp;tv, (struct timezone *) 0);&lt;br /&gt;strcat(salt, l64a (tv.tv_usec));&lt;br /&gt;strcat(salt, l64a (tv.tv_sec + getpid () + clock ()));&lt;br /&gt;&lt;br /&gt;if (strlen (salt) &amp;gt; 3 + 8)&lt;br /&gt;salt[11] = '\0';&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esta forma de crear la salt es bastante común, aunque hay otros enfoques válidos. Al final, se trata de genererar diferentes salt cada vez que se crea un usuario.&lt;br /&gt;&lt;br /&gt;Vamos ahora a rellenar la estructura shadow:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;#define DAY (24L*3600L)&lt;br /&gt;#define WEEK (7*DAY)&lt;br /&gt;#define SCALE DAY&lt;br /&gt;...&lt;br /&gt;struct spwd sp;&lt;br /&gt;sp.sp_namp = p.pw_name;&lt;br /&gt;sp.sp_pwdp = (char*)crypt(passwd, salt);&lt;br /&gt;sp.sp_min = 0;&lt;br /&gt;sp.sp_max = (10000L * DAY) / SCALE;&lt;br /&gt;sp.sp_lstchg = time((time_t *) 0) / SCALE;&lt;br /&gt;sp.sp_warn = -1;&lt;br /&gt;sp.sp_expire = -1;&lt;br /&gt;sp.sp_inact = -1;&lt;br /&gt;sp.sp_flag = -1;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El segundo campo corresponde a la contraseña cifrada en DES, de la forma tradicional y poco segura. Este parámetro se puede mejorar usando otras funciones de cifrado. &lt;br /&gt;Los parámetros siguientes indican los dias de cambios de password, expiración de la cuenta, etc. Ver detalles mediante 'man shadow'.&lt;br /&gt;&lt;br /&gt;Finalmente, solo nos queda añadir el registro en /etc/shadow:&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;f = fopen("/etc/shadow", "a+");&lt;br /&gt;if(!f)&lt;br /&gt;{&lt;br /&gt;perror("user_add(): cannot open /etc/shadow");&lt;br /&gt;exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (putspent(&amp;amp;sp, f) == -1)&lt;br /&gt;{&lt;br /&gt;perror("user_add(): putspent() error");&lt;br /&gt;exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;fclose(f);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Algunos cambios interesantes son usar una función de cifrado más segura, bloquear los archivos /etc/passwd y /etc/shadow antes de abrirlos, y verificar en /etc/shadow que no existe ningun registro que coincida con el que vamos a añadir, tal y como hemos hecho con /etc/passwd. Tambien quedaría realizar una gestión del grupo, como por ejemplo, crearlo si es necesario. En cualquier caso quedan cubiertos los objetivos de este artículo, ver como se hece en leguaje C para crear un usuario de Linux.&lt;br /&gt;&lt;br /&gt;A propósito, borrar un usuario consisitiría, simplemente, en eliminar la linea correspondiente de /etc/passwd y /etc/shadow. Así pues, que nadie me pida que explique cómo hacer un programa en c para borrar usuarios ;)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-4244830030492812881?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/4244830030492812881/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=4244830030492812881' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4244830030492812881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4244830030492812881'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/12/cmo-crear-usuarios-en-c-linux.html' title='Cómo crear usuarios en C / Linux'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-739172241579735079</id><published>2008-11-30T18:00:00.002+01:00</published><updated>2012-01-19T22:16:55.333+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Criptografía'/><title type='text'>Simulador de la máquina Enigma</title><content type='html'>Dejo un enlace a un simulador de &lt;a href="http://en.wikipedia.org/wiki/Enigma_machine"&gt;máquina Enigma&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://enigmaco.de/enigma/enigma.swf"&gt;http://enigmaco.de/enigma/enigma.swf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-739172241579735079?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/739172241579735079/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=739172241579735079' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/739172241579735079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/739172241579735079'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/11/simulador-de-la-mquina-enigma.html' title='Simulador de la máquina Enigma'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-791785474861334411</id><published>2008-11-30T10:42:00.006+01:00</published><updated>2012-01-20T09:26:10.589+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenDomo'/><title type='text'>OpenDomo publica sus primeras screenshots</title><content type='html'>&lt;div style="text-align: justify;"&gt;.&lt;br /&gt;Hace cerca de tres años fundé el proyecto &lt;a href="http://www.opendomo.com/"&gt;OpenDomo&lt;/a&gt; con el objetivo de crear un sistema libre de domótica y seguridad para el Hogar. Ahora OpenDomo, aunque aun lejos de su primera versión estable, publica sus primeras screenshots.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.opendomo.com/images/startup.png" target="_blank"&gt;http://www.opendomo.com/&lt;wbr&gt;images/startup.png&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.opendomo.com/images/login.png" target="_blank"&gt;http://www.opendomo.com/&lt;wbr&gt;images/login.png&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.opendomo.com/images/principal.png" target="_blank"&gt;http://www.opendomo.com/&lt;wbr&gt;images/principal.png&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.opendomo.com/images/configurar.png" target="_blank"&gt;http://www.opendomo.com/&lt;wbr&gt;images/configurar.png&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.opendomo.com/images/paquetes.png" target="_blank"&gt;http://www.opendomo.com/&lt;wbr&gt;images/paquetes.png&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.opendomo.com/images/instalarpaquetes.png" target="_blank"&gt;http://www.opendomo.com/images/&lt;wbr&gt;instalarpaquetes.png&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.opendomo.com/images/installpackage.png" target="_blank"&gt;http://www.opendomo.com/&lt;wbr&gt;images/installpackage.png&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Espero que os gusten!&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-791785474861334411?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/791785474861334411/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=791785474861334411' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/791785474861334411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/791785474861334411'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/11/opendomo-publica-sus-primeras.html' title='OpenDomo publica sus primeras screenshots'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7048300877028315622</id><published>2008-11-22T10:05:00.002+01:00</published><updated>2012-01-19T23:22:23.696+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Redes'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Multicast sender/listener</title><content type='html'>Dejo un ejemplo de como hacer &lt;a href="http://en.wikipedia.org/wiki/Multicast"&gt;multicast&lt;/a&gt; en C/Linux.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;sender.c - el envío de mensajes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;#include &amp;lt;arpa/inet.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define PORT 9999&lt;br /&gt;#define GROUP "225.0.0.37"&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;struct sockaddr_in addr;&lt;br /&gt;int fd;&lt;br /&gt;char *message="ieps!";&lt;br /&gt;&lt;br /&gt;if((fd=socket(AF_INET,SOCK_DGRAM,0)) &amp;lt; 0)&lt;br /&gt;{&lt;br /&gt;perror("socket()");&lt;br /&gt;exit(EXIT_FAILURE);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;memset(&amp;amp;addr,0,sizeof(addr));&lt;br /&gt;addr.sin_family=AF_INET;&lt;br /&gt;addr.sin_addr.s_addr=inet_addr(GROUP);&lt;br /&gt;addr.sin_port=htons(PORT);&lt;br /&gt;&lt;br /&gt;while(1)&lt;br /&gt;{&lt;br /&gt;if(sendto(fd, message, strlen(message),&lt;br /&gt;0, (struct sockaddr *) &amp;amp;addr,&lt;br /&gt;sizeof(addr)) &amp;lt; 0)&lt;br /&gt;{&lt;br /&gt;perror("sendto()");&lt;br /&gt;exit(EXIT_FAILURE);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;sleep(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;listener.c - recepción de mensajes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;#include &amp;lt;arpa/inet.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#define PORT 9999&lt;br /&gt;#define GROUP "225.0.0.37"&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;struct sockaddr_in addr;&lt;br /&gt;int fd, nbytes;&lt;br /&gt;unsigned int addrlen;&lt;br /&gt;struct ip_mreq mreq;&lt;br /&gt;char msgbuf[256];&lt;br /&gt;u_int yes=1;&lt;br /&gt;&lt;br /&gt;if((fd=socket(AF_INET,SOCK_DGRAM,0)) &amp;lt; 0)&lt;br /&gt;{&lt;br /&gt;perror("socket");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,&lt;br /&gt;&amp;amp;yes, sizeof(yes)) &amp;lt; 0)&lt;br /&gt;{&lt;br /&gt;perror("setsockopt() SO_REUSEADDR");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;memset(&amp;amp;addr, 0, sizeof(addr));&lt;br /&gt;addr.sin_family=AF_INET;&lt;br /&gt;addr.sin_addr.s_addr=htonl(INADDR_ANY);&lt;br /&gt;addr.sin_port=htons(PORT);&lt;br /&gt;&lt;br /&gt;if(bind(fd,(struct sockaddr *) &amp;amp;addr,&lt;br /&gt;sizeof(addr)) &amp;lt; 0)&lt;br /&gt;{&lt;br /&gt;perror("bind");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;mreq.imr_multiaddr.s_addr=inet_addr(GROUP);&lt;br /&gt;mreq.imr_interface.s_addr=htonl(INADDR_ANY);&lt;br /&gt;&lt;br /&gt;if(setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,&lt;br /&gt;&amp;amp;mreq, sizeof(mreq)) &amp;lt; 0)&lt;br /&gt;{&lt;br /&gt;perror("setsockopt");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;while(1)&lt;br /&gt;{&lt;br /&gt;addrlen=sizeof(addr);&lt;br /&gt;if ((nbytes=recvfrom(fd, msgbuf,&lt;br /&gt;sizeof(msgbuf), 0, (struct sockaddr *)&lt;br /&gt;&amp;amp;addr, &amp;amp;addrlen)) &amp;lt; 0)&lt;br /&gt;{&lt;br /&gt;perror("recvfrom");&lt;br /&gt;exit(1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;puts(msgbuf);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7048300877028315622?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7048300877028315622/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7048300877028315622' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7048300877028315622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7048300877028315622'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/11/multicast-senderlistener.html' title='Multicast sender/listener'/><author><name>Daniel Lerch</name><uri>https://profiles.google.com/101140907360153697686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-1QwcM6gjGYg/AAAAAAAAAAI/AAAAAAAAEkc/V2Z0ynWpHSA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7516187001748598900</id><published>2008-11-19T07:00:00.004+01:00</published><updated>2012-01-19T23:51:21.703+01:00</updated><title type='text'>El Ataque Rho de Pollard</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;Actualizado 19-11-2008&lt;/div&gt;&lt;br /&gt;En un artículo anterior hablamos de la &lt;a href="http://h4ck1t.blogspot.com/2007/09/introduccin-la-criptografa-de-curva.html"&gt;Criptografía de Curva Elíptica&lt;/a&gt;, dando una breve introducción al tema.&lt;br /&gt;&lt;br /&gt;La revista &lt;a href="http://hakin9.org/"&gt;hakin9&lt;/a&gt; ha publicado en su web un artículo que escribí para la edición de Julio de 2007. El artículo, titulado "Criptografía de Curva Elíptica: Ataque Rho de Pollard" explica la teoría de las curvas elípticas e implementa un ataque en C++.&lt;br /&gt;&lt;br /&gt;Se puede descargar el artículo directamente de la web de la revista, o obtener el enlace de &lt;a href="http://www.opendomo.com/dlerch/"&gt;mi web&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;En cualquier caso, ahí va un &lt;a href="http://hakin9.org/upload/hakin9/PDFVersion/curvas_elipticas.pdf"&gt;enlace directo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7516187001748598900?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7516187001748598900/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7516187001748598900' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7516187001748598900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7516187001748598900'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2007/10/el-ataque-rho-de-pollard.html' title='El Ataque Rho de Pollard'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-8094180565478819331</id><published>2008-11-16T12:05:00.002+01:00</published><updated>2012-01-19T23:34:48.249+01:00</updated><title type='text'>Power Over Ethernet Casero</title><content type='html'>&lt;div style="text-align: justify;"&gt;Existe un &lt;a href="http://es.wikipedia.org/wiki/PoE"&gt;estándar&lt;/a&gt; que define la forma de usar cableado de red que incluye alimentación elétrica. Aunque actualmente no resulta sencillo encontrar dispositivos que lo implementen. Por este motivo dedico un post a realizar una implementación casera. Yo lo he usado con éxito en instalaciones de camaras web.&lt;br /&gt;&lt;br /&gt;Si utilizamos para el cableado la norma &lt;a href="http://es.wikipedia.org/wiki/TIA-568B"&gt;568B&lt;/a&gt; el esquema de colores queda como sigue:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;span style="font-family: courier new;"&gt;PIN    COLOR              TIPO&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;1      Blanco/Naranja     TX D1+&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;2      Naranja            TX D1-&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;3      Blanco/Verde       RX D2+&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;4      Azul               Libre&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;5      Blanco/Azul        Libre&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;6      Verde              RX D2-&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;7      Blanco/Marron      Libre&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;8      Marron             Libre&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;La idea consiste en usar alguno de los pares libres para transmitir el voltaje necesario para la camara. Por ejemplo, en mis instalaciones de camaras web (uso cámaras Axis 206 que necesitan 5V y unos 500mA cada una) no hay ningún problema de interferencias, pero con  más de 50V  podríamos tener sorpresas.&lt;br /&gt;&lt;br /&gt;Como he indicado en el listado anterior, los pares libres son el Blanco/Azul - Azul y el Banco/Marrón - marrón. Se trata, simplemente, de usar uno de esos pares para la alimentación del dispositivo.&lt;br /&gt;En principio, resulta más sencillo crimpar el RJ45 con todos los cables y despues cortar el par que nos interesa para la alimentación. Aunque con un poco de práctica no resulta complicado crimpar solo los cables necesarios, y la instalación siempre queda más 'mona'.&lt;br /&gt;&lt;br /&gt;Bueno, aquí queda el código de colores. A ver quien nos cuenta sus experiencias!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-8094180565478819331?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/8094180565478819331/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=8094180565478819331' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8094180565478819331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8094180565478819331'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/11/power-over-ethernet-casero.html' title='Power Over Ethernet Casero'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-8211006175851357227</id><published>2008-11-09T14:45:00.001+01:00</published><updated>2012-01-19T22:24:14.007+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Criptografía'/><title type='text'>Volúmenes cifrados con OpenSSL</title><content type='html'>&lt;div style="text-align: justify;"&gt;Cada vez hay más productos que se venden como  'criptografía fàcil' para todo tipo de usuarios. Estos te permiten montar un volumen de datos de forma realmente sencilla y cifrarlos con criptografía fuerte. Pero no es el propósito de este artículo repasar ni estudiar dichos productos. Aquí, siguiendo la  folosofía del blog,  lo que haremos es crear un &lt;span style="font-style: italic;"&gt;sistema propio&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Usaremos la herramienta &lt;a href="http://www.openssl.org/"&gt;openssl&lt;/a&gt; que nos permitirá lidiar con el cifrado y algunos comandos unix para el manejo del volumen.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Creando un nuevo volumen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para crear un volumen usaremos la herramienta 'dd' que nos permitirá crear un archivo vacío de cierto tamaño. Como ejemplo creamos un volumen de 100MB.&lt;br /&gt;&lt;br /&gt;$ dd if=/dev/zero of=volume bs=1M count=100&lt;br /&gt;&lt;br /&gt;A continuación necesitaremos crear el sistema de ficheros. Por ejemplo, ext3:&lt;br /&gt;&lt;br /&gt;$ mkfs.ext3 volume&lt;br /&gt;&lt;br /&gt;y finalmente cifraremos con blowfish. En este paso openssl nos pedirá la contraseña con la que queremos cifrar el sistema.&lt;br /&gt;&lt;br /&gt;$ openssl enc -blowfish -in volume -out volume.ciph&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Abrir el volumen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para abrir el volumen solo tendremos que descifrar-lo con&lt;br /&gt;&lt;br /&gt;$ openssl enc -blowfish -d -in volume.ciph -out volume&lt;br /&gt;&lt;br /&gt;paso en el que se nos pedirá la contraseña de cifrado. A continuación, para acceder al volumen, lo montaremos.&lt;br /&gt;&lt;br /&gt;$ mount volume /mnt -o loop&lt;br /&gt;&lt;br /&gt;De esta manera, todo lo que guardemos en /mnt quedará almacenado en nuestro volumen de cifrado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cerrar el volumen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una vez hemos terminado de trabajar con nuestro volumen de datos procedemos a cerrarlo y dejarlo cifrado hasta la proxima vez.&lt;br /&gt;&lt;br /&gt;Para tal proposito, desmontaremos el volumen:&lt;br /&gt;&lt;br /&gt;$ umount -l /mnt&lt;br /&gt;&lt;br /&gt;lo cifraremos&lt;br /&gt;&lt;br /&gt;$ openssl enc -blowfish -in volume -out volume.ciph&lt;br /&gt;&lt;br /&gt;y borraremos la copia sin cifrar&lt;br /&gt;&lt;br /&gt;$ rm -f volume&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Comentarios finales&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hemos visto como, de forma muy sencilla, y sin  recurrir a nada más que los comandos habituales de cualquier sistema unix, podemos tener nuestro propio sistema de volumenes cifrados.&lt;br /&gt;&lt;br /&gt;Lógicamente, se le pueden añadir muchas mejoras, como automatizar los comandos con sencillos scripts del estilo create_volume.sh, open_volume.sh, etc o añadir seguridad al sistema, por ejemplo sustituyendo 'rm' por una herramienta de borrado seguro como 'shred'.&lt;br /&gt;&lt;br /&gt;En este caso, sustituir&lt;br /&gt;&lt;br /&gt;$ rm -f volume&lt;br /&gt;&lt;br /&gt;por&lt;br /&gt;&lt;br /&gt;$ shred volume&lt;br /&gt;&lt;br /&gt;aunque el tiempo autmentará considerablemente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-8211006175851357227?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/8211006175851357227/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=8211006175851357227' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8211006175851357227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8211006175851357227'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/11/volmenes-cifrados-con-openssl.html' title='Volúmenes cifrados con OpenSSL'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-2661552376062920851</id><published>2008-10-06T15:51:00.008+02:00</published><updated>2012-01-19T22:32:24.747+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>¿Qué pasa con atoll()?</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;Como programador de sistemas UNIX a veces me encuentro con algunas cosas curiosas con las APIs. Hoy, sin ir mas lejos, me he vuelto loco intentando hacer funcionar atoll().&lt;br /&gt;&lt;br /&gt;En una parte de un viejo programa, se manejaba un identificador de menos de 32 bits. Ese identificador, que provenía de una máquina Cisco en formato cadena, estaba declarado como 'int' y se transformaba mediante atoi().&lt;br /&gt;&lt;br /&gt;Por necesidades ligadas al crecimiento de la empresa, ahora el identificador debía poder almacenar  hasta 56 bits.&lt;br /&gt;&lt;br /&gt;En pocos segundos tenía el programa funcionando con un identificador declarado como 'long', pero ooops! no funcionaba. De hecho, se comportaba  como un 'int'.&lt;br /&gt;&lt;br /&gt;El sistema, un CentOS 5.2, el compilador, gcc 4.1.2, sin problemas conocidos. Así que me dediqué  a hacer  algunas pruebas:&lt;/div&gt;&lt;br /&gt;$ cat test1.c&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;/* 2^31 = 2147483648 */&lt;br /&gt;&lt;br /&gt;char *str="2147483648";&lt;br /&gt;long long i;&lt;br /&gt;&lt;br /&gt;i = atoll(str);&lt;br /&gt;&lt;br /&gt;printf("%ld\n", i);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;$ gcc test1.c&lt;br /&gt;$ ./a.out&lt;br /&gt;-2147483648&lt;br /&gt;&lt;br /&gt;Overflow, exactamente igual que un 'int'.&lt;br /&gt;Me dirijo al man de atoll() y me encuentro con esto:&lt;br /&gt;&lt;blockquote&gt;"The atol() and atoll() functions behave the same as atoi()"&lt;/blockquote&gt;&lt;br /&gt;y efectivamente. La culpa es de la función de conversión, pues con una función my_atoll() personalizada, no existe tal problema:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ cat test2.c&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;#includes&amp;lt;stdio.h&amp;gt;&lt;br /&gt;long long my_atoll(char *str)&lt;br /&gt;{&lt;br /&gt;long long res;&lt;br /&gt;&lt;br /&gt;res = 0;&lt;br /&gt;for (; *str; str++)&lt;br /&gt;res = 10*res + (*str - '0');&lt;br /&gt;&lt;br /&gt;return res;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;/* 2^31 = 2147483648 */&lt;br /&gt;&lt;br /&gt;char *str="2147483648";&lt;br /&gt;long long i;&lt;br /&gt;&lt;br /&gt;i =my_atoll(str);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;printf("%lld\n", i);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;$ gcc test2.c&lt;br /&gt;$ ./a.out&lt;br /&gt;2147483648&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sorprendente ...&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-2661552376062920851?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/2661552376062920851/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=2661552376062920851' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2661552376062920851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2661552376062920851'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/10/qu-pasa-con-atoll.html' title='¿Qué pasa con atoll()?'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-5354581817604635105</id><published>2008-09-22T10:25:00.011+02:00</published><updated>2012-01-19T23:36:19.533+01:00</updated><title type='text'>Linus Torvalds y OpenBSD</title><content type='html'>Recojo otra de las lindezas de Linus. Es que es para coleccionarlas ...&lt;br /&gt;ref: &lt;a href="http://article.gmane.org/gmane.linux.kernel/706950"&gt;http://article.gmane.org/gmane.linux.kernel/706950&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;From: Linus Torvalds  linux-foundation.org&amp;gt;&lt;br /&gt;Subject: Re: [stable] Linux 2.6.25.10&lt;br /&gt;Newsgroups: gmane.linux.kernel&lt;br /&gt;Date: 2008-07-15 16:13:03 GMT  (9 weeks, 5 days, 16 hours and 5 minutes ago)&lt;br /&gt;On Tue, 15 Jul 2008, Linus Torvalds wrote:&lt;br /&gt;&amp;gt;&lt;br /&gt;&amp;gt; So as far as I'm concerned, "disclosing" is the fixing of the bug. It's&lt;br /&gt;&amp;gt; the "look at the source" approach.&lt;br /&gt;&lt;br /&gt;Btw, and you may not like this, since you are so focused on security, one&lt;br /&gt;reason I refuse to bother with the whole security circus is that I think&lt;br /&gt;it glorifies - and thus encourages - the wrong behavior.&lt;br /&gt;&lt;br /&gt;It makes "heroes" out of security people, as if the people who don't just&lt;br /&gt;fix normal bugs aren't as important.&lt;br /&gt;&lt;br /&gt;In fact, all the boring normal bugs are _way_ more important, just because&lt;br /&gt;there's a lot more of them. I don't think some spectacular security hole&lt;br /&gt;should be glorified or cared about as being any more "special" than a&lt;br /&gt;random spectacular crash due to bad locking.&lt;br /&gt;&lt;br /&gt;Security people are often the black-and-white kind of people that I can't&lt;br /&gt;stand. I think the OpenBSD crowd is a bunch of masturbating monkeys, in&lt;br /&gt;that they make such a big deal about concentrating on security to the&lt;br /&gt;point where they pretty much admit that nothing else matters to them.&lt;br /&gt;&lt;br /&gt;To me, security is important. But it's no less important than everything&lt;br /&gt;*else* that is also important!&lt;br /&gt;&lt;br /&gt;Linus&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;pre&gt;&lt;span style="font-family: courier new; font-size: 85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-5354581817604635105?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/5354581817604635105/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=5354581817604635105' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/5354581817604635105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/5354581817604635105'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/09/linus-torvalds-y-openbsd.html' title='Linus Torvalds y OpenBSD'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-1032350274435673416</id><published>2008-09-14T09:47:00.011+02:00</published><updated>2012-01-19T23:36:19.418+01:00</updated><title type='text'>Liberar la HTC Touch</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Recientemente me he visto en la obligación de liberar mi HTC Touch. Es sencillo y útil, así que, aunque existen muchos tutoriales en la red, dejo aquí los pasos a sequir.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Descargar y ejecutar &lt;a href="http://www.todosmartphone.com/todosmartphone-down.php?f=4&amp;amp;PHPSESSID=7f9ea5af7cc66f2c2602793c5b935e3d"&gt;Cert_SPCS.cab&lt;/a&gt; en la PDA.&lt;/li&gt;&lt;li&gt;Descargar y ejecutar &lt;a href="http://www.todosmartphone.com/todosmartphone-down.php?f=5&amp;amp;PHPSESSID=7f9ea5af7cc66f2c2602793c5b935e3d"&gt;EnableRapi.cab&lt;/a&gt; en la PDA.&lt;/li&gt;&lt;li&gt;Descargar &lt;span style="font-family:Verdana,Arial,Helvetica,sans-serif;"&gt;&lt;span style=";font-family:Georgia,Times New Roman,Times,serif;font-size:small;"  &gt;&lt;a href="http://www.todosmartphone.com/todosmartphone-down.php?f=6&amp;amp;PHPSESSID=7f9ea5af7cc66f2c2602793c5b935e3d"&gt;Touch_Unlock.exe&lt;/a&gt; en el PC.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana,Arial,Helvetica,sans-serif;"&gt;&lt;span style=";font-family:Georgia,Times New Roman,Times,serif;font-size:small;"  &gt;Conectar la HTC con el PC mediante ActiveSync (USB).&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana,Arial,Helvetica,sans-serif;"&gt;&lt;span style=";font-family:Georgia,Times New Roman,Times,serif;font-size:small;"  &gt;Ejecutar el &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Verdana,Arial,Helvetica,sans-serif;"&gt;&lt;span style=";font-family:Georgia,Times New Roman,Times,serif;font-size:small;"  &gt;Touch_Unlock.exe, el cual generará un archivo unlock_code.txt.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana,Arial,Helvetica,sans-serif;"&gt;&lt;span style=";font-family:Georgia,Times New Roman,Times,serif;font-size:small;"  &gt;Apagar la HTC Touch, introducir la SIM de otro operador e iniciar.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana,Arial,Helvetica,sans-serif;"&gt;&lt;span style=";font-family:Georgia,Times New Roman,Times,serif;font-size:small;"  &gt;Solicitará el pin de la nueva SIM, introducirlo.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Verdana,Arial,Helvetica,sans-serif;"&gt;&lt;span style=";font-family:Georgia,Times New Roman,Times,serif;font-size:small;"  &gt;Solicitará un código de red, introducir los primeros 8 dígitos de &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Verdana,Arial,Helvetica,sans-serif;"&gt;&lt;span style=";font-family:Georgia,Times New Roman,Times,serif;font-size:small;"  &gt;unlock_code.txt.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;La HTC Touch debería estar desbloqueada.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Estas cosas no funcionan siempre. así que en caso de no poder desbloquear el móvil en dos o tres intentos, mejor no continuar.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family:Verdana,Arial,Helvetica,sans-serif;"&gt;&lt;span style=";font-family:Georgia,Times New Roman,Times,serif;font-size:small;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-1032350274435673416?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/1032350274435673416/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=1032350274435673416' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1032350274435673416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1032350274435673416'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/09/liberar-la-htc-touch.html' title='Liberar la HTC Touch'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-8553486190644238808</id><published>2008-09-07T10:45:00.003+02:00</published><updated>2012-01-19T23:51:21.724+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2008'/><title type='text'>El Criptograma del 2008</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;blockquote&gt;Actualización:&lt;br /&gt;El criptograma se resiste, así que pasa de ser "El criptograma del verano" a ser "El criptograma del año". Lo dejaré hasta enero y si nadie lo consigue, pondré la solución. Aunque tengo fe en vosotros ...&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Viendo que los criptogramas semanales duran bien poco, he decidido poner un reto un poco más complejo para que os podáis estrujar las neuronas durante las aburridas tardes de verano.&lt;br /&gt;&lt;br /&gt;En linea con los criptogramas anteriores, se trata de un sistema que en su momento fué ampliamente utilizado.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;pre&gt;&lt;span style="font-size: 130%;"&gt;&lt;br /&gt;ADZMO YHADG TIYMM ZCAUG CZYJA DYJTG LKSKM DKOZJ&lt;br /&gt;OKEIG JHKAC EZSGQ HYZOG EZMVG HAZSG MYJOZ MNJEG&lt;br /&gt;SZENH GHEIZ JHKDG COMKS ZCCAB IYFAJ GSZMY JOGMN&lt;br /&gt;JZEON FNHGH CNACO ZEYME GHADY JABNT KVZHY VGEAM&lt;br /&gt;DYEMA YMPIA YCOZD ARKCC NYCOG DARKC ZSGMY JOZMP&lt;br /&gt;IACYA COGEY MEZSK JAMEY UKCSG MZGOM ZAMGD YJABN&lt;br /&gt;TKTKD SYZMG DAJYB NTKEI ZJHKA COGHY CKMHA JZHKS&lt;br /&gt;MYSGM ZMCAE KJOMG YDEIZ JHKAC OGCYT IMKAJ OKHZC&lt;br /&gt;SGMOY CAFNO ZMDYH IMGJO AIJON YBSKE IZJHK ACBGC&lt;br /&gt;XIYMO ACNOI KSKJY JOAON YJAIJ OYBSA MZBYJ OKEKD&lt;br /&gt;AMNEK NJOYJ OGNMM NOZMD ACNYC GMMKT ZJOAO MGOZH&lt;br /&gt;YXKBA JOGMC IYTKO NCBKC NDZCO MKSGC AJYBN TZCCA&lt;br /&gt;VGDDZ JUNYJ SMASG MZHGC OMZCI JGMYK MTZJN QGENK&lt;br /&gt;JNJOA JOZHY CKMHA JGMDZ CCNYC OGJIJ NHZCC NABUM&lt;br /&gt;GDZHN CYJCN KJAJO MYCIC XNDGC ZOGEZ GDAJY BNTKE&lt;br /&gt;IZJHK JKACO GSMYS ZMGHK WZSGM AEYEI ZJHKJ KOAYC&lt;br /&gt;SAMGY COZCC KJDGC EDZFA CHYDG FNEOK MNZSG MZADY&lt;br /&gt;COMGO ATZCI JOQIY DGMOA HYDZT IAMMG            &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Feliz criptroanálisis.&lt;/div&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-8553486190644238808?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/8553486190644238808/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=8553486190644238808' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8553486190644238808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8553486190644238808'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/08/criptograma-verano-2008.html' title='El Criptograma del 2008'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7076244970965605815</id><published>2008-08-15T14:12:00.007+02:00</published><updated>2012-01-19T23:34:48.222+01:00</updated><title type='text'>Cifrados de sustitución homofónica</title><content type='html'>&lt;div style="text-align: justify;"&gt;En los cifrados de sustitución tradicionales, cada letra del texto plano era sustituída por un simbolo diferente. El problema de este tipo de criptosistema lo vimos en detalle en &lt;a href="http://h4ck1t.blogspot.com/2007/09/criptoanlisis-anlisis-de-recuencias.html"&gt;Criptoanálisis: Análisis de frecuencias&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Al sustituir cada letra por un símbolo diferente, la frecuencia de las letras del texto original se mantiene en el criptograma. Des esta manera, conociendo la frecuencia en la que aparecen las letras en la lengua origen, podemos obtener algunas pistas que nos permitiran resolver el criptograma.&lt;br /&gt;&lt;br /&gt;Los cifrados de sustitución homofónica suponen una vuelta de tuerca más a los cifrados de sustitución tradicionals. El objetivo de este sistema consiste en disminuir el efecto de las frecuencias en el criptograma resultante. Así pues, si sabemos que las letra A es la letra más frecuente, podemos sustituir esta letra por símbolos diferentes.&lt;br /&gt;&lt;br /&gt;Veamos un ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Texto Plano:&lt;/span&gt;&lt;br /&gt;ESTO ES UN CRIPTOGRAMA DE EJEMPLO&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Frecuencias:&lt;/span&gt;&lt;br /&gt;E: 4, S: 2, T:2, O:3, U:1, N:1, C:1, R: 2, I: 1, P: 2:, G: 1, A: 2, M: 2,  J: 1,  D: 1, L: 1.&lt;br /&gt;&lt;br /&gt;Como vemos en el texto plano, las frecuencias habituales son 1 y 2. Destaca pues la E con frecuencia 4 y la O con frecuencia 3.&lt;br /&gt;&lt;br /&gt;Así pues, en el momento de asignar sustitutos a cada una de las letras del texto plano, asignaremos más de un sustituto a nuestras letras más frecuentes. Por ejemplo, usaremos E: A,I y O: X, Y. Para las demás letras usaremos un solo símbolo como en un sistema de sustitución tradicional.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Criptrogama:&lt;/span&gt;&lt;br /&gt;ABCXIBDEFGHJCYKGLMLNIAOIMJlX&lt;br /&gt;&lt;br /&gt;Si ahora estudiamos la frecuencia de las letras solo obtendremos frecuencias de 1 y 2 letras, lo que nos ofrecerá pocas pistas del texto plano original.&lt;br /&gt;&lt;br /&gt;Lógicamente, este tipo de criptosistemas es más seguro cuantas más sustituciones se usan para cada letra. El objetivo siempre será tergiversar la distribución de frecuencias del lenguaje original.&lt;br /&gt;&lt;br /&gt;Cuando se realizan varias sustituciones por letra nos encontramos con que es necesario disponer de más símbolos que los que proporciona el abecedario. Podemos usar caracteres como @, #, ¿, ?, etc. Aunque normalmente lo más práctico suele ser usar números.&lt;br /&gt;&lt;br /&gt;A continuación dejo una utilidad de Simon Singh que permite cifrar/descifrar sistemas homofónicos mediante números&lt;a href="http://simonsingh.net/The_Black_Chamber/homophoniccipher.htm"&gt;&lt;/a&gt;: &lt;a href="http://simonsingh.net/The_Black_Chamber/homophoniccipher.htm"&gt;&lt;span style="text-decoration: underline;"&gt;Homophonic Cipher&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7076244970965605815?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7076244970965605815/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7076244970965605815' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7076244970965605815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7076244970965605815'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/08/cifrados-de-sustitucin-homofnica.html' title='Cifrados de sustitución homofónica'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7213070649512101177</id><published>2008-08-09T10:40:00.004+02:00</published><updated>2012-01-19T23:51:21.693+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2008'/><title type='text'>Criptograma Semanal 09/08/08</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;UKALNOIYUAURMXURQYVAVAGWNEAGUQYVEAGUAMVGVATXUYQVADXUAKV AMWURMWVAKNHYVAVIYWY.&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;br /&gt;VKIUYQAUWREQUWR&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7213070649512101177?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7213070649512101177/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7213070649512101177' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7213070649512101177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7213070649512101177'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/08/criptograma-semanal-090808.html' title='Criptograma Semanal 09/08/08'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7345210326741009600</id><published>2008-08-02T10:38:00.004+02:00</published><updated>2012-01-19T23:51:21.700+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2008'/><title type='text'>Criptograma Semanal 02/08/08</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;LEG VR AHW CW SBEDBWPWOHER VX IRW OWBBVBW VRQBV CEX HRDVRHVBEX AV XEJQFWBV HRQVRQWRAE OBVWB PVKEBVX SBEDBWPWX W SBIVZW AV HAHEQWX G VC IRHTVBXE, HRQVRQWRAE SBEAIOHB PWGEBVX HAHEQWX. SEB WLEBW, VC IRHTVBXE VXQW DWRWAE.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;BHOM OEEM&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7345210326741009600?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7345210326741009600/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7345210326741009600' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7345210326741009600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7345210326741009600'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/08/criptograma-semanal-020808.html' title='Criptograma Semanal 02/08/08'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-2337130988002447217</id><published>2008-07-30T08:03:00.005+02:00</published><updated>2012-01-20T09:23:29.149+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Esteganografía'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Esteganografía: El canal Alpha</title><content type='html'>&lt;div style="text-align: justify;"&gt;En este primer artículo sobre &lt;a href="http://es.wikipedia.org/wiki/Esteganograf%C3%ADa"&gt;esteganografía&lt;/a&gt; veremos como ocultar mensajes dentro de una imagen. Para ello usaremos el lenguaje C y accederemos a imágenes en formato PNG a través de la librería libpng.&lt;br /&gt;&lt;br /&gt;Para probar los ejemplos es necesario descargar el programa &lt;a href="http://dlerch.opendomo.org/sources/tools/steg.c"&gt;steg.c&lt;/a&gt; que he desarrollado y la imagen de Tux que viene a continuación:&lt;br /&gt;&lt;br /&gt;NOTA: Haz clic en la imagen para obtener la original, pues blogspot al redimensionar la imagen se carga su transparencia.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_q551Ajwo8ak/SJA3U_wfzDI/AAAAAAAAAFQ/m6DJs71uF7U/s1600-h/tux.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5228740001228901426" src="http://1.bp.blogspot.com/_q551Ajwo8ak/SJA3U_wfzDI/AAAAAAAAAFQ/m6DJs71uF7U/s400/tux.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;El canal Alpha:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Algunos formatos de imágen como puede ser &lt;a href="http://en.wikipedia.org/wiki/Portable_Network_Graphics"&gt;PNG&lt;/a&gt; guardan cada píxel en &lt;a href="http://en.wikipedia.org/wiki/RGBA_color_space"&gt;RGBA&lt;/a&gt;. Lo que significa que se guarda información para R (cantidad de color rojo), G (cantidad de color verde), B (cantidad de color azul) y A (opacidad de la imagen).&lt;br /&gt;&lt;br /&gt;Representar el color de un píxel mediante un formato RGB es algo ampliamente conocido, así que no entraremos en más detalles. Vamos a centrar nos en la A de RGBA, lo que se conoce como el canal Alpha.&lt;br /&gt;&lt;br /&gt;El canal alpha contiene la información referente a la opacidad de la imagen, es decir, cuan transparente es.&lt;br /&gt;En PNG, por ejemplo, se usa un byte en cada píxel para el canal alpha, de manera que, si este tiene valor 0, la imagen es completamente transparente, si tiene valor 255 la imagen no tiene transparencia y para valores entre 0 y 255 el nivel de transparecia cambia gradualmente.&lt;br /&gt;&lt;br /&gt;Así pues, si un píxel de cierto color RGB tiene el canal alpha a cero, no se verá. Lo que nos permite ocultar datos en los bytes destinados a R, G y B siempre que sea un píxel transparente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Acceso a la imagen PNG:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En el programa de ejemplo podemos ver dos funciones "read_png()" y "write_png()". No entraremos en detalle sobre estas dos funciones. Basta decir que la primera carga la imagen en las estructuras de datos de libpng y la segunda escribe el contenido de estas estructuras de datos en una nueva imagen.&lt;br /&gt;&lt;br /&gt;Por lo tanto el procedimiento a seguir será leer la imagen, realizar las modificaciones pertinentes y escribir de nuevo la imagen.&lt;br /&gt;&lt;br /&gt;Para acceder a los diferentes bytes que componen RGBA lo haremos a traves de las funciones "get_value()" y "set_value()". Mientras que la primera nos permite obtener el valor de R, G, B o A, "set_value()" nos permite modificarlo. Así pues:&lt;br /&gt;&lt;br /&gt;- get/set_value(x, y, 0, ...) accede al byte que define R&lt;br /&gt;- get/set_value(x, y, 1, ...) accede al byte que define G&lt;br /&gt;- get/set_value(x, y, 2, ...) accede al byte que define B&lt;br /&gt;- get/set_value(x, y, 3, ...) accede al byte que define A&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ocultando un fichero:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para ocultar un fichero, el programa tendrá que leer cada byte del fichero a ocultar y escribirlo en un píxel de la imagen PNG donde el canal alpha este a cero. Como ejemplo pego parte de la función "hide_file()":&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;FILE *f = fopen(msg_file, "r");&lt;br /&gt;if(!f)&lt;br /&gt;error("[hide_file] fopen()");&lt;br /&gt;&lt;br /&gt;for(y = 0; y &amp;lt; height; y++)&lt;br /&gt;{&lt;br /&gt;for(x = 0; x &amp;lt; width; x++)&lt;br /&gt;{&lt;br /&gt;if(get_value(x, y, 3)==0)&lt;br /&gt;{&lt;br /&gt;char c1=0;&lt;br /&gt;char c2=0;&lt;br /&gt;char c3=0;&lt;br /&gt;&lt;br /&gt;if(!feof(f)) c1 = fgetc(f);&lt;br /&gt;if(!feof(f)) c2 = fgetc(f);&lt;br /&gt;if(!feof(f)) c3  = fgetc(f);&lt;br /&gt;&lt;br /&gt;set_value(x, y, 0, c1);&lt;br /&gt;set_value(x, y, 1, c2);&lt;br /&gt;set_value(x, y, 2, c3);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;fclose(f);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;Extraer el fichero oculto:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;De manera similar a cómo hemos ocultado el fichero en el apartado anterior, podemos extraer la información oculta. Veamos un pedazo de "unhide_file()":&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;FILE *f = fopen(msg_file, "w+");&lt;br /&gt;if(!f)&lt;br /&gt;error("[unhide_file] fopen()");&lt;br /&gt;&lt;br /&gt;for(y = 0; y &amp;lt; height; y++)&lt;br /&gt;{&lt;br /&gt;for(x = 0; x &amp;lt; width; x++)&lt;br /&gt;{&lt;br /&gt;if(get_value(x, y, 3)==0)&lt;br /&gt;{&lt;br /&gt;char c1 = get_value(x, y, 0);&lt;br /&gt;char c2 = get_value(x, y, 1);&lt;br /&gt;char c3 = get_value(x, y, 2);&lt;br /&gt;&lt;br /&gt;if(c1==0 || c2==0 || c3==0)&lt;br /&gt;{&lt;br /&gt;fclose(f);&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;fprintf(f, "%c%c%c", c1, c2, c3);&lt;br /&gt;set_value(x, y, 0, 0);&lt;br /&gt;set_value(x, y, 1, 0);&lt;br /&gt;set_value(x, y, 2, 0);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;fclose(f);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ejemplo de uso del programa:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Visto el código básico utilizado, podemos empezar a ocultar ficheros. Veamos un ejemplo.&lt;br /&gt;&lt;br /&gt;Primero ocultamos un mensaje:&lt;br /&gt;&lt;br /&gt;$ gcc steg.c -o steg -lpng&lt;br /&gt;$ echo "Esto es un mensaje de ejemplo" &amp;gt; msg.txt&lt;br /&gt;$ ./steg hide tux.png tux_steg.png msg.txt&lt;br /&gt;&lt;br /&gt;Si abrimos la imagen tux_steg.png veremos que nuestros ojos no detectan ninguna modificación.&lt;br /&gt;&lt;br /&gt;Ahora obtenemos el mensaje oculto:&lt;br /&gt;&lt;br /&gt;$ ./steg unhide tux_steg.png tux_clean.png msg2.txt&lt;br /&gt;$ cat msg2.txt&lt;br /&gt;Esto es un mensaje de ejemplo&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Un poco de cifrado:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Actualmente el mensaje esta oculto, pero no es difícil extraerlo, por lo que no estaría mal añadir un poco de cifrado. Lo haremos con la herramienta openssl.&lt;br /&gt;&lt;br /&gt;Primero ciframos el archivo:&lt;br /&gt;&lt;br /&gt;$ openssl enc -blowfish -in msg.txt -out msg.ciph&lt;br /&gt;enter bf-cbc encryption password:&lt;br /&gt;Verifying - enter bf-cbc encryption password:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A continuación lo codificamos en base64 y lo ocultamos:&lt;br /&gt;&lt;br /&gt;$ openssl base64 -in msg.ciph -out msg.cb64&lt;br /&gt;$ ./steg hide tux.png tux_steg.png msg.cb64&lt;br /&gt;&lt;br /&gt;En este punto podemos verificar que la imagen con el mensaje oculto no muestra información adicional.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Extraemos el mensaje oculto y lo descodificamos en base64:&lt;br /&gt;&lt;br /&gt;$ ./steg unhide tux_steg.png tux_clean.png msg2.cb64&lt;br /&gt;$ openssl base64 -d -in msg2.cb64 -out msg2.ciph&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Desciframos el archivo:&lt;br /&gt;&lt;br /&gt;$ openssl enc -blowfish -d -in msg2.ciph -out msg2.txt&lt;br /&gt;enter bf-cbc decryption password:&lt;br /&gt;&lt;br /&gt;y voilà:&lt;br /&gt;&lt;br /&gt;$ cat msg2.txt&lt;br /&gt;Esto es un mensaje de ejemplo&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Debilidades del sistema:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ocultar la información en el canal alpha de la imagen no es precisamente la mejor técnica que se puede usar en esteganografía. De hecho tiene un inconveniente importante: la facilidad con la que se puede saber que hay un mensaje oculto.&lt;br /&gt;&lt;br /&gt;Por ejemplo, simplemente poniendo el byte del canal alpha a 255, al visualizar la imagen veríamos las zonas de información con píxeles de diferentes colores.&lt;br /&gt;&lt;br /&gt;A continuación dejo un ejemplo de la imagen de Tux, con un fichero oculto y con el canal alpha a 255. En ella vemos la existencia de información oculta en la primera mitad de la imagen.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_q551Ajwo8ak/SJBGq-Nl-pI/AAAAAAAAAFY/FFQG2P9wBh8/s1600-h/tux_steg_alpha255.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5228756871445609106" src="http://3.bp.blogspot.com/_q551Ajwo8ak/SJBGq-Nl-pI/AAAAAAAAAFY/FFQG2P9wBh8/s400/tux_steg_alpha255.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El mensaje está cifrado, por lo que el atacante no podrá acceder a su contenido. Pero sí podrá detectar el uso de esteganografía, lo que no deja al sistema en muy buen lugar:)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-2337130988002447217?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/2337130988002447217/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=2337130988002447217' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2337130988002447217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2337130988002447217'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/07/esteganografa-el-canal-alpha.html' title='Esteganografía: El canal Alpha'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_q551Ajwo8ak/SJA3U_wfzDI/AAAAAAAAAFQ/m6DJs71uF7U/s72-c/tux.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-8262055078961190645</id><published>2008-07-26T10:00:00.004+02:00</published><updated>2012-01-19T23:51:21.716+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2009'/><category scheme='http://www.blogger.com/atom/ns#' term='Retos 2008'/><title type='text'>Criptograma Semanal 26/07/08</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;NE XEGQUWE HR NEB WHREB OAPHEXRPLENRB HR NE CWRPCWE BQP RBRPCWENXRPLR BRPCWNNEB G, ZQU URSNE SRPRUEN ZARHRP BRU RVZURBEHEB RP AP NRPSAEIR CQXZURPBWDNR ZEUE LQHQB.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;ENDRUL RWPBLRWP&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-8262055078961190645?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/8262055078961190645/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=8262055078961190645' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8262055078961190645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8262055078961190645'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/07/criptograma-semanal-260708.html' title='Criptograma Semanal 26/07/08'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-8861299642064730641</id><published>2008-07-24T14:10:00.007+02:00</published><updated>2012-01-19T23:36:19.627+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Superado bsgame#1 de Blind Security</title><content type='html'>&lt;div style="text-align: justify;"&gt;El 1 de Julio &lt;a href="http://www.blindsec.com/"&gt;Blind Security&lt;/a&gt; empezaba el &lt;span style="font-weight: bold;"&gt;I Torneo de Seguridad Informática BlindSec. &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Despues de varias intentonas y de encallarme considerablemente en los niveles 9 y 10 he superado el bsgame#1 entre los 10 primeros, lo que me hace ganador de una bonita &lt;a href="http://www.yoire.com/1259-wargames-torneo-blindsec-bsgame-1-10-camisetas-para-los-10-ganadores"&gt;camiseta&lt;/a&gt; ;)&lt;br /&gt;&lt;br /&gt;A todo el que le guste romperse el coco con retos informáticos y quiera aprender, le recomiendo encarecidamente que lo &lt;a href="http://blindsec.com:81/"&gt;intente&lt;/a&gt;, dado que el reto continuará abierto.&lt;br /&gt;&lt;br /&gt;A mi me ha servido, entre otras cosas, como perfecta excusa para entrar en el terreno de la esteganografía. De hecho, tan pronto como el torneo sea superado (10 finalistas) publicaré un artículo sobre el tema a partir de algunos programas que desarrollé para pasar el nivel 9.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_q551Ajwo8ak/SIifGjgDB_I/AAAAAAAAAFI/r97s9P4MBRU/s1600-h/bsgame.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5226602302521149426" src="http://4.bp.blogspot.com/_q551Ajwo8ak/SIifGjgDB_I/AAAAAAAAAFI/r97s9P4MBRU/s400/bsgame.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Insisto, si te gusta la seguridad informática y el hacking ético, no lo dudes, pásate por el torneo.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-8861299642064730641?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/8861299642064730641/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=8861299642064730641' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8861299642064730641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8861299642064730641'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/07/superado-bsgame1-de-blind-security.html' title='Superado bsgame#1 de Blind Security'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_q551Ajwo8ak/SIifGjgDB_I/AAAAAAAAAFI/r97s9P4MBRU/s72-c/bsgame.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-8895162582551017660</id><published>2008-07-20T23:05:00.004+02:00</published><updated>2012-01-19T23:51:21.729+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enigmas'/><title type='text'>Los cifrados de Feynman</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;div style="text-align: justify;"&gt;El conocido físico &lt;a href="http://es.wikipedia.org/wiki/Richard_Feynman"&gt;Richard Feynman&lt;/a&gt; recibió tres mensajes codificados de los científicos de &lt;a href="http://en.wikipedia.org/wiki/Los_Alamos"&gt;Los Alamos&lt;/a&gt;, y después de no poder descifrarlos el mismo, los compartió con sus alumnos de &lt;a href="http://en.wikipedia.org/wiki/Caltech"&gt;Caltech&lt;/a&gt;. Actualmente solo se ha conseguido descifrar el primero de los mensages.&lt;br /&gt;&lt;br /&gt;Los tres mensajes cifrados son:&lt;/div&gt;&lt;pre&gt;1. Easier&lt;br /&gt;MEOTAIHSIBRTEWDGLGKNLANEA&lt;br /&gt;INOEEPEYSTNPEUOOEHRONLTIR&lt;br /&gt;OSDHEOTNPHGAAETOHSZOTTENT&lt;br /&gt;KEPADLYPHEODOWCFORRRNLCUE&lt;br /&gt;EEEOPGMRLHNNDFTOENEALKEHH&lt;br /&gt;EATTHNMESCNSHIRAETDAHLHEM&lt;br /&gt;TETRFSWEDOEOENEGFHETAEDGH&lt;br /&gt;RLNNGOAAEOCMTURRSLTDIDORE&lt;br /&gt;HNHEHNAYVTIERHEENECTRNVIO&lt;br /&gt;UOEHOTRNWSAYIFSNSHOEMRTRR&lt;br /&gt;EUAUUHOHOOHCDCHTEEISEVRLS&lt;br /&gt;KLIHIIAPCHRHSIHPSNWTOIISI&lt;br /&gt;SHHNWEMTIEYAFELNRENLEERYI&lt;br /&gt;PHBEROTEVPHNTYATIERTIHEEA&lt;br /&gt;WTWVHTASETHHSDNGEIEAYNHHH&lt;br /&gt;NNHTW&lt;br /&gt;&lt;br /&gt;2. Harder&lt;br /&gt;XUKEXWSLZJUAXUNKIGWFSOZRAWURO&lt;br /&gt;RKXAOSLHROBXBTKCMUWDVPTFBLMKE&lt;br /&gt;FVWMUXTVTWUIDDJVZKBRMCWOIWYDX&lt;br /&gt;MLUFPVSHAGSVWUFWORCWUIDUJCNVT&lt;br /&gt;TBERTUNOJUZHVTWKORSVRZSVVFSQX&lt;br /&gt;OCMUWPYTRLGBMCYPOJCLRIYTVFCCM&lt;br /&gt;UWUFPOXCNMCIWMSKPXEDLYIQKDJWI&lt;br /&gt;WCJUMVRCJUMVRKXWURKPSEEIWZVXU&lt;br /&gt;LEIOETOOFWKBIUXPXUGOWLFPWUSCH&lt;br /&gt;&lt;br /&gt;3. New Message&lt;br /&gt;WURVFXGJYTHEIZXSQXOBGSV&lt;br /&gt;RUDOOJXATBKTARVIXPYTMYA&lt;br /&gt;BMVUFXPXKUJVPLSDVTGNGOS&lt;br /&gt;IGLWURPKFCVGELLRNNGLPYT&lt;br /&gt;FVTPXAJOSCWRODORWNWSICL&lt;br /&gt;FKEMOTGJYCRRAOJVNTODVMN&lt;br /&gt;SQIVICRBICRUDCSKXYPDMDR&lt;br /&gt;OJUZICRVFWXIFPXIVVIEPYT&lt;br /&gt;DOIAVRBOOXWRAKPSZXTZKVR&lt;br /&gt;OSWCRCFVEESOLWKTOBXAUXV&lt;br /&gt;B&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Veamos como resolver el primero de los mensajes.&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Se trata de un cifrado de transposición, el cual colocaremos en grupos de cinco letras:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;M E O T A&lt;br /&gt;I H S I B&lt;br /&gt;R T E W D&lt;br /&gt;G L G K N&lt;br /&gt;L A N E A&lt;br /&gt;I N O E E&lt;br /&gt;P E Y S T&lt;br /&gt;N P E U O&lt;br /&gt;O E H R O&lt;br /&gt;N L T I R&lt;br /&gt;O S D H E&lt;br /&gt;O T N P H&lt;br /&gt;G A A E T&lt;br /&gt;O H S Z O&lt;br /&gt;T T E N T&lt;br /&gt;K E P A D&lt;br /&gt;L Y P H E&lt;br /&gt;O D O W C&lt;br /&gt;F O R R R&lt;br /&gt;N L C U E&lt;br /&gt;E E E O P&lt;br /&gt;G M R L H&lt;br /&gt;N N D F T&lt;br /&gt;O E N E A&lt;br /&gt;L K E H H&lt;br /&gt;E A T T H&lt;br /&gt;N M E S C&lt;br /&gt;N S H I R&lt;br /&gt;A E T D A&lt;br /&gt;H L H E M&lt;br /&gt;T E T R F&lt;br /&gt;S W E D O&lt;br /&gt;E O E N E&lt;br /&gt;G F H E T&lt;br /&gt;A E D G H&lt;br /&gt;R L N N G&lt;br /&gt;O A A E O&lt;br /&gt;C M T U R&lt;br /&gt;R S L T D&lt;br /&gt;I D O R E&lt;br /&gt;H N H E H&lt;br /&gt;N A Y V T&lt;br /&gt;I E R H E&lt;br /&gt;E N E C T&lt;br /&gt;R N V I O&lt;br /&gt;U O E H O&lt;br /&gt;T R N W S&lt;br /&gt;A Y I F S&lt;br /&gt;N S H O E&lt;br /&gt;M R T R R&lt;br /&gt;E U A U U&lt;br /&gt;H O H O O&lt;br /&gt;H C D C H&lt;br /&gt;T E E I S&lt;br /&gt;E V R L S&lt;br /&gt;K L I H I&lt;br /&gt;I A P C H&lt;br /&gt;R H S I H&lt;br /&gt;P S N W T&lt;br /&gt;O I I S I&lt;br /&gt;S H H N W&lt;br /&gt;E M T I &lt;span style="color: red; font-weight: bold;"&gt;E&lt;/span&gt;&lt;br /&gt;Y A F E &lt;span style="color: red; font-weight: bold;"&gt;L&lt;/span&gt;&lt;br /&gt;N R E N &lt;span style="color: red; font-weight: bold;"&gt;L&lt;/span&gt;&lt;br /&gt;E E R Y &lt;span style="color: red; font-weight: bold;"&gt;I&lt;/span&gt;&lt;br /&gt;P H B E &lt;span style="color: red; font-weight: bold;"&gt;R&lt;/span&gt;&lt;br /&gt;O T E V &lt;span style="color: red; font-weight: bold;"&gt;P&lt;/span&gt;&lt;br /&gt;H N T Y &lt;span style="color: red; font-weight: bold;"&gt;A&lt;/span&gt;&lt;br /&gt;T I E R &lt;span style="color: red; font-weight: bold;"&gt;T&lt;/span&gt;&lt;br /&gt;I H E E &lt;span style="color: red; font-weight: bold;"&gt;A&lt;/span&gt;&lt;br /&gt;W T W V &lt;span style="color: red; font-weight: bold;"&gt;H&lt;/span&gt;&lt;br /&gt;T A S E &lt;span style="color: red; font-weight: bold;"&gt;T&lt;/span&gt;&lt;br /&gt;H H S D &lt;span style="color: red; font-weight: bold;"&gt;N&lt;/span&gt;&lt;br /&gt;G E I E &lt;span style="color: red; font-weight: bold;"&gt;A&lt;/span&gt;&lt;br /&gt;Y N H H &lt;span style="color: red; font-weight: bold;"&gt;H&lt;/span&gt;&lt;br /&gt;N N H T &lt;span style="color: red; font-weight: bold;"&gt;W&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Ahora podemos leer el mensaje de abajo a arriba empezando por el final.&lt;br /&gt;&lt;br /&gt;El mensaje resultante es:&lt;br /&gt;&lt;br /&gt;Whan that Aprill, with his shoures soote&lt;br /&gt;The droghte of March hath perced to the roote&lt;br /&gt;And bathed every veyne in swich licour,&lt;br /&gt;Of which vertu engendred is the flour;&lt;br /&gt;Whan Zephirus eek with his sweete breeth&lt;br /&gt;Inspired hath in every holt and heeth&lt;br /&gt;The tendre croppes, and the yonge sonne&lt;br /&gt;Hath in the Ram his halfe cours yronne,&lt;br /&gt;And smale foweles maken melodye,&lt;br /&gt;That slepen al the nyght with open eye-&lt;br /&gt;(So priketh hem Nature in hir corages);&lt;br /&gt;Thanne longen folk to goon on pilgrimag&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-8895162582551017660?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/8895162582551017660/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=8895162582551017660' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8895162582551017660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8895162582551017660'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/07/los-cifrados-de-feynman.html' title='Los cifrados de Feynman'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-5779649972817483016</id><published>2008-05-31T20:00:00.004+02:00</published><updated>2012-01-19T23:36:19.547+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Redes'/><category scheme='http://www.blogger.com/atom/ns#' term='Sistemas Operativos'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Sockets en shellscript con xinetd</title><content type='html'>&lt;h2&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;a href="" name="Introduccion"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div style="text-align: justify;"&gt;Existe la posibilidad de crear aplicaciones sencillas "tipo servidor" con  scripts de shell. Vamos a ver un ejemplo en el que se configurará el  daemon xinetd para abrir un socket y poner un programa a la escucha. En nuestro caso el programa en cuestión será un script, aunque podría utilizarse cualquier otro lenguaje de  programación.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Configurando Xinetd: &lt;/span&gt;&lt;br /&gt;Generalmente disponcremos de un archivo de configuración de  xinetd similar al siguiente:&lt;/div&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="black"&gt;&lt;pre&gt;$ cat /etc/xinetd.conf&lt;br /&gt;#&lt;br /&gt;# Simple configuration file for xinetd&lt;br /&gt;#&lt;br /&gt;# Some defaults, and include /etc/xinetd.d/&lt;br /&gt;&lt;br /&gt;defaults&lt;br /&gt;{&lt;br /&gt;instances               = 60&lt;br /&gt;log_type                = SYSLOG authpriv&lt;br /&gt;log_on_success          = HOST PID&lt;br /&gt;log_on_failure          = HOST&lt;br /&gt;cps                     = 25 30&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;includedir /etc/xinetd.d&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; Este indica la inclusión de los scripts situados en /etc/xinet.d/.&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="black"&gt;&lt;pre&gt;ls -lh /etc/xinetd.d/&lt;br /&gt;total 100K&lt;br /&gt;-rw-r--r--    1 root     root          563 nov 19 17:53 chargen&lt;br /&gt;-rw-r--r--    1 root     root          580 nov 19 17:53 chargen-udp&lt;br /&gt;-rw-r--r--    1 root     root          419 nov 19 17:53 daytime&lt;br /&gt;-rw-r--r--    1 root     root          438 nov 19 17:53 daytime-udp&lt;br /&gt;-rw-r--r--    1 root     root          341 nov 19 17:53 echo&lt;br /&gt;-rw-r--r--    1 root     root          360 nov 19 17:53 echo-udp&lt;br /&gt;-rw-r--r--    1 root     root          318 jun 23  2002 finger&lt;br /&gt;-rw-r--r--    1 root     root          370 sep  1  2002 imap&lt;br /&gt;-rw-r--r--    1 root     root          365 sep  1  2002 imaps&lt;br /&gt;-rw-r--r--    1 root     root          453 sep  1  2002 ipop2&lt;br /&gt;-rw-r--r--    1 root     root          359 sep  1  2002 ipop3&lt;br /&gt;-rw-r--r--    1 root     root          275 jul  5  2002 ntalk&lt;br /&gt;-rw-r--r--    1 root     root          335 sep  1  2002 pop3s&lt;br /&gt;-rw-r--r--    1 root     root          361 jun 24  2002 rexec&lt;br /&gt;-rw-r--r--    1 root     root          378 jun 24  2002 rlogin&lt;br /&gt;-rw-r--r--    1 root     root          431 jun 24  2002 rsh&lt;br /&gt;-rw-r--r--    1 root     root          317 jun 25  2002 rsync&lt;br /&gt;-rw-r--r--    1 root     root          312 nov 19 17:53 servers&lt;br /&gt;-rw-r--r--    1 root     root          314 nov 19 17:53 services&lt;br /&gt;-rw-r--r--    1 root     root          392 ago 11  2002 sgi_fam&lt;br /&gt;-rw-r--r--    1 root     root          263 jul  5  2002 talk&lt;br /&gt;-rw-r--r--    1 root     root          305 jul 23  2002 telnet&lt;br /&gt;-rw-r--r--    1 root     root          497 nov 19 17:53 time&lt;br /&gt;-rw-r--r--    1 root     root          518 nov 19 17:53 time-udp&lt;br /&gt;-rw-r--r--    1 root     root          276 ago 16  2002 vsftpd&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Editando cualquiera de estos archivos puede verse la estructura que siguen los scripts. Para nuestro propósito debemos crear uno de estos scritps, por ejemplo el siguiente:&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="black"&gt;&lt;pre&gt;service nuevoservicio&lt;br /&gt;{&lt;br /&gt;port            = 6666&lt;br /&gt;socket_type     = stream&lt;br /&gt;wait            = no&lt;br /&gt;user            = nobody&lt;br /&gt;server          = /usr/local/bin/NuestroServidor.sh&lt;br /&gt;log_on_success  += USERID&lt;br /&gt;log_on_failure  += USERID&lt;br /&gt;disable         = no&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;El puerto escogido para la escucha debe estar especificado en el archivo /etc/services, en nuestro caso, el puerto 6666, no está especificado, por lo tanto añadimos la siguiente línea a /etc/services: &lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="black"&gt;&lt;pre&gt;nuevoservicio 6666/tcp   # Nuestro servicio de prueba&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Sencillo, ¿no?.&lt;br /&gt;&lt;br /&gt;Ahora solo necesitamos crear el script "NuestroServidor.sh" y colocarlo en /usr/local/bin.&lt;br /&gt;&lt;br /&gt;Podemos probar con el clásico:&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="black"&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;echo "Hello World!"&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Para que el servidor funcione correctamente debemos asegurarnos de que  dispone de permisos de ejecución para todos los usuarios.&lt;br /&gt;&lt;br /&gt;finalmente reiniciamos xinetd:&lt;/div&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="black"&gt;&lt;pre&gt;$ /etc/rc.d/init.d/xinetd restart&lt;br /&gt;Parando xinetd:                                            [  OK  ]&lt;br /&gt;Iniciando xinetd:                                          [  OK  ]&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Podemos probar con:&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bgcolor="black"&gt;$ telnet localhost 6666&lt;br /&gt;Trying 127.0.0.1...&lt;br /&gt;Connected to hackerbox (127.0.0.1).&lt;br /&gt;Escape character is '^]'.&lt;br /&gt;Hello World!&lt;br /&gt;Connection closed by foreign host.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;El programa llamado por xinetd podría haberse desarrollado en  cualquier otro lenguaje de programación: C, Perl ... Lo interesante de esta forma de hacerlo es que permite la creación de servicios simples en un tiempo récord. Aunque no se debe olvidar que en estos sistemas la seguridad no es uno de sus fuertes. Con cuidado!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-5779649972817483016?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/5779649972817483016/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=5779649972817483016' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/5779649972817483016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/5779649972817483016'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/05/sockets-en-shellscript-con-xinetd.html' title='Sockets en shellscript con xinetd'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4223082197641127302</id><published>2008-05-25T12:09:00.010+02:00</published><updated>2012-01-19T23:36:19.501+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Redes'/><category scheme='http://www.blogger.com/atom/ns#' term='Sistemas Operativos'/><title type='text'>Enrutamiento básico en Linux</title><content type='html'>&lt;h2&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;a href="" name="Introduccion"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div style="color: #333333; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Actualmente existen gran cantidad de herramientas basadas en GNU/Linux, *BSD y similares que permiten montar un router de una forma más o menos sencilla. Algunas de ellas incluso tienen bonitas interfaces gráficas que nos facilitan la tarea. Si nos movemos al terreno comercial, la oferta crece.&lt;br /&gt;&lt;br /&gt;Sin embargo en este artículo no vamos a tratar sobre estas herramientas si no sobre los cimientos que las sustentan. Vamos a ver como usar una máquina Linux para las tareas básicas de enrutamiento.&lt;br /&gt;&lt;br /&gt;Lo primero que necesitaremos es configurar las interfaces de red. Para esto utilizaremos la herramienta "ifconfig" disponible en cualquier SO Unix. A continuación tendremos que establecer rutas; utilizaremos "route".  Y finalmente, con el daemon "routed" configuraremos el protocolo de enrutamiento RIP.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La herramienta ifconfig&lt;/span&gt;&lt;br /&gt;Para configurar las interfaces del sistema utilizaremos la herramienta "ifconfig". Esta herramienta viene con cualquier SO de la familia Unix, y suele estar ubicada en "/sbin". Los parámetros para configurar una interfaz mediante "ifconfig" son los  siguientes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt; /sbin/ifconfig [interface] [IP] netmask [máscara] broadcast [broadcast]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Veamos un ejemplo, configuremos la interface eth0 con la IP 192.168.1.2:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;/sbin/ifconfig eth0 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La herramienta route&lt;/span&gt;&lt;br /&gt;De la misma forma que utilizamos "ifconfig" para configurar las interfaces, disponemos de "route", para configurar rutas. La herramienta "route", ubicada en "/sbin" recibe los siguientes parámetros:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;&lt;span style="font-size: 85%;"&gt;/sbin/route -[net|host] [IP] netmask [gw [IP]] dev [interface]&lt;/span&gt;  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una forma típica de llamara a "route" es la utilizada para configurar un gateway por defecto. Veamos la forma de hacerlo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;/sbin/route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hemos añadimo una ruta de manera que los paquetes destinados a cualquier red  (0.0.0.0) se dirijan al gateway 192.168.1.1. Hay otra forma de hacerlo más utilizada:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;/sbin/route add default gw 192.168.1.1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Entendiendo como "default": "-net 0.0.0.0 netmask 0.0.0.0".&lt;br /&gt;&lt;br /&gt;Hemos configurado un gateway por defecto. Ahora configuremos una ruta normal.  Por ejemplo, enrutemos todos los paquetes destinados a 192.168.78.0 al gateway 192.168.1.1:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;/sbin/route add -net 192.168.78.0 netmask 255.255.255.0 gw 192.168.1.1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El daemon routed&lt;/span&gt;&lt;br /&gt;A diferencia de lo que pasaba con "ifconfig" y "route", el daemon "routed" no viene instalado por defecto en el SO Linux. Pero no es difídil de  conseguir e instalar.&lt;br /&gt;&lt;br /&gt;Una vez instalado se ubica en "/sbin" o en "/usr/sbin". Ejecutarlo es fácil:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;/usr/sbin/routed&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pero, ¿para que sirver routed?&lt;br /&gt;&lt;br /&gt;El daemon "routed" es la implementación del protocolo RIP (Routing Information  Protocol). La finalidad del protocolo RIP consiste en comunicar la estructura de la red a los routers vecinos. Esto soluciona el problema del mantenimiento  de rutas en redes grandes, donde sería del todo imposible añadir y borrar rutas  en función del estado de la red.     Script de ejemplo&lt;br /&gt;Según lo que se ha visto hasta ahora, configurar el enrutamiento básico en Linux es de lo más sencillo. Primero configuramos las interfaces, a continuación habilitamos un ruta por defecto y finalmente arrancamos el demonio "routed". Veamos un Script de ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;#!/sbin/bash&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;# Habilitamos la redirección de paquetes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;# Configuramos las interfaces&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;/sbin/ifconfig eth0 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;/sbin/ifconfig eth1 192.168.2.1 netmask 255.255.255.0 broadcast 192.168.2.255&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;/sbin/ifconfig eth2 192.168.3.1 netmask 255.255.255.0 broadcast 192.168.3.255&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;# Gateway por defecto&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;/sbin/route add default gw 192.168.1.1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;# Arrancamos routed&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-size: 85%; font-weight: bold;"&gt;/usr/sbin/routed&lt;/span&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bg="" style="color: silver;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td bg="" style="color: silver;"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;span style="font-family: Helvetica,Arial,sans-serif;"&gt;  &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-4223082197641127302?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/4223082197641127302/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=4223082197641127302' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4223082197641127302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/4223082197641127302'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/05/enrutamiento-bsico-en-linux.html' title='Enrutamiento básico en Linux'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-551642506034072931</id><published>2008-05-18T21:20:00.012+02:00</published><updated>2012-01-19T23:51:21.667+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enigmas'/><title type='text'>La escultura Kryptos</title><content type='html'>&lt;div style="text-align: justify;"&gt;En los exteriores de las oficinas de la CIA en Langley (Virgina) podemos encontrar  una escultura hecha por &lt;a class="new" href="http://es.wikipedia.org/w/index.php?title=James_Sanborn&amp;amp;action=edit&amp;amp;redlink=1" title="James Sanborn (aún no redactado)"&gt;James Sanborn&lt;/a&gt; hacia 1990.&lt;br /&gt;&lt;br /&gt;En esta enorme "ese" de bronce (tiene cuatro metros de altura) se esconden cuatro mensajes cifrados, escritos en inglés con errores gramaticales y todo;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_q551Ajwo8ak/SDLtd6dag_I/AAAAAAAAAE8/-0axrm201j4/s1600-h/kryptos.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5202481617730962418" src="http://2.bp.blogspot.com/_q551Ajwo8ak/SDLtd6dag_I/AAAAAAAAAE8/-0axrm201j4/s400/kryptos.jpg" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Los cuatro mensajes cifrados de la escultura son los siguientes:&lt;br /&gt;&lt;br /&gt;&lt;table align="center" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span style="font-family: Century;"&gt;&lt;br /&gt;&lt;span style="font-size: 78%;"&gt;EMUFPHZLRFAXYUSDJKZLDKRNSHGNFIVJ&lt;br /&gt;YQTQUXQBQVYUVLLTREVJYQTMKYRDMFD&lt;br /&gt;VFPJUDEEHZWETZYVGWHKKQETGFQJNCE&lt;br /&gt;GGWHKK?DQMCPFQZDQMMIAGPFXHQRLG&lt;br /&gt;TIMVMZJANQLVKQEDAGDVFRPJUNGEUNA&lt;br /&gt;QZGZLECGYUXUEENJTBJLBQCRTBJDFHRR&lt;br /&gt;YIZETKZEMVDUFKSJHKFWHKUWQLSZFTI&lt;br /&gt;HHDDDUVH?DWKBFUFPWNTDFIYCUQZERE&lt;br /&gt;EVLDKFEZMOQQJLTTUGSYQPFEUNLAVIDX&lt;br /&gt;FLGGTEZ?FKZBSFDQVGOGIPUFXHHDRKF&lt;br /&gt;FHQNTGPUAECNUVPDJMQCLQUMUNEDFQ&lt;br /&gt;ELZZVRRGKFFVOEEXBDMVPNFQXEZLGRE&lt;br /&gt;DNQFMPNZGLFLPMRJQYALMGNUVPDXVKP&lt;br /&gt;DQUMEBEDMHDAFMJGZNUPLGEWJLLAETG&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt; &lt;td&gt;&lt;pre&gt;&lt;span style="font-family: Century; font-size: 78%;"&gt;&lt;br /&gt;ABCDEFGHIJKLMNOPQRSTUVWXYZABCD&lt;br /&gt;AKRYPTOSABCDEFGHIJLMNQUVWXZKRYP&lt;br /&gt;BRYPTOSABCDEFGHIJLMNQUVWXZKRYPT&lt;br /&gt;CYPTOSABCDEFGHIJLMNQUVWXZKRYPTO&lt;br /&gt;DPTOSABCDEFGHIJLMNQUVWXZKRYPTOS&lt;br /&gt;ETOSABCDEFGHIJLMNQUVWXZKRYPTOSA&lt;br /&gt;FOSABCDEFGHIJLMNQUVWXZKRYPTOSAB&lt;br /&gt;GSABCDEFGHIJLMNQUVWXZKRYPTOSABC&lt;br /&gt;HABCDEFGHIJLMNQUVWXZKRYPTOSABCD&lt;br /&gt;IBCDEFGHIJLMNQUVWXZKRYPTOSABCDE&lt;br /&gt;JCDEFGHIJLMNQUVWXZKRYPTOSABCDEF&lt;br /&gt;KDEFGHIJLMNQUVWXZKRYPTOSABCDEFG&lt;br /&gt;LEFGHIJLMNQUVWXZKRYPTOSABCDEFGH&lt;br /&gt;MFGHIJLMNQUVWXZKRYPTOSABCDEFGHI&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td&gt;&lt;pre&gt;&lt;span style="font-family: Century; font-size: 78%;"&gt;&lt;br /&gt;ENDYAHROHNLSRHEOCPTEOIBIDYSHNAIA&lt;br /&gt;CHTNREYULDSLLSLLNOHSNOSMRWXMNE&lt;br /&gt;TPRNGATIHNRARPESLNNELEBLPIIACAE&lt;br /&gt;WMTWNDITEENRAHCTENEUDRETNHAEOE&lt;br /&gt;TFOLSEDTIWENHAEIOYTEYQHEENCTAYCR&lt;br /&gt;EIFTBRSPAMHHEWENATAMATEGYEERLB&lt;br /&gt;TEEFOASFIOTUETUAEOTOARMAEERTNRTI&lt;br /&gt;BSEDDNIAAHTTMSTEWPIEROAGRIEWFEB&lt;br /&gt;AECTDDHILCEIHSITEGOEAOSDDRYDLORIT&lt;br /&gt;RKLMLEHAGTDHARDPNEOHMGFMFEUHE&lt;br /&gt;ECDMRIPFEIMEHNLSSTTRTVDOHW?OBKR&lt;br /&gt;UOXOGHULBSOLIFBBWFLRVQQPRNGKSSO&lt;br /&gt;TWTQSJQSSEKZZWATJKLUDIAWINFBNYP&lt;br /&gt;VTTMZFPKWGDKZXTJCDIGKUHUAUEKCAR&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt; &lt;td&gt;&lt;pre&gt;&lt;span style="font-family: Century; font-size: 78%;"&gt;&lt;br /&gt;NGHIJLMNQUVWXZKRYPTOSABCDEFGHIJL&lt;br /&gt;OHIJLMNQUVWXZKRYPTOSABCDEFGHIJL&lt;br /&gt;PIJLMNQUVWXZKRYPTOSABCDEFGHIJLM&lt;br /&gt;QJLMNQUVWXZKRYPTOSABCDEFGHIJLMN&lt;br /&gt;RLMNQUVWXZKRYPTOSABCDEFGHIJLMNQ&lt;br /&gt;SMNQUVWXZKRYPTOSABCDEFGHIJLMNQU&lt;br /&gt;TNQUVWXZKRYPTOSABCDEFGHIJLMNQUV&lt;br /&gt;UQUVWXZKRYPTOSABCDEFGHIJLMNQUVW&lt;br /&gt;VUVWXZKRYPTOSABCDEFGHIJLMNQUVWX&lt;br /&gt;WVWXZKRYPTOSABCDEFGHIJLMNQUVWXZ&lt;br /&gt;XWXZKRYPTOSABCDEFGHIJLMNQUVWXZK&lt;br /&gt;YXZKRYPTOSABCDEFGHIJLMNQUVWXZKR&lt;br /&gt;ZZKRYPTOSABCDEFGHIJLMNQUVWXZKRY&lt;br /&gt;ABCDEFGHIJKLMNOPQRSTUVWXYZABCD&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-size: 78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-family: arial; font-size: 100%;"&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;/span&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Aunque tanto la NSA como la propia CIA resolvieron el acertijo, la primera persona que anunció públicamente las tres primeras partes fué &lt;a href="http://en.wikipedia.org/wiki/James_Gillogly" title="James Gillogly"&gt;James Gillogly&lt;/a&gt;, en 1999. Por lo que se sabe, la cuarta parte continúa todavía sin resolver.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Solución a la Primera Parte:&lt;br /&gt;(Vigenere clave alfabeto: kryptos, clave:  palimpsest)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;BETWEEN SUBTLE SHADING AND THE ABSENCE OF LIGHT LIES THE NUANCE OF IQLUSION&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Solución a la Segunda Parte: &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;(Vigenere clave alfabeto: kryptos, clave:  Abscissa)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;IT WAS TOTALLY INVISIBLE HOWS THAT POSSIBLE ? THEY USED THE EARTHS MAGNETIC FIELD X THE INFORMATION WAS GATHERED AND TRANSMITTED UNDERGRUUND TO AN UNKNOWN LOCATION X DOES LANGLEY KNOW ABOUT THIS ? THEY SHOULD ITS BURIED OUT THERE SOMEWHERE X WHO KNOWS THE EXACT LOCATION ? ONLY WW THIS WAS HIS LAST MESSAGE X THIRTY EIGHT DEGREES FIFTY SEVEN MINUTES SIX POINT FIVE SECONDS NORTH SEVENTY SEVEN DEGREES EIGHT MINUTES FORTY FOUR SECONDS WEST X LAYER TWO&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Solución a la &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Tercera Parte:&lt;/span&gt;&lt;/div&gt;SLOWLY DESPARATLY SLOWLY THE REMAINS OF PASSAGE DEBRIS THAT ENCUMBERED THE LOWER PART OF THE DOORWAY WAS REMOVED WITH TREMBLING HANDS I MADE A TINY BREACH IN THE UPPER LEFT HAND CORNER AND THEN WIDENING THE HOLE A LITTLE I INSERTED THE CANDLE AND PEERED IN THE HOT AIR ESCAPING FROM THE CHAMBER CAUSED THE FLAME TO FLICKER BUT PRESENTLY DETAILS OF THE ROOM WITHIN EMERGED FROM THE MIST X CAN YOU SEE ANYTHING Q (?)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referencias:&lt;/span&gt;&lt;br /&gt;- &lt;a href="http://www.elonka.com/kryptos"&gt;http://www.elonka.com/kryptos&lt;/a&gt;&lt;br /&gt;- &lt;a href="https://www.cia.gov/about-cia/virtual-tour/kryptos/index.html"&gt;Kryptos en la CIA&lt;/a&gt;.&lt;a href="https://www.cia.gov/about-cia/virtual-tour/kryptos/index.html"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-551642506034072931?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/551642506034072931/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=551642506034072931' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/551642506034072931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/551642506034072931'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/05/la-escultura-kryptos.html' title='La escultura Kryptos'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q551Ajwo8ak/SDLtd6dag_I/AAAAAAAAAE8/-0axrm201j4/s72-c/kryptos.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-6519895068524584679</id><published>2008-03-30T10:48:00.008+02:00</published><updated>2012-01-19T23:51:21.682+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Factorización'/><title type='text'>Hugo Scolnik: Avances en la Factorización Entera</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;El pasado 3 de diciembre se celebró el II Día Internacional de la Seguridad en la Información (DISI 2007). En el, Hugo Scolnik presentó un nuevo algoritmo de factorización, que aunque está por terminar, no tiene mala pinta.&lt;br /&gt;&lt;br /&gt;A continuación dejo los enlaces (&lt;a href="http://www.criptored.upm.es/"&gt;Criptored&lt;/a&gt;) a la presentación y el vídeo de la conferencia:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://www.criptored.upm.es/descarga/DISI07_HugoScolnik.zip"&gt;Presentación PDF&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://www.criptored.upm.es/descarga/DISI07-videos/03/03_SEGUNDO_DISI_2007_Avances_en_la_Factorizacion_Entera%28Dr._Hugo_Scolnik%29.zip"&gt;Vídeo principal&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.criptored.upm.es/descarga/DISI07-videos/03/03_SEGUNDO_DISI_2007_Avances_en_la_Factorizacion_Entera%28Dr._Hugo_Scolnik%29.z01"&gt;Vídeo parte 1&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.criptored.upm.es/descarga/DISI07-videos/03/03_SEGUNDO_DISI_2007_Avances_en_la_Factorizacion_Entera%28Dr._Hugo_Scolnik%29.z02"&gt;Vídeo parte 2&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.criptored.upm.es/descarga/DISI07-videos/03/03_SEGUNDO_DISI_2007_Avances_en_la_Factorizacion_Entera%28Dr._Hugo_Scolnik%29.z03"&gt;Vídeo parte 3&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.criptored.upm.es/descarga/DISI07-videos/03/03_SEGUNDO_DISI_2007_Avances_en_la_Factorizacion_Entera%28Dr._Hugo_Scolnik%29.z04"&gt;Vídeo parte 4&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.criptored.upm.es/descarga/DISI07-videos/03/03_SEGUNDO_DISI_2007_Avances_en_la_Factorizacion_Entera%28Dr._Hugo_Scolnik%29.z05"&gt;Vídeo parte 5&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.criptored.upm.es/descarga/DISI07-videos/03/03_SEGUNDO_DISI_2007_Avances_en_la_Factorizacion_Entera%28Dr._Hugo_Scolnik%29.z06"&gt;Vídeo parte 6&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Estos archivos pueden descomprimirse en Línux con el siguiente comando:&lt;br /&gt;&lt;br /&gt;$ cat *.z* &amp;gt; video.zip &amp;amp;&amp;amp; unzip video.zip&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En el foro de &lt;a href="http://www.kriptopolis.org/"&gt;Kriptopolis&lt;/a&gt;, alguien que firmaba como "Hugo Scolnik" ponía un ejemplo sencillo de factorización:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="submitted" style="font-style: italic;"&gt;&lt;span style="font-size: 100%;"&gt;     Enviado por anónimo el 4. Enero 2008 - 8:42.  &lt;/span&gt;&lt;/div&gt;&lt;div class="content" style="font-style: italic;"&gt;&lt;span style="font-size: 100%;"&gt;Pues ahi va un ejemplo pequeño para ilustrar el tema&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;Sea n = 507527&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;Los targets únicos son (23 en total):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;(1,0,3) , (1,0,4), (4,1,5),....,(649,576,720)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;Esto significa que x^2 = 1+3t(1) = 1+4t(2)=...= 649+720t(23)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;con t(23) = 88 se consigue la soluciòn&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;Con respecto a y^2 tenemos que puede escribirse como 576+720u(23) con u(23) = 793&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;Obviamente con n grande es impracticable buscar los valores de t o de u.&lt;br /&gt;Ahora, (n + 649 -576)/720 = 705 y algunos targets ùnicos de 705 son&lt;br /&gt;(0,1,4) , (0,1,8), (0,1,16)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;Llamaremos (a1,b1,c1) al target ùnico elegido del primer nivel, o sea (649,576,720) y&lt;br /&gt;(a2,b2,c2) al del segundo nivel&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;Si usamos el primero con la fòrmula x^2 =a1+c1a2+c1c2t = 649+2880t correcto con t = 22&lt;br /&gt;Si usamos el segundo obtenemos x^2 = 649+5760t correcto con t = 11&lt;br /&gt;Pero el tercero da x^2= 649+11520t que es FALSO (deberìa dar x^2 = 6409+11520t)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;¿Còmo corregir 649 ? Habrìa que sumarle deltax2 = 5760 = 8c1 (siempre es un mùltiplo de c1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;Para y^2 obtenemos y^2= b1+c1b2+c1c2u&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;En el primer caso           y^2 = 1296+2880u correcto con u = 198&lt;br /&gt;En el segundo caso          y^2 = 1296+5760u correcto con u =  99&lt;br /&gt;El tercero falla pues da    y^2 = 1296+11520u y deberìa ser 7056+11520u&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;La correcciòn es deltay2 = 5760 que es igual a deltax2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;Varios de los teoremas que mostrè ràpidamente tienen que ver con las correcciones, su relaciòn con las ecuaciones&lt;br /&gt;diofánticas, etc. Casos muy interesantes son los simètricos, donde aparecen en el nivel k &amp;gt; 1 targets ùnicos&lt;br /&gt;idènticos a los del primer nivel (al parecer siempre existen pero todavìa no nos dedicamos a demostrarlo porque&lt;br /&gt;hay otras prioridades). Para ellos se pueden demostrar varios resultados muy interesantes, y ahora los estoy&lt;br /&gt;usando para la exploraciòn de las ramas provenientes de las posibles elecciones de targets.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;Cordialmente&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;Hugo Scolnik&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="content" style="font-style: italic; text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="content"&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-6519895068524584679?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/6519895068524584679/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=6519895068524584679' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6519895068524584679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6519895068524584679'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/03/hugo-scolnik-avances-en-la-factorizacin.html' title='Hugo Scolnik: Avances en la Factorización Entera'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-2849002507053073927</id><published>2008-02-23T21:39:00.011+01:00</published><updated>2012-01-19T23:22:23.615+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Publicidad web: Automatizando clics</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;Aunque la automatización del movimiento del mouse y la realización de clics tiene cientos de aplicaciones lícitas, a nadie se le escapa la posibilidad de usarlo para realizar clics fraudulentos en la los anuncios contextuales de la web.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La primera pregunta que se plantea uno ...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;... es qué medidas de seguridad adoptarán las empresas que, como por ejemplo &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt; (&lt;a href="http://www.google.com/adsense/"&gt;Adsense&lt;/a&gt;), ofrecen este servicio.&lt;br /&gt;&lt;br /&gt;Es lógico pensar que si todos los clics vienen desde la misma IP no se tendrán en cuenta. Pero esta barrera es fácil saltársela con sistemas de navegación anónima como &lt;a href="http://h4ck1t.blogspot.com/2007/10/introduccin-las-redes-tor.html"&gt;Tor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pero las empresas que se dedican a estas cosas, que no son tontas, no dan esos clics por válidos.&lt;br /&gt;&lt;br /&gt;Hasta aqui todo bien, pues sigue la lógica que cabría esperar.&lt;br /&gt;&lt;br /&gt;El problema se produce en el momento que estas empresas deciden considerar al propietario de la web que recibe los clics como culpable de los mismos, eliminándole la cuenta.&lt;br /&gt;&lt;br /&gt;Este hecho produce una consecuencia terrible: la aparición de un ataque de denegación de servicio.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La segunda pregunta que se plantea uno ...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;... es cuanto se puede tardar en desarrollar un programa que mueva el mouse a una posición (x,y) y realice un clic sobre ella.&lt;br /&gt;&lt;br /&gt;Después de googlear un poquito y realizar algunas pruebas la conclusión es extremecedora ... En unos 20 minutos el programa esta listo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cómo mover el mouse con XLib:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A continuación pego una función que mueve el puntero del mouse a la posición X,Y pasada como parámetro.&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;void mouse_move(int x, int y)&lt;br /&gt;{&lt;br /&gt;Display *display = XOpenDisplay(0);&lt;br /&gt;Window root = DefaultRootWindow(display);&lt;br /&gt;XWarpPointer(display, None, root, 0, 0, 0, 0, x, y);&lt;br /&gt;XCloseDisplay(display);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cómo hacer clic con XLib:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A continuación pego una función que hace clic sobre la posición actual del mouse. Para realizar clic con el botón derecho se usa button=0.&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;void mouse_click(int button)&lt;br /&gt;{&lt;br /&gt;Display *display = XOpenDisplay(NULL);&lt;br /&gt;XEvent event;&lt;br /&gt;memset(&amp;amp;event, 0x00, sizeof(event));&lt;br /&gt;event.type = ButtonPress;&lt;br /&gt;event.xbutton.button = button;&lt;br /&gt;event.xbutton.same_screen = True;&lt;br /&gt;XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &lt;br /&gt;&amp;amp;event.xbutton.root, &amp;amp;event.xbutton.window, &amp;amp;event.xbutton.x_root,&lt;br /&gt;&amp;amp;event.xbutton.y_root, &amp;amp;event.xbutton.x, &amp;amp;event.xbutton.y,&lt;br /&gt;&amp;amp;event.xbutton.state);&lt;br /&gt;event.xbutton.subwindow = event.xbutton.window;&lt;br /&gt;&lt;br /&gt;while(event.xbutton.subwindow)&lt;br /&gt;{&lt;br /&gt;event.xbutton.window = event.xbutton.subwindow;&lt;br /&gt;XQueryPointer(display, event.xbutton.window, &amp;amp;event.xbutton.root,&lt;br /&gt;&amp;amp;event.xbutton.subwindow, &amp;amp;event.xbutton.x_root,&lt;br /&gt;&amp;amp;event.xbutton.y_root, &amp;amp;event.xbutton.x, &amp;amp;event.xbutton.y,&lt;br /&gt;&amp;amp;event.xbutton.state);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(XSendEvent(display, PointerWindow, True, 0xfff, &amp;amp;event)==0)&lt;br /&gt;fprintf(stderr, "XSendEvent()\n");&lt;br /&gt;&lt;br /&gt;XFlush(display);&lt;br /&gt;usleep(100000);&lt;br /&gt;&lt;br /&gt;event.type = ButtonRelease;&lt;br /&gt;event.xbutton.state = 0x100;&lt;br /&gt;&lt;br /&gt;if(XSendEvent(display, PointerWindow, True, 0xfff, &amp;amp;event)==0)&lt;br /&gt;fprintf(stderr, "XSendEvent()\n");&lt;br /&gt;&lt;br /&gt;XFlush(display);&lt;br /&gt;XCloseDisplay(display);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El programa:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vistas las funciones anteriores resulta trivial desarrollar un programa:&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;int main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;if(argc!=3)&lt;br /&gt;{&lt;br /&gt;printf("Usage: %s [x coord] [y coord]\n\n", argv[0]);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int x = atoi(argv[1]);&lt;br /&gt;int y = atoi(argv[2]);&lt;br /&gt;mouse_move(x, y);&lt;br /&gt;mouse_click(0);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Solo queda decir que las librerias necesarias de XLib son X11/Xlib.h y X11/Xutil.h &lt;span style="font-family: courier new; font-size: 85%;"&gt;&lt;x11 _moz-userdefined=""&gt;&lt;x11 _moz-userdefined=""&gt;&lt;/x11&gt;&lt;/x11&gt;&lt;/span&gt;&lt;br /&gt;Y que el programa se compila con:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;$ gcc click.c -lX11&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusiones:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;La publicidad web genera mucho dinero, lo que la hace atractiva para todo intento de uso fraudulento. Sin embargo las empresas que se dedican a esto saben lo que hacen y no resulta sencillo tomarles el pelo.&lt;br /&gt;Lo que quiero decir con esto es que el intento de ganar dinero haciendo clics en publicidad propia dificilmente llegará a buen término, por lo que no se lo recomiendo a nadie.&lt;br /&gt;&lt;br /&gt;Para finalizar un comentario para las empresas que se dedican a cancelar la cuenta del usuario que recibe clics fraudulentos: mala idea.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-2849002507053073927?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/2849002507053073927/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=2849002507053073927' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2849002507053073927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2849002507053073927'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/02/publicidad-web-automatizando-clics.html' title='Publicidad web: Automatizando clics'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-7550961661422991599</id><published>2008-02-17T19:49:00.007+01:00</published><updated>2012-01-19T23:12:29.541+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vulnerabilidades'/><title type='text'>Cómo funciona el exploit vmsplice</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Despues del revuelo ocasinado por el bug vmsplice() en el kernel Linux vamos a realizar un pequeño análisis de su funcionamiento. Para el que no lo sepa, la explotación del bug vmsplice permite a un usuario del sistema convertirse en root. Esto ocurre en los kernels que van desde la versión 2.6.17 a la 2.6.24.1.&lt;/div&gt;&lt;br /&gt;Algunos exploits disponibles son:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.milw0rm.com/exploits/5092"&gt;http://www.milw0rm.com/exploits/5092&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.milw0rm.com/exploits/5093"&gt;http://www.milw0rm.com/exploits/5093&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Veamos un ejemplo con el segundo exploit:&lt;br /&gt;&lt;br /&gt;$ uname -r&lt;br /&gt;2.6.23&lt;br /&gt;&lt;br /&gt;$ gcc exploit.c&lt;br /&gt;$ ./a.out&lt;br /&gt;-----------------------------------&lt;br /&gt;Linux vmsplice Local Root Exploit&lt;br /&gt;By qaaz&lt;br /&gt;-----------------------------------&lt;br /&gt;[+] addr: 0xc011481b&lt;br /&gt;[+] root&lt;br /&gt;$ id&lt;br /&gt;uid=0(root) gid=0(root) grupos=501(user)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La llamada al sistema vmsplice:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;vmsplice es una llamada al sistema que puede ser accedida desde espacio de usuario mediante syscall().&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;syscall(__NR_vmsplice, fd, iov, nr_segs, flags);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Encontramos su implementación en fs/splice.c, en las fuentes del kernel Linux:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;&lt;br /&gt;&lt;br /&gt;asmlinkage long sys_vmsplice(&lt;br /&gt;   int fd, const struct iovec __user *iov,unsigned long nr_segs, unsigned int flags){...}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Nos interesa prestar atención a los parámetros recibidos por la llamada al sistema, pues son los que el usuario puede controlar al llamar a la función.&lt;br /&gt;&lt;br /&gt;Cuando un usuario llama a sys_vmsplice() se produce la siguiente secuencia de llamadas:&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family: courier new;"&gt;- sys_vmsplice()&lt;/span&gt;  &lt;span style="font-family: courier new;"&gt;  - vmsplice_to_pipe()&lt;/span&gt;  &lt;span style="font-family: courier new;"&gt;    - get_iovec_page_array()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Dado que el bug se encuentra en &lt;span style="font-family: courier new;"&gt;get_iovec_page_array()&lt;/span&gt; nos interesará saber qué parámetros de la misma puede controlar el usuario. Es decir, qué parámetros de &lt;span style="font-family: courier new;"&gt;sys_vmsplice()&lt;/span&gt; llegan hasta &lt;span style="font-family: courier new;"&gt;get_iovec_page_array()&lt;/span&gt; y si estos parámetros pasan por algun filtro durante el proceso.&lt;br /&gt;&lt;br /&gt;Si leemos con atención las funciones implicadas vemos que desde la llamada a &lt;span style="font-family: courier new;"&gt;sys_vmsplice()&lt;/span&gt; hasta la ejecución de la función vulnerable  &lt;span style="font-family: courier new;"&gt;get_iovec_page_array()&lt;/span&gt; se mantienen los parámetros:  iov y nr_segs.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La función get_iovec_page_array():&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La función &lt;span style="font-family: courier new;"&gt;get_iovec_page_array()&lt;/span&gt; es la función vulnerable que el exploit aprovecha para obtener privilegios de root. Como se ha comentado en el apartado anterior, el usuario puede controlar los parámetros iov y nr_segs de esta función.&lt;br /&gt;&lt;br /&gt;Observemos el siguiente código de la función vulnerable:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    &lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;&lt;br /&gt;&lt;br /&gt;struct iovec entry;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;if(copy_from_user_mmap_sem(&amp;amp;entry, iov, sizeof(entry)))&lt;br /&gt;   break;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;len = entry.iov_len;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;npages = (off + len + PAGE_SIZE - 1) &amp;gt;&amp;gt; PAGE_SHIFT;&lt;br /&gt;&lt;br /&gt;if (npages &amp;gt; PIPE_BUFFERS - buffers)&lt;br /&gt;   npages = PIPE_BUFFERS - buffers;&lt;br /&gt;   &lt;br /&gt;error = get_user_pages(current, current-&amp;gt;mm,(unsigned long) base, npages, 0,    0,&amp;amp;pages[buffers], NULL);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;br /&gt;"iov" es copiada en "entry" y el valor de "iov_len" asignado a la variable "len". Por lo tanto, el usuario tiene el control de la variable "len".&lt;br /&gt;A continuación se calcula "npages" mediante &lt;span style="font-family: courier new;"&gt;off + len + PAGE_SIZE - 1.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En la función &lt;span style="font-family: courier new;"&gt;get_user_pages()&lt;/span&gt; se asume que npages es como mínimo 1. Dado que "len" no debe ser 0,  &lt;span style="font-family: courier new;"&gt;off + len + PAGE_SIZE - 1 &lt;/span&gt;siempre será mayor o igual que PAGE_SIZE. Sin embargo, si "len" tiene un valor cercano a &lt;span style="font-family: courier new;"&gt;UINT32_MAX&lt;/span&gt;, entonces npages podría valer 0 (&lt;a href="http://h4ck1t.blogspot.com/2007/06/integer-overflow.html"&gt;integer overflow&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Como consecuencia &lt;span style="font-family: courier new;"&gt;get_user_pages()&lt;/span&gt; podría retornar más de &lt;code style="font-family: courier new;"&gt;PIPE_BUFFERS &lt;/code&gt;entradas, lo que como veremos a continuación, produce un &lt;a href="http://h4ck1t.blogspot.com/2006/12/buffer-overflow-i.html"&gt;buffer overflow&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A continuación, en &lt;span style="font-family: courier new;"&gt;get_iovec_page_array()&lt;/span&gt;, viene el siguiente código:&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;&lt;br /&gt;&lt;br /&gt;for (i = 0; i &amp;lt; error; i++) &lt;br /&gt;{&lt;br /&gt;   const int plen = min_t(size_t, len, PAGE_SIZE - off);&lt;br /&gt;   partial[buffers].offset = off;partial[buffers].len = plen;&lt;br /&gt;   off = 0;&lt;br /&gt;   len -= plen;buffers++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El tamaño del array "partial" es PIPE_BUFFERS pero como hemos comentado, el valor de "error" será superior a este. Por lo tanto, las estructuras de datos que se encuentren a continuación de "partial" serán sobreescritas con "off" y "plen".&lt;br /&gt;&lt;br /&gt;Normalmente la víctima de esta sobreescritura es el array "pages" que contiene punteros. En este caso, por ejemplo, se podria sobreescribir "pages" con valores NULL.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cómo ejecutar código arbitrario:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Normalmente cuando el Kernel intenta acceder a un puntero NULL se obtiene una excepción que finaliza el proceso. Pero existe una técnica que puede ser usada por el atacanta para que en lugar de obtener un error se ejecute código arbitrario. Esta técnica consiste en mapear la dirección 0 y guardar allí datos que permitiran el control del usuario y la ejecución de código en el contexto del kernel.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Posibles soluciones:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sin duda la mejor solución al problema consiste en actualizar el kernel o aplicar el parche correspondiente. Pero en casos de que eso no sea posible, por ejemplo, por la imposibilidad de reiniciar la máquina, puede usarse el siguiente módulo:&lt;br /&gt;&lt;a href="http://home.powertech.no/oystein/ptpatch2008/ptpatch2008.c"&gt;&lt;br /&gt;http://home.powertech.no/oystein/ptpatch2008/ptpatch2008.c&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referencias:&lt;/span&gt;&lt;br /&gt;- &lt;a href="http://www.avertlabs.com/research/blog/index.php/2008/02/13/analyzing-the-linux-kernel-vmsplice-exploit/"&gt;Informe de McAfee Labs&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.coseinc.com/coseinc_linux_advisory_3.pdf"&gt;http://www.coseinc.com/coseinc_linux_advisory_3.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-7550961661422991599?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/7550961661422991599/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=7550961661422991599' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7550961661422991599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/7550961661422991599'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2008/02/cmo-funciona-el-exploit-vmsplice.html' title='Cómo funciona el exploit vmsplice'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-1220658617289303100</id><published>2008-01-13T14:35:00.001+01:00</published><updated>2012-01-19T23:51:21.605+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Factorización'/><title type='text'>Factorización IV: El Método de Curva Elíptica</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;El siguiente artículo es el cuarto de una serie dedicada a la factorización de números enteros. Hasta ahora se han visto los algoritmos básicos de factorización como Pollard P-1, que aunque pueden parecer rápidos, tienen complejidad exponencial, lo que los incapacita para factorizar números relativamente grandes. También se han introducido algunos de los conceptos necesarios para profundizar en el tema que nos permitirán, en este artículo y en los siguientes, estudiar los tres algoritmos más rápidos de factorización. Estos son el Método de Curva Elíptica (ECM), La Criba Cuadrática (QS) y la Criba en el Campo de Números (NFS), los tres de complejidad subexponencial. Empezaremos por el Método de Curva Elíptica.&lt;br /&gt;&lt;br /&gt;En el artículo &lt;a href="http://h4ck1t.blogspot.com/2007/09/introduccin-la-criptografa-de-curva.html"&gt;Criptografía de Curva Elíptica&lt;/a&gt; dimos una introducción a este peculiar tipo de curvas y su aplicación a la criptografía. A continuación iremos un poco más lejos y veremos como aprovechar esta herramienta matemática para factorizar números enteros grandes.&lt;br /&gt;&lt;br /&gt;Para entender el siguiente artículo es necesario disponer de unos conocimientos básicos de curvas elípticas. En caso contrario, es recomendable leer primero el artículo mencionado anterioremente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El Teorema de Lagrange:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si aplicamos el Teorema de Lagrange a las curvas elípticas no encontramos con algo interesante que nos conducizará al método de factorización mediante curvas elípticas.&lt;br /&gt;&lt;br /&gt;Si P es un punto en una curva elíptica E, entonces el orden de P dividirá el orden de E.&lt;br /&gt;&lt;br /&gt;Recordemos que el orden de E, representado como #E, corresponde al número de puntos que hay en una curva E. Mientras que el orden de P, corresponde al valor k más pequeño (diferente de O) tal que kP = O.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Imaginemos que queremos factorizar un número N. Si encontramos una curva E definida sobre N, cuyo orden sea B-smooth, para un valor de B suficientemente pequeño, nos encontraremos con que B!P = O.&lt;br /&gt;&lt;br /&gt;Esto ocurre debido a que #E es B-smooth y el orden de P debe ser un divisor de #E, tal y como nos indica el Teorema de Lagrange.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Factorización:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Encontrar un valor k tal que kP=O, en una curva mod N, es equivalente a encontrar un factor de N.&lt;br /&gt;&lt;br /&gt;Esto ocurre por que durante el proceso de cálculo de kP se realizan operaciones que necesitan que cierto número d tenga inversa d^(-1). Para que d sea invertible debe cumplirse que el máximo común divisor entre d i el módulo sea igual a 1.&lt;br /&gt;&lt;br /&gt;Pero ¿qué ocurre si d no tiene inversa? pues que el máximo común divisor entre d y el módulo N es diferente de 1. Con lo que tenemos un factor de N!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Imaginemos que queremos factorizar 4453. En este caso buscaríamos curvas aleatorias hasta encontrar una cuyo orden fuese B-smooth. Por ejemplo y²=x³+10x-2 mod 4453.&lt;br /&gt;&lt;br /&gt;Ahora calcularíamos, kP para un valor pequeño de K. Empezemos por 2P para, por ejemplo P=(1,3).&lt;br /&gt;&lt;br /&gt;(3x²+10) / 2y = 13 / 6 mod 4453      (derivada)&lt;br /&gt;&lt;br /&gt;Para calcular 13/6 necesitamos calcular 6^(-1). Dado que MCD(6, 4452) podemos hacerlo: 6^(-1) = 3711, con lo que obtenemos:&lt;br /&gt;&lt;br /&gt;13 / 6 = 3713 mod 4453&lt;br /&gt;x = 3713²-2 = 4332&lt;br /&gt;y = -3713(x-1)-3 = 3230&lt;br /&gt;&lt;br /&gt;Para calcular 3P hacemos 2P + P:&lt;br /&gt;&lt;br /&gt;(3230-3) / (4332-1) = 3227/4331.&lt;br /&gt;&lt;br /&gt;Igual que en el cálculo anterior, para poder calcular 3227/4331 es necesario que 4331 tenga inversa, es decir, que MCD(4331, 4453) sea 1. Pero si realizamos el cálculo vemos que MCD(4331, 4453)=61. Con lo que hemos encontrado un factor de N.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Complejidad:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El método de factorización mediante curvas elípticas és muy rápido. De hecho, cuando deseamos factorizar números enteros grandes i sabemos que undo de los factores es mucho menor que el otro, este método es el más rápido.&lt;br /&gt;&lt;br /&gt;Veamos a continuación por que és tan rápido.&lt;br /&gt;&lt;br /&gt;El teorema de Hasse nos dice que el orden #E satisface la siguiente ecuación:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;p+1-2 sqr(p) &amp;lt; #E &amp;lt; p+1-2 sqr(p) &lt;/div&gt;&lt;br /&gt;Esto nos da una cierta idea del intervalo en el que puede moverse el valor #E. De esta manera sabemos que al generar una curva aleatoria, estamos obteniendo un valor entre este rango, de manera que si es B-smooth, conseguiremos factorizar N.&lt;br /&gt;&lt;br /&gt;El número estimado de operaciones que necesitaremos realizar para encontrar una curva B-smooth es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;exp(sqr(2) + O(1) + sqr(lnp ln lnp)&lt;/div&gt;&lt;br /&gt;Como vemos, el número de operaciones necesarias es subexponencial, esto proviene del hecho de que la complejidad de encontrar números smooth es también subexponencial. Lo mismo ocurre con los algoritmos QS y NFS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Software:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Actualmente la implementación libre más rápida de ECM es GMP-ECM, disponible en:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.komite.net/laurent/soft/ecm/"&gt;http://www.komite.net/laurent/soft/ecm/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referencias:&lt;/span&gt;&lt;br /&gt;- Elliptic Curves, Number Theory and Cryptography. Lawrence C. Washington.&lt;br /&gt;- Prime Numbers, A Computational Perspective. Crandall &amp;amp; Pomerance.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-1220658617289303100?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/1220658617289303100/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=1220658617289303100' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1220658617289303100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1220658617289303100'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2007/11/factorizacin-iv-el-mtodo-de-curva.html' title='Factorización IV: El Método de Curva Elíptica'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-5385641958758019858</id><published>2007-11-21T20:25:00.001+01:00</published><updated>2012-01-19T23:51:21.662+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Factorización'/><title type='text'>Factorización III: P-1 de Pollard</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;Continuamos la serie de artículos sobre factorización con un algoritmo muy sencillo conocido como P-1 de Pollard.&lt;/div&gt;&lt;br /&gt;El algoritmo de factorización P-1 de Pollard parte de la idea de smoothness o suavidad. Un número se considera &lt;span style="font-weight: bold;"&gt;B-smooth&lt;/span&gt; cuando todos sus factores son más pequeños que B. Esta idea, puede ser usada con éxito como herramienta de factorización, usando como base el &lt;a href="http://en.wikipedia.org/wiki/Fermat%27s_little_theorem"&gt;Teorema Pequeño de Fermat&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;b^p = b  mod p&lt;br /&gt;b^(p-1) = 1 mod p&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;A partir de la formula anterior deducimos que b^(p-1) - 1 es múltiplo de p. De manera que si disponemos de un número n=pq el cual deseamos factorizar , podremos hacerlo si somos capaces de calcular b^(p-1).&lt;br /&gt;Inicialmente, esto puede parecer complicado, dado que no conocemos p. Pero supongamos que p-1 es B-smooth, para un valor de B bastante pequeño. Esto significaría que podemos calcular un valor M que contenga todos los factores de p-1, por ejemplo, calculando B!. Y si p-1 es un divisor de M, podemos aplicar el Teorema Pequeño de Fermat de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;b^M = 1 mod p&lt;/div&gt;&lt;br /&gt;Lo que nos llevarà a obtener un factor de n calculando el Máximo Común Divisor entre  b^M-1 y n.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;MCD(b^M-1, n)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Para finalizar, adjunto un programa en C y un ejemplo de su uso.&lt;br /&gt;&lt;br /&gt;$  gcc pollard_pm1.c -lgmp -o pollard_pm1&lt;br /&gt;$ ./a.out 97231944203 10&lt;br /&gt;Factor = 888799&lt;br /&gt;Factor = 109397&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/* Pollard P-1 */&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;gmp.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;mpz_t n, a, GCD, tmp, k;&lt;br /&gt;unsigned long int b;&lt;br /&gt;gmp_randstate_t state;&lt;br /&gt;&lt;br /&gt;if(argc!=3)&lt;br /&gt;{&lt;br /&gt;printf("Usage: %s [n] [B]\n", argv[0]);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;mpz_init(n);&lt;br /&gt;mpz_init(tmp);&lt;br /&gt;mpz_init(a);&lt;br /&gt;mpz_init(GCD);&lt;br /&gt;mpz_init(k);&lt;br /&gt;&lt;br /&gt;mpz_set_str(n, argv[1], 10);&lt;br /&gt;b = atof(argv[2]);&lt;br /&gt;&lt;br /&gt;if(mpz_perfect_power_p(n) != 0)&lt;br /&gt;{&lt;br /&gt;mpz_sqrt(tmp, n);&lt;br /&gt;gmp_printf("factor: %Zd\n", tmp);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;mpz_sub_ui(tmp, n, 1);&lt;br /&gt;mpz_fac_ui(k, b);&lt;br /&gt;&lt;br /&gt;gmp_randinit_default(state);&lt;br /&gt;&lt;br /&gt;while(1)&lt;br /&gt;{&lt;br /&gt;mpz_sub_ui(tmp, n, 1);&lt;br /&gt;mpz_urandomm(a, state, tmp);&lt;br /&gt;&lt;br /&gt;if (mpz_cmp_ui(a, 1) &amp;lt;= 0)&lt;br /&gt;mpz_set_ui(a, 2);&lt;br /&gt;&lt;br /&gt;mpz_powm(tmp, a, k, n);&lt;br /&gt;mpz_sub_ui(tmp, tmp, 1);&lt;br /&gt;mpz_abs(tmp, tmp);&lt;br /&gt;mpz_gcd(GCD, tmp, n);&lt;br /&gt;&lt;br /&gt;if (mpz_cmp_ui(GCD, 1) &amp;gt; 0)&lt;br /&gt;{&lt;br /&gt;if (mpz_probab_prime_p(GCD, 10) &amp;gt; 0)&lt;br /&gt;{&lt;br /&gt;gmp_printf("Factor = %Zd\n", GCD);&lt;br /&gt;mpz_div(n, n, GCD);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;if (mpz_cmp_ui(n, 1) == 0)&lt;br /&gt;{&lt;br /&gt;mpz_clear(a);&lt;br /&gt;mpz_clear(GCD);&lt;br /&gt;mpz_clear(tmp);&lt;br /&gt;mpz_clear(n);&lt;br /&gt;mpz_clear(k);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (mpz_probab_prime_p(n, 10) &amp;gt; 0)&lt;br /&gt;{&lt;br /&gt;gmp_printf("Factor = %Zd\n", n);&lt;br /&gt;mpz_clear(a);&lt;br /&gt;mpz_clear(GCD);&lt;br /&gt;mpz_clear(tmp);&lt;br /&gt;mpz_clear(n);&lt;br /&gt;mpz_clear(k);&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-5385641958758019858?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/5385641958758019858/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=5385641958758019858' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/5385641958758019858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/5385641958758019858'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2007/11/factorizacin-iii-p-1-de-pollard.html' title='Factorización III: P-1 de Pollard'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-26350161626526792</id><published>2007-10-31T20:41:00.001+01:00</published><updated>2012-01-19T23:36:19.453+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Redes'/><category scheme='http://www.blogger.com/atom/ns#' term='Sistemas Operativos'/><title type='text'>Introducción a las redes Tor</title><content type='html'>&lt;div style="text-align: justify;"&gt;Tor es un cojunto de herramientas que pretende conseguir el anonimato online. Usa una red de máquinas o nodos a través de los cuales enruta el tráfico de red, tal y como se muestra en el esquema siguiente:&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_q551Ajwo8ak/RyiOtrokscI/AAAAAAAAAEc/9ld5y9jdhX8/s1600-h/tor.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5127505091219468738" src="http://1.bp.blogspot.com/_q551Ajwo8ak/RyiOtrokscI/AAAAAAAAAEc/9ld5y9jdhX8/s400/tor.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Como se ve en el dibujo una conexión a través de la red Tor usa tres nodos intermediarios entre el origen y el destino. De esta manera la máquina destino que recibe la conexión solo tendrá acceso a la IP del último nodo.&lt;br /&gt;&lt;br /&gt;Tor ofrece una interfaz &lt;a href="http://en.wikipedia.org/wiki/SOCKS"&gt;SOCKS&lt;/a&gt; a las aplicaciones, por lo que cualquier aplicación preparada para usar SOCKS podrá utilizar la red Tor sin problemas.&lt;br /&gt;Sin embargo, no es necesario que una aplicación disponga de soporte para SOCKS, dado que Tor distribuye un script llamado "torify" que permite que cualquier aplicación use la red tor.&lt;br /&gt;&lt;br /&gt;Este script emplea la herramienta tsocks para permitir que una aplicación use SOCKS de forma transparente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para que un usuario pueda conectarse a la red Tor necesita obtener un listado de nodos de la red. Este proceso, como indica el dibujo, se realiza sin cifrar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_q551Ajwo8ak/RyilRLoksdI/AAAAAAAAAEk/jcY0uqiGSz0/s1600-h/tor1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5127529890360635858" src="http://3.bp.blogspot.com/_q551Ajwo8ak/RyilRLoksdI/AAAAAAAAAEk/jcY0uqiGSz0/s400/tor1.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;A continuación se empieza a crear el circuito por el que viajaran los datos en la red Tor. Cada servidor conoce únicamente al servidor que le proporciona los datos y al servidor al que se los envía. por lo que ninguna máquina conoce el recorrido completo. Además, en cada tramo, los servidores afectados negocian claves diferentes, impidiendo que las conexiones sean rastreadas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_q551Ajwo8ak/RyilX7okseI/AAAAAAAAAEs/CTkud9fsXa0/s1600-h/tor2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5127530006324752866" src="http://2.bp.blogspot.com/_q551Ajwo8ak/RyilX7okseI/AAAAAAAAAEs/CTkud9fsXa0/s400/tor2.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Una vez el circuito ha sido establecido se utilizará durante unos diez minutos. Posteriormente se creará un circuito nuevo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_q551Ajwo8ak/RyildLoksfI/AAAAAAAAAE0/Vf4COkoaBU0/s1600-h/tor3.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5127530096519066098" src="http://3.bp.blogspot.com/_q551Ajwo8ak/RyildLoksfI/AAAAAAAAAE0/Vf4COkoaBU0/s400/tor3.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La forma de instalar Tor depende en gran medida del sistema operativo utilizado, por lo que para instalarlo lo mejor es partir de la &lt;a href="http://www.torproject.org/documentation.html.es"&gt;documentación oficial&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Una vez instalado su uso es sencillo. Por ejemplo, podríamos torificar la aplicación netcat con el comando siguiente:&lt;br /&gt;&lt;pre&gt;$ torify nc www.google.com 80&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Observemos el funcionamiento de Tor. Si no usamos el comando "torify" vemos que estamos realizando una conexión directa a google.&lt;br /&gt;&lt;pre&gt;$ nc www.google.com 80&lt;br /&gt;&lt;br /&gt;# En otro terminal&lt;br /&gt;$  netstat  | grep ESTABLISHED&lt;br /&gt;tcp        0      0 192.168.1.69:34362          nf-in-f99.google.com:http   ESTABLISHED&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Sin embargo, torificando netcat los resultados son diferentes.&lt;br /&gt;&lt;pre&gt;$ torify nc www.google.com 80&lt;br /&gt;&lt;br /&gt;# En otro terminal&lt;br /&gt;$ netstat  | grep ESTABLISHED&lt;br /&gt;tcp        0      0 192.168.1.69:34352          tor.outra.net:9090          ESTABLISHED&lt;br /&gt;tcp        0      0 192.168.1.69:34351          cyberphunk.eu:9001          ESTABLISHED&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Queda claro que no saltamos directamente al servidor de google sino que entramos en la red Tor. Veamos ahora con que dirección IP llegamos a nuestro destino. Necesitaremos una web que nos diga la dirección IP (&lt;a href="http://www.vermiip.es/"&gt;http://www.vermiip.es/&lt;/a&gt;) y otra que nos diga la localización geográfica (&lt;a href="http://www.ip2location.com/free.asp"&gt;http://www.ip2location.com/free.asp&lt;/a&gt;),&lt;br /&gt;&lt;br /&gt;Esto nos permitirá obtener la IP con el comando:&lt;br /&gt;&lt;pre&gt;$ torify lynx --dump http://www.vermiip.com 2&amp;gt;/dev/null | grep "Tu ip" | cut -c 18-30&lt;br /&gt;85.214.63.25&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Y su localización geográfica:&lt;br /&gt;&lt;pre&gt;$ torify lynx --dump http://www.ip2location.com/free.asp?ipaddresses=85.214.63.25 \&lt;br /&gt;2&amp;gt;/dev/null | grep "85.214.63.25\|mapit" |  sed -e 's/\[.*\]//'&lt;br /&gt;85.214.63.25 DE GERMANY&lt;br /&gt;BERLIN BERLIN STRATO RECHENZENTRUM BERLIN&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;De esta manera podemos construir un sencillo script que nos de el listado de nodos de salida de Tor.&lt;br /&gt;&lt;pre&gt;$ cat  print_tor_nodes.sh&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;while true; do&lt;br /&gt;&lt;br /&gt;IP=`torify lynx --dump http://www.vermiip.com 2&amp;gt;/dev/null | grep "Tu ip" | cut -c 18-30`;&lt;br /&gt;&lt;br /&gt;DATA=`torify lynx --dump http://www.ip2location.com/free.asp?ipaddresses="$IP" \&lt;br /&gt;2&amp;gt;/dev/null | grep "$IP\|mapit" |  sed -e 's/\[.*\]//'`&lt;br /&gt;&lt;br /&gt;echo $DATA&lt;br /&gt;sleep 300&lt;br /&gt;&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Del que extraemos el siguiente listado, que nos permite ver los nodos que nos dan acceso a Internet en último lugar.&lt;br /&gt;&lt;pre&gt;208.64.29.34 US UNITED STATES NEW YORK NEW YORK R &amp;amp; D TECHNOLOGIES LLC&lt;br /&gt;217.20.117.1 DE GERMANY BERLIN BERLIN NETDIREKT E. K&lt;br /&gt;128.197.11.3 US UNITED STATES MASSACHUSETTS BOSTON BOSTON UNIVERSITY&lt;br /&gt;88.191.29.92 FR FRANCE ILE-DE-FRANCE PARIS DEDIBOX SAS&lt;br /&gt;88.191.25.27 FR FRANCE ILE-DE-FRANCE PARIS DEDIBOX SAS&lt;br /&gt;89.149.207.1 DE GERMANY BERLIN BERLIN NETDIREKT E.K&lt;br /&gt;87.234.124.1 DE GERMANY BERLIN BERLIN QSC AG DYNAMIC IP ADDRESSES&lt;br /&gt;88.191.29.92 FR FRANCE ILE-DE-FRANCE PARIS DEDIBOX SAS&lt;br /&gt;87.234.124.1 DE GERMANY BERLIN BERLIN QSC AG DYNAMIC IP ADDRESSES&lt;br /&gt;88.191.29.92 FR FRANCE ILE-DE-FRANCE PARIS DEDIBOX SAS&lt;br /&gt;128.197.11.3 US UNITED STATES MASSACHUSETTS BOSTON BOSTON UNIVERSITY&lt;br /&gt;75.72.79.46 US UNITED STATES&lt;br /&gt;203.26.16.68 AU AUSTRALIA NEW SOUTH WALES WEST WYALONG TPG INTERNET PTY LTD&lt;br /&gt;88.191.11.18 FR FRANCE ILE-DE-FRANCE PARIS DEDIBOX SAS&lt;br /&gt;88.198.50.14 DE GERMANY - - HETZNER-RZ-NBG-NET&lt;br /&gt;83.243.80.77 DE GERMANY BERLIN BERLIN SERVERCREW LTD. PI&lt;br /&gt;88.191.29.92 FR FRANCE ILE-DE-FRANCE PARIS DEDIBOX SAS&lt;br /&gt;209.160.32.1 US UNITED STATES DISTRICT OF COLUMBIA WASHINGTON HOPONE INTERNET CORPORATION&lt;br /&gt;60.167.39.24 CN CHINA BEIJING BEIJING CHINANET ANHUI PROVINCE NETWORK&lt;br /&gt;83.217.66.50 BE BELGIUM OOST-VLAANDEREN DENDERMONDE NMV-CUST-DIGITALROOT&lt;br /&gt;128.2.141.33 US UNITED STATES PENNSYLVANIA PITTSBURGH CARNEGIE MELLON UNIVERSITY83.171.182.9 DE GERMANY BAYERN NüRNBERG MNET TELEKOMMUNIKATION GMBH&lt;br /&gt;85.214.63.25 DE GERMANY BERLIN BERLIN STRATO RECHENZENTRUM BERLIN&lt;br /&gt;74.208.46.15 US UNITED STATES NEW YORK NEW YORK 1&amp;amp;1 INTERNET INC&lt;br /&gt;122.145.8.19 JP JAPAN - - FREEBIT CO. LTD&lt;br /&gt;71.226.252.2 US UNITED STATES PENNSYLVANIA WEST CHESTER COMCAST CABLE COMMUNICATIONS INC&lt;br /&gt;83.233.181.9 SE SWEDEN - - PROVIDER LOCAL REGISTRY&lt;br /&gt;166.70.207.2 US UNITED STATES UTAH SALT LAKE CITY XMISSION&lt;br /&gt;195.71.90.10 DE GERMANY - - PROVIDER LOCAL REGISTRY&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Respecto al script anterior, realiza un sleep de cinco minutos antes de reintentar, lo que hace el procese extremadamente lento. Si se reinicia Tor antes de cada petición el circuito se crea de nuevo y se obtiene un nodo diferente. De esta manera puede suprimirse el sleep del script.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En el momento de escribir este artículo la red Tor es relativamente pequeña, lo que disminuye notablemente el grado de anonimato. Aunque, sin duda, tiene un futuro prometedor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referencias:&lt;/span&gt;&lt;br /&gt;- Tor Project: &lt;a href="http://www.torproject.org/"&gt;http://www.torproject.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-26350161626526792?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/26350161626526792/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=26350161626526792' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/26350161626526792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/26350161626526792'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2007/10/introduccin-las-redes-tor.html' title='Introducción a las redes Tor'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_q551Ajwo8ak/RyiOtrokscI/AAAAAAAAAEc/9ld5y9jdhX8/s72-c/tor.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-6110437850275189237</id><published>2007-10-26T08:37:00.002+02:00</published><updated>2012-01-19T23:51:21.675+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Factorización'/><title type='text'>Factorización II: Rho de Pollard</title><content type='html'>&lt;div style="text-align: justify;"&gt;Continuando con la serie de artículos sobre factorización, hoy veremos el método Rho de &lt;a href="http://en.wikipedia.org/wiki/John_Pollard_%28mathematician%29"&gt;Pollard&lt;/a&gt;. Un instructivo algoritmo que permite factorizar números bastante más grandes que los que podríamos factorizar mediante divisiones sucesivas de números primos o aplicando directamente el método de Fermat, tal y como vimos en "&lt;a href="http://h4ck1t.blogspot.com/2007/10/factorizacin-i-introduccin.html"&gt;Factorización I: Introducción&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;A lo largo de este artículo (y de los siguientes) se usará la operación mod. Esta operación representa el resto de una división entera. Por ejemplo 6 mod 5 =1 pues si dividimos seis entre cinco la division no es exacta, dado que tiene resto 1. Otros ejemplos pueden ser: 101 mod 99 = 2, 4^2 mod 15=1 o 33² mod 989 = 10².&lt;br /&gt;&lt;br /&gt;Ahora supongamos que tenemos la ecuación F(x)=x² mod n. Si aplicamos esta ecuación para diferentes valores de x queda claro que el resultado siempre será menor que n. Por lo tanto, si aplicamos la ecuación para diferentes valores de x es lógico pensar en que en algun momento los resultados empezarán a repetirse, pues son finitos!&lt;br /&gt;&lt;br /&gt;Veamos un ejemplo para n=323, empezando por ejemplo con x=2.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;F(2) = 2² mod 323 = 4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;F(4) = 4² mod 323 = 16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;F(16) = 16² mod 323 = 256&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;F(256) = 256² mod 323 = 290&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;F(290) = 290² mod 323 = 120&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;F(120) = 120² mod 323 = 188&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;F(188) = 188² mod 323 = 137&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;F(137) = 137² mod 323 = 35&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; font-weight: bold;"&gt;F(35) = 35² mod 323 = 256&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; font-weight: bold;"&gt;F(256) = 16² mod 323 = 290&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; font-weight: bold;"&gt;F(290) = 290² mod 323 = 120&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como se ve marcado en rojo, a partir de F(35) los resultados empiezan a repetirse, entrando en un ciclo.&lt;br /&gt;&lt;br /&gt;Si representamos en un dibujo los resultados obtenidos vemos que su forma es similar al de la letra griega rho. Lo que da nombre al algoritmo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_q551Ajwo8ak/RyGlkboksZI/AAAAAAAAAEE/B4LUuHfaqbA/s1600-h/rho_323.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5125559896236142994" src="http://1.bp.blogspot.com/_q551Ajwo8ak/RyGlkboksZI/AAAAAAAAAEE/B4LUuHfaqbA/s400/rho_323.jpg" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El algoritmo Rho de Pollard&lt;/span&gt; permite encontrar ciclos cuando se trabaja con grupos donde los elementos son finitos. De manera que lo único que hemos hecho hasta ahora es encontrar un ciclo en un campo de números finitos con n=323. Pero, ¿Cómo aplicar esto para factorizar?&lt;br /&gt;&lt;br /&gt;Si nos fijamos bien en la Rho dibujada vemos un hecho interesante producido al cerrar el ciclo. Llegamos al número 256 tanto a partir de 16² como a partir de 35². Este hecho, conocido como colisión, nos permite ver que 35²=16² mod 323. Lo que se conoce como &lt;span style="font-weight: bold;"&gt;congruencia&lt;/span&gt; y significa que 35² mod 323 = 16². Así pues, de forma similar a como vimos en el método de Fermat encontraremos un factor p mediante 35-16=19.&lt;br /&gt;&lt;br /&gt;Resumiendo, el algoritmo Rho de Pollard nor permitirá encontrar colisiones, que a su vez nos permitiran encontrar un factor de n.&lt;br /&gt;&lt;br /&gt;Para aplicar el método Rho de Pollard tal y como lo hemos visto, es necesario almacenar todos los elementos y compararlos con los elementos nuevos que se van generando. Esto es muy costoso tanto en tiempo como en espacio. Afortunadamente, existe una variación conocida como método de Floyd para encontrar ciclos, que permite encontrar una colisición sin almacenar apenas datos. Este método consiste en mantener dos valores. El primero recorrera en cada paso un elemento de la Rho, el segundo recorrerá dos. El tiempo estimado en el que ambos se encontrarán de nuevo, formando una colisión, es en el peor de los casos la raiz de n.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Algoritmo:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. Elegir un entero aleatorio a entre 1 y n-3.&lt;br /&gt;2. Elegir un entero aleatorio s entre 0 y n-1.&lt;br /&gt;3. Inicializar U=V=s;&lt;br /&gt;4. Calcular U=F(U), V=F(F(V)));&lt;br /&gt;5. Si MCD(U-V, n) = 1, volver al punto 4.&lt;br /&gt;6. Si MCD(U-V, n) = n, volver al punto 1.&lt;br /&gt;7. MCD(U-V, n) es un factor de n.&lt;br /&gt;&lt;br /&gt;NOTA: MCD=Máximo Común Divisor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hemos visto que el tiempo estimado para factorizar un número es de raiz de n en el peor de los casos. Pero existe una manera de mejorar considerablemente el tiempo de resolución del algoritmo cuando se dispone de cierta información sobre uno de los factores de n.&lt;br /&gt;&lt;br /&gt;Se estima que usando F(x)=x^(2k) +a mod n, el número de iteraciones necesarias para encontrar un factor de n es de c*RAIZ(p)/RAIZ(MCD(p-1,2K)-1).&lt;br /&gt;Es decir, quanto más factores comunes existan entre p-1 y 2k, menor será el número de iteraciones necesario para encontrar p.&lt;br /&gt;Si no sabemos que factores puede tener p-1 puede ser útil calcular el factorial de un número B y usarlo como k: k=B!. Cuanto más grande sea B menos operaciones seran necesarias para encontrar el factor. Pero tampoco se puede abusar del tamaño de B, pues para valores demasiado grandes el tiempo por iteración será muy elevado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Veamos un ejemplo usando el programa rho_2k.cpp que pego al final:&lt;br /&gt;&lt;br /&gt;$ g++ -lgmpxx rho_2k.cpp -o rho_2k&lt;br /&gt;$ ./rho_2k [n number]  [B bound]&lt;br /&gt;&lt;br /&gt;El primer parámetro es el número que queremos factorizar, el segundo el número B que usaremos para calcular k mediante su factorial.&lt;br /&gt;&lt;br /&gt;Intentemos factorizar el número de 32 bits: 2930992620606930277. Primero con B=1, que equivale a k=1:&lt;br /&gt;&lt;br /&gt;$ ./rho_2k 2930992620606930277 1&lt;br /&gt;factor: 1065951967&lt;br /&gt;count: 19188&lt;br /&gt;&lt;br /&gt;Hemos necesitado 19.188 operaciones. Intentemoslo ahora con B=10:&lt;br /&gt;&lt;br /&gt;./rho_2k 2930992620606930277 10&lt;br /&gt;factor: 2749647931&lt;br /&gt;count: 9516&lt;br /&gt;&lt;br /&gt;El número de iteraciones baja. Con B=100:&lt;br /&gt;&lt;br /&gt;./rho_2k 2930992620606930277 100&lt;br /&gt;factor: 2749647931&lt;br /&gt;count: 50&lt;br /&gt;&lt;br /&gt;Como podemos observar la mejora es tangible. Finalmente con B=1000:&lt;br /&gt;&lt;br /&gt;./rho_2k 2930992620606930277 700&lt;br /&gt;factor: 2749647931&lt;br /&gt;count: 1&lt;br /&gt;&lt;br /&gt;En una sola operacion!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hemos visto que cuantos más factores coinciden entre p-1 i k mejores son los resultados. Hasta el punto de que si todos los factores de p-1 estan en k, se resuelve la factorización en una sola operación. Sin embargo B no puede incrementarse indefinicademente, pues el factorial crece muy rápido, y no tardaremos en llegar a valores que relentizarán demasiado las operaciones.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Finalmente dejo una copia del programa usado:&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;#include &amp;lt;gmpxx.h&amp;gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;&lt;br /&gt;// F(x) = x^2k + a mod n&lt;br /&gt;mpz_class F(mpz_class &amp;amp;x, mpz_class &amp;amp;k, mpz_class &amp;amp;a, mpz_class &amp;amp;n)&lt;br /&gt;{&lt;br /&gt;mpz_class res;&lt;br /&gt;mpz_class pow;&lt;br /&gt;&lt;br /&gt;pow = 2*k;&lt;br /&gt;mpz_powm(res.get_mpz_t(), x.get_mpz_t(), pow.get_mpz_t(), n.get_mpz_t());&lt;br /&gt;res += a;&lt;br /&gt;&lt;br /&gt;return res;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;mpz_class n;&lt;br /&gt;mpz_class U;&lt;br /&gt;mpz_class V;&lt;br /&gt;mpz_class s;&lt;br /&gt;mpz_class g;&lt;br /&gt;mpz_class k;&lt;br /&gt;mpz_class a;&lt;br /&gt;mpz_class count;&lt;br /&gt;&lt;br /&gt;if (argc!=3)&lt;br /&gt;{&lt;br /&gt;cout &amp;lt;&amp;lt; argv[0] &amp;lt;&amp;lt; " [n number]  [B bound]" &amp;lt;&amp;lt; endl;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;n = argv[1];&lt;br /&gt;int B = atoi(argv[2]);&lt;br /&gt;count = 0;&lt;br /&gt;s = 2;&lt;br /&gt;U = s;&lt;br /&gt;V = s;&lt;br /&gt;g = 1;&lt;br /&gt;&lt;br /&gt;mpz_fac_ui(k.get_mpz_t(), B);&lt;br /&gt;a = 3;&lt;br /&gt;&lt;br /&gt;while(g==1)&lt;br /&gt;{&lt;br /&gt;U = F(U, k, a, n);&lt;br /&gt;V = F(V, k, a, n);&lt;br /&gt;V = F(V, k, a, n);&lt;br /&gt;&lt;br /&gt;g = U-V;&lt;br /&gt;mpz_gcd(g.get_mpz_t(), g.get_mpz_t(), n.get_mpz_t());&lt;br /&gt;&lt;br /&gt;if(g==n)&lt;br /&gt;{&lt;br /&gt;cout &amp;lt;&amp;lt; "bad seed" &amp;lt;&amp;lt; endl;&lt;br /&gt;U++;&lt;br /&gt;V++;&lt;br /&gt;g=1;&lt;br /&gt;}&lt;br /&gt;count ++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;cout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "factor: " &amp;lt;&amp;lt; g &amp;lt;&amp;lt; endl;&lt;br /&gt;cout &amp;lt;&amp;lt; "count: " &amp;lt;&amp;lt; count &amp;lt;&amp;lt; endl;&lt;br /&gt;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Referencias:&lt;br /&gt;- Prime Numbers, A Computational Perspective. Crandall &amp;amp; Pomerance. Ed Springer.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-6110437850275189237?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/6110437850275189237/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=6110437850275189237' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6110437850275189237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6110437850275189237'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2007/10/factorizacin-ii-rho-de-pollard.html' title='Factorización II: Rho de Pollard'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_q551Ajwo8ak/RyGlkboksZI/AAAAAAAAAEE/B4LUuHfaqbA/s72-c/rho_323.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-8606487187382089529</id><published>2007-10-25T07:41:00.001+02:00</published><updated>2012-01-19T23:51:21.726+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Factorización'/><title type='text'>Factorización I: Introducción</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ya hablamos de la importancia que tiene la factorización en criptografía en  "&lt;a href="http://h4ck1t.blogspot.com/2007/05/rompiendo-claves-rsa.html"&gt;Rompiendo claves RSA&lt;/a&gt;". En esta serie de artículos se hará un repaso a los algoritmos usados para factorizar números grandes, empezando por los algoritmos más básicos hasta llegar a los más actuales y modernos sistemas, que permiten factorizar números de más de 150 dígitos decimales.&lt;br /&gt;&lt;br /&gt;Como veremos, existen decenas de algoritmos de factorización, pero los más destacados por su mayor velocidad (o menor complejidad) son:&lt;br /&gt;&lt;br /&gt;- Quadratic Sive (&lt;a href="http://en.wikipedia.org/wiki/Quadratic_sieve"&gt;QS&lt;/a&gt;): El algoritmo más rápido para factorizar números grandes de propósito general menores de 110 dígitos decimales (aproximadamente).&lt;br /&gt;&lt;br /&gt;- Number Field Sieve (&lt;a href="http://en.wikipedia.org/wiki/General_number_field_sieve"&gt;NFS&lt;/a&gt;): El algoritmo más rápido para factorizar números grandes de propósito general mayores de 110 dígitos decimales (aproximadamente).&lt;br /&gt;&lt;br /&gt;- Elliptic Curve Method (&lt;a href="http://en.wikipedia.org/wiki/Lenstra_elliptic_curve_factorization"&gt;ECM&lt;/a&gt;): El algoritmo más rápido para factorizar números grandes cuando uno de los factores es relativamente pequeño.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="formatbar_CreateLink" style="display: block;" title="Vínculo"&gt;Estos tres algoritmos tienen un complejidad subexponencial que es lo más rápido que se ha conseguido llegar en el campo de la factorización. Si se encontrase un algoritmo de complejidad &lt;a href="http://en.wikipedia.org/wiki/Polynomial_time"&gt;polinómica&lt;/a&gt;, podríamos decir que el problema de la factorización queda resuelto y dejaría de poder utilizarse en criptografía. Esto significaría, entre otras cosas, el fin de algoritmos como RSA.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span id="formatbar_CreateLink" style="display: block;" title="Vínculo"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span id="formatbar_CreateLink" style="display: block;" title="Vínculo"&gt;Los algoritmos QS i NFS se basan en una vieja estratégia atribuída al genial matemático &lt;a href="http://en.wikipedia.org/wiki/Pierre_de_Fermat"&gt;Pierre de Fermat&lt;/a&gt;. La vemos a continuación:&lt;/span&gt;&lt;br /&gt;&lt;span id="formatbar_CreateLink" style="display: block;" title="Vínculo"&gt;Supongamos que disponemos de un número &lt;span style="font-weight: bold;"&gt;n&lt;/span&gt; del cual queremos obtener su representación como multiplicación de dos factores, es decir &lt;span style="font-weight: bold;"&gt;n=pq&lt;/span&gt;. Ecuación que también podríamos representar como &lt;span style="font-weight: bold;"&gt;n=(x+y)(x-y)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Si encontramos dos números enteros positivos que cumlan la ecuación de manera que &lt;span style="font-weight: bold;"&gt;x-y&lt;/span&gt; sea mayor que 1, diremos que hemos encontrado un factor no trivial de &lt;span style="font-weight: bold;"&gt;n&lt;/span&gt;, quedando el problema resuelto. Pero para buscar a y b cambiaremos el enfoque del problema.&lt;br /&gt;&lt;br /&gt;Sabemos que &lt;span style="font-weight: bold;"&gt;(x+y)(x-y)=x²-y²&lt;/span&gt; , lo que nos permite un cambio de estrategia importante, pues ya no tenemos que buscar directamente factores de &lt;span style="font-weight: bold;"&gt;n&lt;/span&gt;,  sino  parejas de cuadrados cuya diferencia sea &lt;span style="font-weight: bold;"&gt;n&lt;/span&gt;.&lt;/span&gt;&lt;br /&gt;Veamos un ejemplo para n=989. Si realizamos una búsqueda de cuadrados empezando por la raiz entera de 989, es decir 31, tenemos que 32²-989=35 no es cuadrado, continuamos, 33³-989=100 y bingo! Pues vemos que 33²-10²=989. Partiendo de la fórmula anterior tenemos que el factor p corresponde a &lt;span style="font-weight: bold;"&gt;p=33-10=23&lt;/span&gt; y el factor q corresponde a &lt;span style="font-weight: bold;"&gt;q=33+10=43&lt;/span&gt;. Quedando n factorizado como 989=23*43.&lt;br /&gt;&lt;br /&gt;El método utilizado puede parecer muy rápido, pues hemos factorizado el 989 en solo dos operaciones. Si nos hubiesemos dedicado a probar con todos los números primos menores que 31 habríamos necesitado 9 operaciones! (2, 3, 5, 7, 11, 13, 17, 19, 23). Pero lo cierto es que cuando tratamos de factorizar números más grandes vemos que el enfoque no es el adecuado, pues resulta extremadamente lento.&lt;br /&gt;&lt;br /&gt;Lo que debemos tener en cuenta de la idea de Fermat es que proporciona una estrategia diferente para atacar el problema, de manera que pasamos de buscar factores de n a buscar diferencias de cuadrados. Como veremos en próximos artículos, esta estratégia se usa con éxito en los algoritmos QS y NFS.&lt;br /&gt;&lt;/div&gt;&lt;span id="formatbar_CreateLink" style="display: block;" title="Vínculo"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span id="formatbar_CreateLink" style="display: block;" title="Vínculo"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span id="formatbar_CreateLink" style="display: block;" title="Vínculo"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span id="formatbar_CreateLink" style="display: block;" title="Vínculo"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span id="formatbar_CreateLink" style="display: block;" title="Vínculo"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-8606487187382089529?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/8606487187382089529/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=8606487187382089529' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8606487187382089529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8606487187382089529'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2007/10/factorizacin-i-introduccin.html' title='Factorización I: Introducción'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-2668970995237199065</id><published>2007-09-24T19:15:00.001+02:00</published><updated>2012-01-19T23:36:19.457+01:00</updated><title type='text'>Linus Torvalds y C++</title><content type='html'>Sorprendente la perla que nos deja Linus en referencia al lenguaje C++. No tiene desperdicio.&lt;br /&gt;&lt;br /&gt;Dejo aquí una copia (el enlace &lt;a href="http://thread.gmane.org/gmane.comp.version-control.git/57643/focus=57918"&gt;aquí)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;On Wed, 5 Sep 2007, Dmitry Kakurin wrote:&lt;br /&gt;#&lt;br /&gt;# When I first looked at Git source code two things struck me as odd:&lt;br /&gt;# 1. Pure C as opposed to C++. No idea why. Please don't talk about portability,&lt;br /&gt;# it's BS.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;*YOU*&lt;/b&gt; are full of bullshit.&lt;br /&gt;&lt;br /&gt;C++ is a horrible language. It's made more horrible by the fact that a lot&lt;br /&gt;of substandard programmers use it, to the point where it's much much&lt;br /&gt;easier to generate total and utter crap with it. Quite frankly, even if&lt;br /&gt;the choice of C were to do &lt;b&gt;*nothing*&lt;/b&gt; but keep the C++ programmers out,&lt;br /&gt;that in itself would be a huge reason to use C.&lt;br /&gt;&lt;br /&gt;In other words: the choice of C is the only sane choice. I know Miles&lt;br /&gt;Bader jokingly said "to piss you off", but it's actually true. I've come&lt;br /&gt;to the conclusion that any programmer that would prefer the project to be&lt;br /&gt;in C++ over C is likely a programmer that I really &lt;b&gt;*would*&lt;/b&gt; prefer to piss&lt;br /&gt;off, so that he doesn't come and screw up any project I'm involved with.&lt;br /&gt;&lt;br /&gt;C++ leads to really really bad design choices. You invariably start using&lt;br /&gt;the "nice" library features of the language like STL and Boost and other&lt;br /&gt;total and utter crap, that may "help" you program, but causes:&lt;br /&gt;&lt;br /&gt;- infinite amounts of pain when they don't work (and anybody who tells me&lt;br /&gt;that STL and especially Boost are stable and portable is just so full&lt;br /&gt;of BS that it's not even funny)&lt;br /&gt;&lt;br /&gt;- inefficient abstracted programming models where two years down the road&lt;br /&gt;you notice that some abstraction wasn't very efficient, but now all&lt;br /&gt;your code depends on all the nice object models around it, and you&lt;br /&gt;cannot fix it without rewriting your app.&lt;br /&gt;&lt;br /&gt;In other words, the only way to do good, efficient, and system-level and&lt;br /&gt;portable C++ ends up to limit yourself to all the things that are&lt;br /&gt;basically available in C. And limiting your project to C means that people&lt;br /&gt;don't screw that up, and also means that you get a lot of programmers that&lt;br /&gt;do actually understand low-level issues and don't screw things up with any&lt;br /&gt;idiotic "object model" crap.&lt;br /&gt;&lt;br /&gt;So I'm sorry, but for something like git, where efficiency was a primary&lt;br /&gt;objective, the "advantages" of C++ is just a huge mistake. The fact that&lt;br /&gt;we also piss off people who cannot see that is just a big additional&lt;br /&gt;advantage.&lt;br /&gt;&lt;br /&gt;If you want a VCS that is written in C++, go play with Monotone. Really.&lt;br /&gt;They use a "real database". They use "nice object-oriented libraries".&lt;br /&gt;They use "nice C++ abstractions". And quite frankly, as a result of all&lt;br /&gt;these design decisions that sound so appealing to some CS people, the end&lt;br /&gt;result is a horrible and unmaintainable mess.&lt;br /&gt;&lt;br /&gt;But I'm sure you'd like it more than git.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Linus&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-2668970995237199065?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/2668970995237199065/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=2668970995237199065' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2668970995237199065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/2668970995237199065'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2007/09/linus-torvalds-y-c.html' title='Linus Torvalds y C++'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-6123961018193358273</id><published>2007-09-15T11:36:00.001+02:00</published><updated>2012-01-19T23:34:48.206+01:00</updated><title type='text'>Criptografía de Curva Elíptica</title><content type='html'>&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Las curvas elípticas son ampliamente usadas en criptografía, especialmente en &lt;a href="http://es.wikipedia.org/wiki/Criptograf%C3%ADa_asim%C3%A9trica"&gt;criptografía asimétrica&lt;/a&gt; (o de clave pública). Una de sus mayores ventajas es la velocidad que ofrece, debido a que requiere longitudes de clave mucho menores a las de criptosistemas como &lt;a href="http://es.wikipedia.org/wiki/RSA"&gt;RSA&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;A continuación se introducen las bases de este tipo de criptografía.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;Qués son las curvas elípticas?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;En criptografía se habla de curva elíptica en referencia a una ecuación y²=x³+Ax+B que cumple 4A³+27B²≠0. Dando diferentes valores a A y B obtenemos todo un conjunto de curvas que, al ser dibujadas, ofrecen una forma similar. Son ejemplos de curvas elípticas y²=x³-x (izquierda) y y²=x³-x+1 (derecha).&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_q551Ajwo8ak/Ruln7p2u7hI/AAAAAAAAADs/M5o3dMwZLsY/s1600-h/EC.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5109729526773902866" src="http://4.bp.blogspot.com/_q551Ajwo8ak/Ruln7p2u7hI/AAAAAAAAADs/M5o3dMwZLsY/s400/EC.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Las curvas elípticas tienen ciertas características que las hacen especiales en el mundo de la criptografía. Una de estas características consiste en la posibilidad de poder generar un punto en una curva partiendo de dos puntos dados (o incluso de uno). Este concepto es muy fácil de entender partiendo de la figura siguiente.&lt;/div&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_q551Ajwo8ak/RuvyJZ2u7jI/AAAAAAAAAD8/bBA8fl98HhA/s1600-h/group_law.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5110444445555158578" src="http://1.bp.blogspot.com/_q551Ajwo8ak/RuvyJZ2u7jI/AAAAAAAAAD8/bBA8fl98HhA/s400/group_law.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Usamos como puntos de partida P y Q, dos puntos conocidos. Trazaremos una linea entre P y Q. Si la linea corta la curva en un tercer punto, lo reflejaremos a través del eje, dando lugar a un nuevo punto R. Esta operación se representa como R=P+Q. En caso de que la linea que pasa por P y Q no corte a la curva en ningún otro punto, diremos que corta la curva en un punto O en el infinito y representaremos esta operación como P+Q=O.&lt;br /&gt;&lt;br /&gt;Partiendo de la suma, no es difícil encontrar un mecanismo que nos permita realizar multiplicaciones de tipo kP, siendo k un escalar. Por ejemplo, imaginemos que queremos realizar la operación 13P, es decir, multiplicar 13 por un punto P. Bastaría con realizar la siguiente secuencia de doblado de puntos:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;P, 2P=P+P, 4P=2P+2P, 8P=4P+4P, 13P=8P+4P+P&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Este simple mecanismo para generar nuevos puntos dota a una curva elíptica de la posibilidad de realizar operaciones aritméticas sobre ella, base de los criptosistemas que estudiaremos en breve.&lt;br /&gt;&lt;br /&gt;En criptografía las curvas elípticas se usan sobre &lt;a href="http://es.wikipedia.org/wiki/Cuerpo_finito"&gt;campos finitos&lt;/a&gt; (Fq) con q muy grande. Un ejemplo de campo finito podría ser F5={0,1,2,3,4}. De manera que el número 7 representado en el campo finito correspondería a 7 mod 5 = 2.&lt;br /&gt;Cuando se usan campos finitos el número de puntos que hay en una curva tambien es finito. Este numero se llama orden de la curva y se representa como #E. Debemos diferenciarlo del orden de un punto, que se refiere al valor k más pequeño (diferente de 0) que multiplicado por P da O.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El problema del logaritmo discreto (DLP)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La criptografía de Clave Pública basa su fuerza en la dificultad de resolver ciertos problemas matemáticos. Uno de los más usados es el problema del logaritmo discreto (Discrete Logarithm Problem - DLP). Este problema se basa en la dificultad que representa resolver una ecuación de tipo &lt;i&gt;x = a&lt;sup&gt;y&lt;/sup&gt; mod n&lt;/i&gt; donde x, a y n son conocidas e y es la variable que se busca. De hecho, para valores de n e y sufientemente grandes es computacionalmente imposible resolver el problema, al menos, con los algoritmos y ordenadores actuales.&lt;br /&gt;El algoritmo más rápido conocido para resolver este problema es el &lt;a href="http://en.wikipedia.org/wiki/Index_calculus_algorithm"&gt;Index Calculus &lt;/a&gt;que permite resolverlo en tiempo subexponencial.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El problema del logaritmo discreto en Curvas Elípticas (ECDLP)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Existe una problema similar al problema del logaritmo discreto que puede usarse con Curvas Elípticas. Anteriormente hemos visto como realizar una operación tipo Q=kP de una forma sencilla. Sin embargo, obtener k y P partiendo solo de Q es computacionalmente difícil. De hecho, el algoritmo más rápido que permite encontrar una solución es el algoritmo Rho de Pollard, pero este algorimo es de tiempo exponencial, mucho mas lento que en el caso del ataque a DLP mediante el Index Calculus.&lt;br /&gt;Este hecho es muy importante, pues la dificultad de resolver ECDLP frente a DLP permite que los criptosistemas que se basan en el primero usen claves mucho más cortas. De manera que los sistemas que usan ECDLP requieren mucha menos memoria y capacidad de proceso.&lt;br /&gt;Una clave RSA de 4096 bits ofrece la misma seguridad que una clave de un criptosistema de Curva Elíptica de 313 bits.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Intercambio de Claves de Diffie-Hellman&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;El intercambio de claves de &lt;a href="http://es.wikipedia.org/wiki/Diffie-Hellman"&gt;Diffie-Hellman&lt;/a&gt; es un protocolo que permite un intercambio secreto y seguro de claves entre dos partes que no han tenido un contacto previo. Se usa ampliamente en criptografía y se basa en el problema del logaritmo discreto (DLP). Por lo tanto, puede usarse el mismo algoritmo a través del problema ECDLP.&lt;br /&gt;&lt;br /&gt;Al algoritmo puede resumirse en los siguientes pasos:&lt;br /&gt;&lt;br /&gt;1. Alice y Bob eligen una curva elíptica E sobre un campo finito Fq de manera que el ECDLP sea computacionalmente difícil. También eligen un punto P en dicha curva de manera que su orden sea un número primo grande.&lt;br /&gt;&lt;br /&gt;2. Alice elige un entero grande a, calcula PA=aP y envía PA a Bob.&lt;br /&gt;&lt;br /&gt;3. Bob elige un entero grande b, calcula PB=bP y envía PB a Alice.&lt;br /&gt;&lt;br /&gt;4. Alice calcula aPB=abP&lt;br /&gt;&lt;br /&gt;5. Bob calcula bPA=abP&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Al finalizar el algoritmo, tanto Alice como Bob disponen de abP. Pero un usario que escuche el canal solo habrá podido obtener PA y PB, los cuales no le permiten calcular abP a menos que resuelva el ECDLP. Alice y Bob solo tendrán que extraer una clave a partir de abP y usarla para enviar datos cifrados. Para tal propósito podrán usar cualquier algoritmo simétrico como DES, AES, etc.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Algoritmo de firma digital (ECDSA)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El algoritmo de firma digital para curvas elípticas está basado en el estandar de firma digital &lt;a href="http://es.wikipedia.org/wiki/DSA"&gt;DSA&lt;/a&gt;. Este algoritmo ofrece un esquema que permite firmar documentos y verificar las firmas.&lt;br /&gt;&lt;br /&gt;Los pasos a seguir para generar claves, firmar y verificar la firma, se muestran a continuación.&lt;br /&gt;&lt;br /&gt;Alice genera un par de claves:&lt;br /&gt;&lt;br /&gt;1. Alice elige una curva E con orden #E=fr, de manera que r sea un primo grande.&lt;br /&gt;&lt;br /&gt;2. Alice busca un punto en la curva de orden r.&lt;br /&gt;&lt;br /&gt;3. Alice elige un número aleatorio d situado en el intervalor [2, r-2] y calcula Q=dP.&lt;br /&gt;&lt;br /&gt;4. La clave pública corresponde a (E,P,r,Q) y la clave privada a d.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Alice firma un documento M.&lt;br /&gt;(h(M) corresponde al &lt;a href="http://en.wikipedia.org/wiki/Hash_function"&gt;hash&lt;/a&gt; de M)&lt;br /&gt;&lt;br /&gt;1. Alice elige un número aleatorio k en el intervalo [2, r-2].&lt;br /&gt;&lt;br /&gt;2. Se calcula el punto (x, y)=kP&lt;br /&gt;&lt;br /&gt;3. R=x mod r&lt;br /&gt;&lt;br /&gt;4. s=k¯¹ (h(M) +Rd) mod r, si s es igual cero, empezamos de nuevo.&lt;br /&gt;&lt;br /&gt;5. La firma de Alice es (R,s) y se transmite junto con el mensaje M.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bob verifica la firma de Alice.&lt;br /&gt;&lt;br /&gt;1. Bob obtiene la clave pública de Alice.&lt;br /&gt;&lt;br /&gt;2. w = s¯¹ mod r&lt;br /&gt;&lt;br /&gt;3. u1 = h(M) w mod r&lt;br /&gt;&lt;br /&gt;4. u2 = Rw mod r&lt;br /&gt;&lt;br /&gt;5. (x, y) = u1P + u2P&lt;br /&gt;&lt;br /&gt;6. v = x mod r&lt;br /&gt;&lt;br /&gt;7. Si v es igual a R, la firma es válida.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OpenSSL: Un ejemplo práctico de firma digital mediante curvas elípticas.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Des de la versión 0.9.8 la herramienta &lt;a href="http://www.openssl.org/"&gt;OpenSSL&lt;/a&gt; ofrece algunas opciones para trabajar con curvas elípticas. No están muy documentadas, pero nos servirán para realizar una pequeña demostración del uso de la firma digital.&lt;br /&gt;&lt;br /&gt;Para generar un clave ejecutaremos el siguiente comando:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ openssl ecparam -genkey -name secp224r1 -out key.pem&lt;/pre&gt;&lt;br /&gt;Ahora tanto la clave pública como la privada se encuentran dentro de key.pem. Podemos extraer la pública con el comando:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ openssl ec -in key.pem -text -pubout -out pubkey.pem&lt;/pre&gt;&lt;br /&gt;Ya disponemos de una clave con la que hacer pruebas, por lo que generaremos un mensaje que firmar:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ echo "El mensaje de prueba de h4ck1t!" &amp;gt; msg.txt&lt;/pre&gt;&lt;br /&gt;Y lo firmaremos, operación que solo puede realizar el propietario de la clave privada:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$  openssl dgst -sign key.pem -ecdsa-with-SHA1 &amp;lt; msg.txt &amp;gt; msg.sig&lt;/pre&gt;&lt;br /&gt;Firmado el mensaje, todo usuario que disponga de la clave pública podrá verificar su procedencia:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ openssl dgst -verify pubkey.pem -ecdsa-with-SHA1 -signature msg.sig &amp;lt; msg.txt&lt;br /&gt;Verified OK&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referencias:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Elliptic Curves, Number Theory and Cryptography. Lawrence C. Washington. Ed Chapman &amp;amp; HALL/CRC.&lt;br /&gt;- Prime Numbers, a Computational Perspective. Richard Crandall, Carl Pomerance. Ed Springer.&lt;br /&gt;- Criptografía de curva Elíptica, Ataque Rho de Pollard.  Daniel Lerch. Hakin9 (6-2007).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-6123961018193358273?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/6123961018193358273/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=6123961018193358273' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6123961018193358273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6123961018193358273'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2007/09/introduccin-la-criptografa-de-curva.html' title='Criptografía de Curva Elíptica'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_q551Ajwo8ak/Ruln7p2u7hI/AAAAAAAAADs/M5o3dMwZLsY/s72-c/EC.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-817869754685968702</id><published>2007-09-11T21:10:00.002+02:00</published><updated>2012-01-19T23:51:21.714+01:00</updated><title type='text'>Criptoanálisis: Análisis de frecuencias</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Análisis de frecuencias:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El &lt;a href="http://es.wikipedia.org/wiki/An%C3%A1lisis_de_frecuencias"&gt;análisis de frecuencias&lt;/a&gt; es una forma de criptoanálisis utilizada en &lt;a href="http://en.wikipedia.org/wiki/Substitution_cipher"&gt;cifrados de sustitución&lt;/a&gt;, basada en el estudio de la frecuencia de aparición de las letras o símbolos de un criptograma. Este análisis se basa en el hecho de que cada lenguaje dispone de una frecuencia característica de aparición de sus letras o grupos de ellas. Por ejemplo, en inglés es común el uso de la letra E mientras que la X raramente aparece. Lo mismo ocurre en los textos en castellano, donde la E y la A son las letras más habituales.&lt;br /&gt;&lt;br /&gt;Aproximadamente la distribución de porcentajes de aparición de cada letra en algunas lenguas comunes es la siguiente:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-weight: bold;"&gt;L&lt;/span&gt;      &lt;span style="font-weight: bold;"&gt; Inglés           Francés         Alemán          Castellano&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;a&lt;/span&gt;       8.167%          7.636%          6.51%           12.53%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;b  &lt;/span&gt;     1.492%          0.901%          1.89%           1.42%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;c&lt;/span&gt;       2.782%          3.260%          3.06%           4.68%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;d  &lt;/span&gt;     4.253%          3.669%          5.08%           5.86%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;e&lt;/span&gt;       12.702%         14.715%         17.40%          13.68%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;f&lt;/span&gt;       2.228%          1.066%          1.66%           0.69%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;g&lt;/span&gt;       2.015%          0.866%          3.01%           1.01%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;h &lt;/span&gt;      6.094%          0.737%          4.76%           0.70%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;i &lt;/span&gt;      6.966%          7.529%          7.55%           6.25%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;j&lt;/span&gt;       0.153%          0.545%          0.27%           0.44%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;k&lt;/span&gt;       0.772%          0.049%          1.21%           0.00%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;l&lt;/span&gt;       4.025%          5.456%          3.44%           4.97%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;m&lt;/span&gt;       2.406%          2.968%          2.53%           3.15%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;n&lt;/span&gt;       6.749%          7.095%          9.78%           6.71%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;o&lt;/span&gt;       7.507%          5.378%          2.51%           8.68%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;p&lt;/span&gt;       1.929%          3.021%          0.79%           2.51%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;q&lt;/span&gt;       0.095%          1.362%          0.02%           0.88%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;r&lt;/span&gt;       5.987%          6.553%          7.00%           6.87%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;s&lt;/span&gt;       6.327%          7.948%          7.27%           7.98%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;t&lt;/span&gt;       9.056%          7.244%          6.15%           4.63%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;u&lt;/span&gt;       2.758%          6.311%          4.35%           3.93%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;v&lt;/span&gt;       0.978%          1.628%          0.67%           0.90%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;w&lt;/span&gt;       2.360%          0.114%          1.89%           0.02%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;x&lt;/span&gt;       0.150%          0.387%          0.03%           0.22%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;y&lt;/span&gt;       1.974%          0.308%          0.04%           0.90%&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;z&lt;/span&gt;       0.074%          0.136%          1.13%           0.52%&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;A parte de estudiar la frecuencia de aparición de un símbolo, también podemos fijarnos en la frecuencia de aparición de conjuntos de dos, tres, o más letras. En castellano son frecuentes cadenas de dos letras como DE, LA, EL, EN o palabras de tres como QUE, LOS, DEL, LAS y POR.&lt;br /&gt;&lt;br /&gt;A continuación se muestran los conjuntos de dos y tres letras más frecuentes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;En Inglés&lt;/span&gt;&lt;br /&gt;Conjuntos de dos letras: TH, HE, AN, IN, ER, RE, ES, ON, EA, TI, AT, ST, EN, ND, OR, TO, NT, ED, IS, AR.&lt;br /&gt;Conjuntos de tres letras: THE, ING, AND, ION, ENT, FOR, TIO, ERE, HER, ATE, VER, TER, THA, ATI, HAT, ERS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;En Francés:&lt;/span&gt;&lt;br /&gt;Conjuntos de dos letras: ES, EN, OU, DE, NT, TE, ON, SE, AI, IT, LE, ET, ME, ER, EM, OI, UN, QU.&lt;br /&gt;Conjuntos de tres letras: ENT, QUE, ION, LES, AIT, TIO, ANS, ONT, ANT, OUR, AIS, OUS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;En Alemán&lt;/span&gt;&lt;br /&gt;Conjuntos de dos letras: EN, ER, CH, DE, GE, EI, IE, IN, NE, ND, BE, EL, TE, UN, ST, DI, NO, UE, SE, AU, RE, HE.&lt;br /&gt;Conjuntos de tres letras: EIN, ICH, DEN, DER, TEN, CHT, SCH, CHE, DIE, UNG, GEN, UND, NEN, DES, BEN, RCH.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;En Castellano:&lt;/span&gt;&lt;br /&gt;Conjuntos de dos letras: ES, EN, EL, DE, LA, OS, AR, UE, RA, RE, ER, AS, ON, ST, AD, AL, OR, TA, CO.&lt;br /&gt;Conjuntos de tres letras: QUE, EST, ARA, ADO, AQU, DEL, CIO, NTE, OSA, EDE, PER, IST, NEI, RES, SDE.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Al intentar romper un cifrado mediante análisis de frecuencia nuestro objetivo será identificar la frecuencia de aparición de los símbolos usados. Después buscaremos una equivalencia entre estos símbolos y las letras que más aparecen en la lengua usada intentando encontrar un significado. Nos servirán también las frecuencias de aparición de conjuntos de X letras, así como nuestra imaginación a la hora de rellenar huecos al estilo del &lt;a href="http://es.wikipedia.org/wiki/Ahorcado_%28juego%29"&gt;juego del ahorcado&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;En algunos casos puede ser útil conocer el porcentaje de vocales de cada idioma. En inglés, por ejemplo, el porcentaje de vocales es del 40%, igual que en el alemán. Sin embargo, en francés es del 45% y en castellano del 47%. Estos datos, aunque solo son aproximaciones pueden resultar de gran interés en ciertos criptogramas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Criptoanálisis de ejemplo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para experimentar con lo comentado anteriormente, imaginemos un sistema de &lt;a href="http://en.wikipedia.org/wiki/Substitution_cipher"&gt;cifrado por sustitución&lt;/a&gt;, de manera que cada letra del mensaje ha sido sustituída por un símbolo. El ejemplo de mensaje cifrado es el siguiente:&lt;br /&gt;&lt;pre&gt;3# 16_@!5?6#=_# 2&amp;gt; 23 #6!2 |2 2&amp;gt;16_$_6 15% 13#72 &amp;gt;2162!# 5 |2 /% 45|5 2%_?4#!_15&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para iniciar nuestro criptoanálisis, empezaremos realizando un análisis de frecuencias. Para que este proceso no se haga pesado, adjunto un sencillo programa en C++ que lo hará por nosotros.&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;fstream&amp;gt;&lt;br /&gt;#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;#include &amp;lt;map&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;using namespace std;&lt;br /&gt;&lt;br /&gt;if(argc!=3)&lt;br /&gt;{&lt;br /&gt;cout &amp;lt;&amp;lt; "Usage: " &amp;lt;&amp;lt; argv[0] &amp;lt;&amp;lt; " [file] [max group size]" &amp;lt;&amp;lt; endl;&lt;br /&gt;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;for(int i=0; i&amp;lt;atoi(argv[2]); i++)&lt;br /&gt;{&lt;br /&gt;int c;&lt;br /&gt;map&amp;lt;string,int&amp;gt; freq;&lt;br /&gt;ifstream file(argv[1]);&lt;br /&gt;string group;&lt;br /&gt;while( (c=file.get()) &amp;amp;&amp;amp; !file.eof() )&lt;br /&gt;{&lt;br /&gt;if(isspace(c))&lt;br /&gt;continue;&lt;br /&gt;group += string(1,c);&lt;br /&gt;&lt;br /&gt;if(group.size()&amp;gt;=i+1)&lt;br /&gt;freq[group.substr(group.size()-i-1, i+1)]++;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;cout &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "-- FREQ SIZE " &amp;lt;&amp;lt; i+1 &amp;lt;&amp;lt; " --" &amp;lt;&amp;lt; endl;&lt;br /&gt;int count = 0;&lt;br /&gt;map&amp;lt;string,int&amp;gt;::iterator it = freq.begin();    &lt;br /&gt;for(;it!=freq.end(); it++)&lt;br /&gt;{&lt;br /&gt;if((*it).second&amp;gt;1)&lt;br /&gt;{&lt;br /&gt;count ++;&lt;br /&gt;&lt;br /&gt;cout &amp;lt;&amp;lt; (*it).first &amp;lt;&amp;lt; ": " &amp;lt;&amp;lt; (*it).second &amp;lt;&amp;lt; "\t";&lt;br /&gt;&lt;br /&gt;if(count%6==0)&lt;br /&gt;cout &amp;lt;&amp;lt; endl;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;cout &amp;lt;&amp;lt; endl;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Partiendo del programa y del un fichero con el texto cifrado "cipher.txt" realizamos el analisis de frecuencias:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ g++ freq.cpp&lt;br /&gt;$ ./a.out cipher.txt 3&lt;br /&gt;-- FREQ SIZE 1 --&lt;br /&gt;!: 4    #: 7    %: 3    1: 6    2: 10   3: 3&lt;br /&gt;4: 2    5: 6    6: 6    &amp;gt;: 3    ?: 2    _: 6&lt;br /&gt;|: 3&lt;br /&gt;&lt;br /&gt;-- FREQ SIZE 2 --&lt;br /&gt;15: 2   16: 3   2&amp;gt;: 3   3#: 3   5|: 2   6_: 2&lt;br /&gt;&amp;gt;2: 2   |2: 2&lt;br /&gt;&lt;br /&gt;-- FREQ SIZE 3 --&lt;br /&gt;16_: 2  2&amp;gt;2: 2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Si observamos el análisis de frecuencias podemos ver que los símbolos que más se repiten son '2' y '#', seguidos de '_', '1', '5' y '6'. Por lo que siguiendo la distribución de porcentajes frecuentes es probable que se correspondan con las letras 'a', 'e', 'i', etc.&lt;br /&gt;Es importante tener en cuenta que esto solo nos da una pista de cuál podría ser el valor de cada símbolo, pero no nos lo dice de forma exacta. Por este motivo será necesario probar varias hipótesis.&lt;br /&gt;&lt;br /&gt;Empezaremos suponiendo que '2' corresponde a 'e' y '#' corresponde a 'a'. Si nuestra hipótesis falla, continuaremos probando al revés.&lt;br /&gt;Sustituimo en el texto cifrado:&lt;br /&gt;&lt;pre&gt;3A 16_@!5?6A=_A E&amp;gt; E3 A6!E |E E&amp;gt;16_$_6 15% 13A7E &amp;gt;E16E!A 5 |E /% 45|5 E%_?4A!_15&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Observando el principio del texto cifrado "3A" y la cuarta palabra "E3" deducimos que '3' corresponde a la letra 'L'. Sustituimos de nuevo.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;LA 16_@!5?6A=_A E&amp;gt; EL A6!E |E E&amp;gt;16_$_6 15% 1LA7E &amp;gt;E16E!A 5 |E /% 45|5 E%_?4A!_15&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;También pueden resultar buenas pistas la tercera palabra "E&amp;gt;" y la sexta "|E". Estas nos indican que "&amp;gt;" podría corresponder a 'S' o 'N', y '|' probablemente corresponderá a 'D'. Vea la frecuencia de grupos de dos letras.&lt;br /&gt;Además, si nos basamos en las suposiciones anterioriores, el grupo '/%' que corresponde a una palabra de dos letras que no contiene ni 'A' ni 'E'. Será pues una de las siguientes: NO, UN, SU, LO, SI, MI, ...&lt;br /&gt;&lt;br /&gt;También es una buena pista el '5' solitario, que muy probablemente corresponderá a una 'y' o una 'o'. Pero viendo en la octava palabra '15%' deducimos que dificilmente corresponderá a una 'Y'.&lt;br /&gt;&lt;br /&gt;En base a las observaciones anteriores, una buena hipotesis podría corresponder a las siguientes sustituciones: '5' por 'o', '|' por 'D' y '&amp;gt;' por 'S'.&lt;br /&gt;&lt;pre&gt;LA 16_@!O?6A=_A ES EL A6!E DE ES16_$_6 1O% 1LA7E SE16E!A O DE /% 4ODO E%_?4A!_1O&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Llegados a este punto, más de unos sería capaz de resolver el mensaje utilizando solamente su imaginación. Pero en lugar de dar la solución, vamos a explorar otra técnica interesante. Esta corresponde a atacar las palabras sin descifrar con un diccionario. Como ejemplo usaremos una lista de palabras en castellano que se puede descargar de:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lemarios.olea.org/lemario-espanol-2002-10-25.txt.gz"&gt;http://lemarios.olea.org/lemario-espanol-2002-10-25.txt.gz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NOTA: Esta lista contiene acentos y ñ, que es recomendable sustituir para poder seguir los siguientes pasos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Después de descargar y descomprimir la lista de palabras estudiemos que opciones tenemos para acabar de descifrar el mensaje. Una palabra que tiene posibilidades es '1LA7E', una palabra de 5 letras de las cuales conocemos tres. Tambien es interesante atacar la palabra que viene a continuación 'SE16E!A'.&lt;br /&gt;&lt;br /&gt;Podemos hacerlo con dos sencillos comandos grep:&lt;br /&gt;&lt;pre&gt;$ grep "^.la.e$" lemario-espanol-2002-10-25.txt&lt;br /&gt;alabe&lt;br /&gt;clase&lt;br /&gt;clave&lt;br /&gt;glase&lt;br /&gt;llave&lt;br /&gt;olaje&lt;br /&gt;$ grep "^se..e.a$" lemario-espanol-2002-10-25.txt&lt;br /&gt;secreta&lt;br /&gt;secuela&lt;br /&gt;segueta&lt;br /&gt;septena&lt;br /&gt;serreta&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Sin duda, las palabras que buscamos son "CLAVE SECRETA". Así que continuamos con la sustitución:&lt;br /&gt;&lt;pre&gt;LA CR_@TO?RA=_A ES EL ARTE DE ESCR_$_R CO% CLAVE SECRETA O DE /% 4ODO E%_?4AT_CO&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La última palabra puede confundirnos, pero está claro cuál es la segunda. En cualquier caso:&lt;br /&gt;&lt;pre&gt;$ grep "^cr..to.ra..a$" lemario-espanol-2002-10-25.txt&lt;br /&gt;criptografia.&lt;br /&gt;$ grep "^e....at.co$" lemario-espanol-2002-10-25.txt&lt;br /&gt;enigmatico&lt;br /&gt;enzimatico&lt;br /&gt;estomatico&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Con lo que la resolución del mensaje es trivial:&lt;br /&gt;&lt;br /&gt;"La criptografia es el arte de escribir con clave secreta o de un modo enigmatico"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Finalmente el mensaje ha quedado descifrado, pero hay que tener en cuenta que aquí no se han expuesto todas las posibilidades. Es normal, cuando se inicia el criptoanálisis, que se tomen algunas hipótesis incorrectas. En estos casos, no queda más remedio que volver a empezar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referencias:&lt;/span&gt;&lt;br /&gt;- Cryptanalysis a study of ciphers and their solution. Helen Fouché Gaines.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-817869754685968702?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/817869754685968702/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=817869754685968702' title='8 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/817869754685968702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/817869754685968702'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2007/09/criptoanlisis-anlisis-de-recuencias.html' title='Criptoanálisis: Análisis de frecuencias'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-8381855285423347990</id><published>2007-08-26T22:07:00.001+02:00</published><updated>2012-01-19T23:51:21.720+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enigmas'/><title type='text'>Los cifrados Zodiac</title><content type='html'>A finales de la década de los 60 un asesino en serie conocido como&lt;a href="http://en.wikipedia.org/wiki/Zodiac_Killer"&gt; Zodiac&lt;/a&gt; cometió varios asesinatos en el norte de California. Zodiac enviaba &lt;a href="http://www.zodiackiller.com/Letters.html"&gt;cartas&lt;/a&gt; a la prensa en tono desafiante, algunas de las cuales contenían ciertos criptogramas como el que se muestra a continuación:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;340 Cipher&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://2.bp.blogspot.com/_q551Ajwo8ak/RtVHTEJWZVI/AAAAAAAAACk/7ycUTLODBik/s1600-h/340cipher.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5104064145550370130" src="http://2.bp.blogspot.com/_q551Ajwo8ak/RtVHTEJWZVI/AAAAAAAAACk/7ycUTLODBik/s400/340cipher.gif" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tres cartas de Zodiac fueron recibidas por el &lt;span style="font-style: italic;"&gt;Vallejo Times Herald&lt;/span&gt;, el &lt;span style="font-style: italic;"&gt;San Francisco Chronicle&lt;/span&gt; y el &lt;span style="font-style: italic;"&gt;San Francisco Examiner&lt;/span&gt; el 1 de agosto de 1969. En ellas Zodiac se hacía responsable de tres asesinatos e incluía un criptograma que supuestamente contenía su identidad.   En dichas cartas se exigía su impresión en primera plana, o de lo contrario mataría a una docena de personas ese mismo fin de semana.&lt;br /&gt;&lt;br /&gt;El 8 de agosto de 1969, Donald y Bettye Harden descifraron el criptograma que debía contener la identidad de Zodiac. No era así.&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="citado"&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I LIKE KILLING PEOPLE BECAUSE IT IS SO MUCH FUN IT IS MORE FUN THAN KILLING WILD GAME IN THE FORREST BECAUSE MAN IS THE MOST DANGEROUS ANAMAL OF ALL TO KILL SOMETHING GIVES ME THE MOST THRILLING EXPERENCE IT IS EVEN BETTER THAN GETTING YOUR ROCKS OFF WITH A GIRL THE BEST PART OF IT IS THAT WHEN I DIE I WILL BE REBORN IN PARADICE AND ALL THE I HAVE KILLED WILL BECOME MY SLAVES I WILL NOT GIVE YOU MY NAME BECAUSE YOU WILL TRY TO SLOI DOWN OR STOP MY COLLECTING OF SLAVES FOR MY AFTERLIFE EBEORIETEMETHHPITI&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Carta al Vallejo Times Herald&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_q551Ajwo8ak/RtVQO0JWZWI/AAAAAAAAACs/dDnlleRwqag/s1600-h/timesheraldcipher.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5104073968140576098" src="http://1.bp.blogspot.com/_q551Ajwo8ak/RtVQO0JWZWI/AAAAAAAAACs/dDnlleRwqag/s400/timesheraldcipher.gif" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-weight: bold; text-align: center;"&gt;Carta al San Francisco Chronicle&lt;/div&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_q551Ajwo8ak/RtVQUUJWZXI/AAAAAAAAAC0/Zhq6ndP2B3I/s1600-h/chroniclecipher.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5104074062629856626" src="http://3.bp.blogspot.com/_q551Ajwo8ak/RtVQUUJWZXI/AAAAAAAAAC0/Zhq6ndP2B3I/s400/chroniclecipher.gif" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-weight: bold; text-align: center;"&gt;Carta al San Francisco Examiner&lt;/div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_q551Ajwo8ak/RtVQZkJWZYI/AAAAAAAAAC8/vha9GHK8VYk/s1600-h/examinercipher.gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5104074152824169858" src="http://4.bp.blogspot.com/_q551Ajwo8ak/RtVQZkJWZYI/AAAAAAAAAC8/vha9GHK8VYk/s400/examinercipher.gif" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La historia que rodea al asesino está llena de incógnitas, desde su identidad hasta la solución de ciertos criptogramas. Por ejemplo, el criptograma mostrado al principio, conocido como criptograma 340, continúa sin resolver.&lt;br /&gt;&lt;br /&gt;La reciente película "&lt;a href="http://www.imdb.com/title/tt0443706/"&gt;Zodiac&lt;/a&gt;" de &lt;a href="http://www.imdb.com/name/nm0000399/"&gt;David Fincher&lt;/a&gt; narra la historia de  este conocido asesino en serie.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-8381855285423347990?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/8381855285423347990/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=8381855285423347990' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8381855285423347990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8381855285423347990'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2007/08/los-cifrados-zodiac.html' title='Los cifrados Zodiac'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q551Ajwo8ak/RtVHTEJWZVI/AAAAAAAAACk/7ycUTLODBik/s72-c/340cipher.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-6699149118111265670</id><published>2007-08-19T20:21:00.001+02:00</published><updated>2012-01-19T23:51:21.688+01:00</updated><title type='text'>Buscando colisiones en SHA-1</title><content type='html'>&lt;div style="text-align: justify;"&gt;El &lt;a href="http://en.wikipedia.org/wiki/SHA-1"&gt;algoritmo SHA-1&lt;/a&gt; es uno de los algoritmos de hash más importantes, por ser ampliamente usado en criptografía. Su función como algoritmos de hash, consiste en aceptar una entrada de longitud arbitraria y retornar un resumen (digest) de una longitud fija.&lt;br /&gt;&lt;br /&gt;Entre las características principales de los algoritmos de hash destaca la necesidad de que las funciones sean de un solo sentido, es decir, que no se pueda obtener información de los datos origen a partir del resument resultado.&lt;br /&gt;Otra característica importante es la resistencia a las colisiones, pues no deben existir dos entradas que produzcan el mismo resumen resultado. Pero lo cierto es que esta última característica es inalcanzable, desde el momento en que la longitud de la entrada puede ser superior a la de la salida.&lt;br /&gt;&lt;br /&gt;Una forma de encontrar colisiones consiste en utilizar el ataque de cumpleaños o  &lt;a href="http://en.wikipedia.org/wiki/Birthday_attack"&gt;birthday attack&lt;/a&gt;, aunque este requiere 2^(n/2) operaciones de hash para encontrar una colisión. Impracticable en algoritmos como SHA-1.&lt;br /&gt;&lt;br /&gt;Otra forma de hacerlo consiste en usar un ataque dedicado a SHA-1 que intente explotar sus debilidadades. Cierto trabajo de este estilo puede encontrarse en &lt;a href="http://www.infosec.sdu.edu.cn/paper/Finding%20Collisions%20in%20the%20Full%20SHA-1.pdf"&gt; Finding Collisions in the Full SHA-1&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Por otra parte, la &lt;a href="http://www.tugraz.at/"&gt;Universidad de Graz&lt;/a&gt; (Australia) ha puesto en marcha un proyecto dedicado a encontrar &lt;a href="http://www.iaik.tugraz.at/research/krypto/collision/SHA1CollisionBasics.php"&gt;colisiones en SHA-1&lt;/a&gt;. Para tal propósito usa la plataforma distribuida de software libre &lt;a href="http://boinc.berkeley.edu/"&gt;BOINC&lt;/a&gt;, de la &lt;a href="http://www.berkeley.edu/"&gt;universidad de California en Berkeley&lt;/a&gt;. Esta plataforma permite usar los tiempos muertos de proceso para colaborar con el proyecto.&lt;br /&gt;&lt;br /&gt;En &lt;a href="http://www.kriptopolis.org/"&gt;Kriptopolis&lt;/a&gt;, han creado un equipo para participar en la búsqueda de colisiones. Puedes unirte a él &lt;a href="http://boinc.berkeley.edu/download_all.php"&gt;descargando el soft de BOINC&lt;/a&gt; y siguiento las &lt;a href="http://www.kriptopolis.org/boinc"&gt;instrucciones de instalación de Kriptopolis&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-6699149118111265670?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/6699149118111265670/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=6699149118111265670' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6699149118111265670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/6699149118111265670'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2007/08/buscando-colisiones-en-sha-1.html' title='Buscando colisiones en SHA-1'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-1474955888788699708</id><published>2007-07-28T20:45:00.002+02:00</published><updated>2012-01-19T23:34:48.146+01:00</updated><title type='text'>Codificación Base 64</title><content type='html'>&lt;div style="text-align: justify;"&gt;Base 64 en un sistema de codificación que permite representar datos binarios usando únicamente los caracteres imprimibles ASCII. Este sistema ha sido usado ampliamente para codificar los correos electrónicos, entre otras cosas.&lt;br /&gt;&lt;br /&gt;A continuación se muestra un ejemplo de codificación en Base 64.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_q551Ajwo8ak/RqnXpMIS9CI/AAAAAAAAACU/l9uanRVkQKQ/s1600-h/Base64.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5091837956349686818" src="http://2.bp.blogspot.com/_q551Ajwo8ak/RqnXpMIS9CI/AAAAAAAAACU/l9uanRVkQKQ/s320/Base64.jpg" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Para usar Base 64 en C se puede optar por hacerlo a través de una librería como openssl o por implementar directamente el algoritmo. Veremos los dos casos.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Base 64 y OpenSSL:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Para usar Base 64 desde la librería OpenSSL debemos incluir la cabecera "openssl/evp.h". Las funciones que nos pemiten codificar y descodificar B64 son EVP_EncodeBlock() y EVP_DecodeBlock(), respectivamente.&lt;br /&gt;A continuación aparecen dos funciones: base64_encode() y base64_decode(). Ambas reciben como parámetro la cadena a codificar o descodificar y su longitud, y retornan una cadena con el resultado. Esta cadena apunta a una zona de memoria reservada con malloc(), por lo que queda en manos del programador liberarla.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;unsigned char *base64_encode (unsigned char *buffer, unsigned int len)&lt;br /&gt;{                                                                         &lt;br /&gt;unsigned char *ret = (unsigned char *) malloc ((((len+2)/3)*4)+1);&lt;br /&gt;EVP_EncodeBlock (ret, buffer, len);&lt;br /&gt;ret[(((len+2)/3)*4)] = 0;&lt;br /&gt;return ret;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;unsigned char *base64_decode (unsigned char *buffer, unsigned int *len)&lt;br /&gt;{                                                                         &lt;br /&gt;unsigned char *ret = (unsigned char *) malloc (((strlen(buffer)+3)/4)*3);&lt;br /&gt;*len = EVP_DecodeBlock (ret, buffer, strlen(buffer));&lt;br /&gt;return ret;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Una implementación de Base 64:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Existen muchas implementaciones del algoritmo usado para codificar y descodificar en Base 64. A continuación pego una de Christophe Devine que se encuentra licenciada bajo GPL.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="Cpp" name="code"&gt;/**&lt;br /&gt;* \file base64.h&lt;br /&gt;*/&lt;br /&gt;#ifndef _BASE64_H&lt;br /&gt;#define _BASE64_H&lt;br /&gt;&lt;br /&gt;#ifdef __cplusplus&lt;br /&gt;extern "C" {&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;#define ERR_BASE64_BUFFER_TOO_SMALL             0x0010&lt;br /&gt;#define ERR_BASE64_INVALID_CHARACTER            0x0012&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* \brief          Encode a buffer into base64 format&lt;br /&gt;*&lt;br /&gt;* \param dst      destination buffer&lt;br /&gt;* \param dlen     size of the buffer (updated after call)&lt;br /&gt;* \param src      source buffer&lt;br /&gt;* \param slen     amount of data to be encoded&lt;br /&gt;*&lt;br /&gt;* \return         0 if successful, or ERR_BASE64_BUFFER_TOO_SMALL.&lt;br /&gt;*                 *dlen is always updated to reflect to amount of&lt;br /&gt;*                 data that was written (or would have been written)&lt;br /&gt;*&lt;br /&gt;* \note           Call this function with *dlen = 0 to obtain the&lt;br /&gt;*                 required buffer size in *dlen&lt;br /&gt;*/&lt;br /&gt;int base64_encode( unsigned char *dst, int *dlen,&lt;br /&gt;unsigned char *src, int  slen );&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* \brief          Decode a base64-formatted buffer&lt;br /&gt;*&lt;br /&gt;* \param dst      destination buffer&lt;br /&gt;* \param dlen     size of the buffer (updated after call)&lt;br /&gt;* \param src      source buffer&lt;br /&gt;* \param slen     amount of data to be decoded&lt;br /&gt;*&lt;br /&gt;* \return         0 if successful, ERR_BASE64_BUFFER_TOO_SMALL, or&lt;br /&gt;*                 ERR_BASE64_INVALID_DATA if an invalid char is found.&lt;br /&gt;*                 *dlen is always updated to reflect to amount of&lt;br /&gt;*                 data that was written (or would have been written)&lt;br /&gt;*&lt;br /&gt;* \note           Call this function with *dlen = 0 to obtain the&lt;br /&gt;*                 required buffer size in *dlen&lt;br /&gt;*/&lt;br /&gt;int base64_decode( unsigned char *dst, int *dlen,&lt;br /&gt;unsigned char *src, int  slen );&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* \brief          Checkup routine&lt;br /&gt;*&lt;br /&gt;* \return         0 if successful, or 1 if the test failed&lt;br /&gt;*/&lt;br /&gt;int base64_self_test( int verbose );&lt;br /&gt;&lt;br /&gt;#ifdef __cplusplus&lt;br /&gt;}&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;*  RFC 1521 base64 encoding/decoding&lt;br /&gt;*&lt;br /&gt;*  Copyright (C) 2006-2007  Christophe Devine&lt;br /&gt;*&lt;br /&gt;*  This library is free software; you can redistribute it and/or&lt;br /&gt;*  modify it under the terms of the GNU Lesser General Public&lt;br /&gt;*  License, version 2.1 as published by the Free Software Foundation.&lt;br /&gt;*&lt;br /&gt;*  This library is distributed in the hope that it will be useful,&lt;br /&gt;*  but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU&lt;br /&gt;*  Lesser General Public License for more details.&lt;br /&gt;*&lt;br /&gt;*  You should have received a copy of the GNU Lesser General Public&lt;br /&gt;*  License along with this library; if not, write to the Free Software&lt;br /&gt;*  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,&lt;br /&gt;*  MA  02110-1301  USA&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#ifndef _CRT_SECURE_NO_DEPRECATE&lt;br /&gt;#define _CRT_SECURE_NO_DEPRECATE 1&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;#include "xyssl/base64.h"&lt;br /&gt;&lt;br /&gt;static const int base64_enc_map[64] =&lt;br /&gt;{&lt;br /&gt;'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',&lt;br /&gt;'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',&lt;br /&gt;'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',&lt;br /&gt;'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',&lt;br /&gt;'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',&lt;br /&gt;'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',&lt;br /&gt;'8', '9', '+', '/'&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;static const int base64_dec_map[128] =&lt;br /&gt;{&lt;br /&gt;127, 127, 127, 127, 127, 127, 127, 127, 127, 127,&lt;br /&gt;127, 127, 127, 127, 127, 127, 127, 127, 127, 127,&lt;br /&gt;127, 127, 127, 127, 127, 127, 127, 127, 127, 127,&lt;br /&gt;127, 127, 127, 127, 127, 127, 127, 127, 127, 127,&lt;br /&gt;127, 127, 127,  62, 127, 127, 127,  63,  52,  53,&lt;br /&gt;54,  55,  56,  57,  58,  59,  60,  61, 127, 127,&lt;br /&gt;127,  64, 127, 127, 127,   0,   1,   2,   3,   4,&lt;br /&gt;5,   6,   7,   8,   9,  10,  11,  12,  13,  14,&lt;br /&gt;15,  16,  17,  18,  19,  20,  21,  22,  23,  24,&lt;br /&gt;25, 127, 127, 127, 127, 127, 127,  26,  27,  28,&lt;br /&gt;29,  30,  31,  32,  33,  34,  35,  36,  37,  38,&lt;br /&gt;39,  40,  41,  42,  43,  44,  45,  46,  47,  48,&lt;br /&gt;49,  50,  51, 127, 127, 127, 127, 127&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* Encode a buffer into base64 format&lt;br /&gt;*/&lt;br /&gt;int base64_encode( unsigned char *dst, int *dlen,&lt;br /&gt;unsigned char *src, int  slen )&lt;br /&gt;{&lt;br /&gt;int i, n;&lt;br /&gt;int C1, C2, C3;&lt;br /&gt;unsigned char *p;&lt;br /&gt;&lt;br /&gt;if( slen == 0 )&lt;br /&gt;return( 0 );&lt;br /&gt;&lt;br /&gt;n = ( slen &amp;lt;&amp;lt; dlen =" n" n =" (" i =" 0," p =" dst;" c1 =" *src++;" c2 =" *src++;" c3 =" *src++;"&amp;gt;&amp;gt; 2 ) &amp;amp; 0x3F];&lt;br /&gt;*p++ = base64_enc_map[((( C1 &amp;amp;  3 ) &amp;lt;&amp;lt;&amp;gt;&amp;gt; 4 )) &amp;amp;amp;amp;amp;amp;amp; 0x3F];&lt;br /&gt;*p++ = base64_enc_map[((( C2 &amp;amp; 15 ) &amp;lt;&amp;lt;&amp;gt;&amp;gt; 6 )) &amp;amp;amp;amp;amp;amp;amp; 0x3F];&lt;br /&gt;*p++ = base64_enc_map[C3 &amp;amp; 0x3F];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if( i &amp;lt; c1 =" *src++;" c2 =" ((i"&amp;gt;&amp;gt; 2 ) &amp;amp; 0x3F];&lt;br /&gt;*p++ = base64_enc_map[((( C1 &amp;amp; 3 ) &amp;lt;&amp;lt;&amp;gt;&amp;gt; 4 )) &amp;amp;amp;amp;amp;amp;amp; 0x3F];&lt;br /&gt;*p++ = ((i + 1) &amp;lt; dlen =" p" p =" 0" i =" j" n =" 0;"&amp;gt;= 2 &amp;amp;&amp;amp;&lt;br /&gt;src[i] == '\r' &amp;amp;&amp;amp; src[i + 1] == '\n' )&lt;br /&gt;continue;&lt;br /&gt;&lt;br /&gt;if( src[i] == '\n' )&lt;br /&gt;continue;&lt;br /&gt;&lt;br /&gt;if( src[i] == '=' &amp;amp;&amp;amp; ++j &amp;gt; 2 )&lt;br /&gt;return( ERR_BASE64_INVALID_CHARACTER );&lt;br /&gt;&lt;br /&gt;if( src[i] &amp;gt; 127 || base64_dec_map[src[i]] == 127 )&lt;br /&gt;return( ERR_BASE64_INVALID_CHARACTER );&lt;br /&gt;&lt;br /&gt;if( base64_dec_map[src[i]] &amp;lt; n ="=" n =" ("&amp;gt;&amp;gt; 3;&lt;br /&gt;&lt;br /&gt;if( *dlen &amp;lt; dlen =" n;" j =" 3," n =" x" p =" dst;"&amp;gt; 0; i--, src++ )&lt;br /&gt;{&lt;br /&gt;if( *src == '\r' || *src == '\n' )&lt;br /&gt;continue;&lt;br /&gt;&lt;br /&gt;j -= ( base64_dec_map[*src] == 64 );&lt;br /&gt;x  = ( x &amp;lt;&amp;lt; n ="=" n =" 0;"&amp;gt;&amp;gt; 16 );&lt;br /&gt;if( j &amp;gt; 1 ) *p++ = (unsigned char) ( x &amp;gt;&amp;gt; 8 );&lt;br /&gt;if( j &amp;gt; 2 ) *p++ = (unsigned char )  x;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;*dlen = p - dst;&lt;br /&gt;&lt;br /&gt;return( 0 );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static const char _base64_src[] = "_base64_src";&lt;br /&gt;&lt;br /&gt;#if defined(SELF_TEST)&lt;br /&gt;&lt;br /&gt;#include &lt;string.h _moz-userdefined=""&gt;&lt;br /&gt;#include &lt;stdio.h _moz-userdefined=""&gt;&lt;br /&gt;&lt;br /&gt;static const unsigned char base64_test_dec[64] =&lt;br /&gt;{&lt;br /&gt;0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,&lt;br /&gt;0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,&lt;br /&gt;0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,&lt;br /&gt;0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,&lt;br /&gt;0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,&lt;br /&gt;0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,&lt;br /&gt;0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,&lt;br /&gt;0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;static const unsigned char base64_test_enc[] =&lt;br /&gt;"JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK"&lt;br /&gt;"swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==";&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;* Checkup routine&lt;br /&gt;*/&lt;br /&gt;int base64_self_test( int verbose )&lt;br /&gt;{&lt;br /&gt;int len;&lt;br /&gt;unsigned char *src, buffer[128];&lt;br /&gt;&lt;br /&gt;if( verbose != 0 )&lt;br /&gt;printf( "  Base64 encoding test: " );&lt;br /&gt;&lt;br /&gt;len = sizeof( buffer );&lt;br /&gt;src = (unsigned char *) base64_test_dec;&lt;br /&gt;&lt;br /&gt;if( base64_encode( buffer, &amp;amp;len, src, 64 ) != 0 ||&lt;br /&gt;memcmp( base64_test_enc,  buffer, 88 ) != 0 )&lt;br /&gt;{&lt;br /&gt;if( verbose != 0 )&lt;br /&gt;printf( "failed\n" );&lt;br /&gt;&lt;br /&gt;return( 1 );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if( verbose != 0 )&lt;br /&gt;printf( "passed\n  Base64 decoding test: " );&lt;br /&gt;&lt;br /&gt;len = sizeof( buffer );&lt;br /&gt;src = (unsigned char *) base64_test_enc;&lt;br /&gt;&lt;br /&gt;if( base64_decode( buffer, &amp;amp;len, src, 88 ) != 0 ||&lt;br /&gt;memcmp( base64_test_dec,  buffer, 64 ) != 0 )&lt;br /&gt;{&lt;br /&gt;if( verbose != 0 )&lt;br /&gt;printf( "failed\n" );&lt;br /&gt;&lt;br /&gt;return( 1 );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if( verbose != 0 )&lt;br /&gt;printf( "passed\n\n" );&lt;br /&gt;&lt;br /&gt;return( 0 );&lt;br /&gt;}&lt;br /&gt;#else&lt;br /&gt;int base64_self_test( int verbose )&lt;br /&gt;{&lt;br /&gt;return( 0 );&lt;br /&gt;}&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#endif /* base64.h */&lt;/stdio.h&gt;&lt;/string.h&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;string.h _moz-userdefined=""&gt;&lt;stdio.h _moz-userdefined=""&gt;&lt;br /&gt;&lt;/stdio.h&gt;&lt;/string.h&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referencias:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://es.wikipedia.org/wiki/Base64"&gt;http://es.wikipedia.org/wiki/Base64&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://xyssl.org/code/source/base64"&gt;http://xyssl.org/code/source/base64&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.openssl.org/"&gt;OpenSSL&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-1474955888788699708?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/1474955888788699708/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=1474955888788699708' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1474955888788699708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/1474955888788699708'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2007/05/codificacin-base-64.html' title='Codificación Base 64'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_q551Ajwo8ak/RqnXpMIS9CI/AAAAAAAAACU/l9uanRVkQKQ/s72-c/Base64.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-8384707248392163704</id><published>2007-07-28T15:46:00.001+02:00</published><updated>2012-01-19T23:51:21.722+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enigmas'/><title type='text'>El manuscrito Voynich</title><content type='html'>&lt;div align="justify"&gt;El manuscrito Voynich es un libro ilustrado escrito, en un lenguaje incomprensible, hace más de 500 años. El nombre de dicho manuscrito proviene de &lt;a href="http://en.wikipedia.org/wiki/Wilfrid_M._Voynich"&gt;Wilfrid M. Voynich&lt;/a&gt;, quien lo adquirió en 1912. Aunque ha sido objeto de estudio  demuchos criptógrafos, nadie ha podido descifrar absolutamente nada. Existe la teoría de que el manuscrito Voynich no es más que un fraude, pero aun así, sigue siendo uno de los enigmas sin resolver más conocidos de la criptografía.&lt;/div&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_q551Ajwo8ak/RqSyL8IS9AI/AAAAAAAAACE/sU4WVLwFuHY/s1600-h/Voynich.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5090389397024732162" src="http://4.bp.blogspot.com/_q551Ajwo8ak/RqSyL8IS9AI/AAAAAAAAACE/sU4WVLwFuHY/s320/Voynich.jpg" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://www.voynich.net/images.html"&gt;Images from the Voynich Manuscript&lt;/a&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Se han realizado análisis del texto que muestran patrones similares a las de los lenguajes conocidos. Por ejemplo, la entropía es similar a la de lenguas como el latín o el inglés. Algunas palabras aparecen solo en ciertas secciones, mientras que otras aparecen repetidas una y otra vez a lo largo de todo el manuscrito. Sin embargo existen algunos aspectos del texto que lo hacen diferenciarse de los lenguajes europeos, como por ejemplo, el número de letras de longitud de las palabras. En cualquier caso, si se trata de un montaje, sin duda es un trabajo meticuloso.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Referencias:&lt;br /&gt;- &lt;a href="http://es.wikipedia.org/wiki/Manuscrito_Voynich"&gt;http://es.wikipedia.org/wiki/Manuscrito_Voynich&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://manuscritovoynich.blogspot.com/"&gt;http://manuscritovoynich.blogspot.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8201731322115542179-8384707248392163704?l=dlerch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dlerch.blogspot.com/feeds/8384707248392163704/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8201731322115542179&amp;postID=8384707248392163704' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8384707248392163704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8201731322115542179/posts/default/8384707248392163704'/><link rel='alternate' type='text/html' href='http://dlerch.blogspot.com/2007/07/el-manuscrito-voynich.html' title='El manuscrito Voynich'/><author><name>Daniel Lerch</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_q551Ajwo8ak/RqSyL8IS9AI/AAAAAAAAACE/sU4WVLwFuHY/s72-c/Voynich.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8201731322115542179.post-4169799668524572968</id><published>2007-07-22T18:06:00.001+02:00</published><updated>2012-01-19T23:34:48.176+01:00</updated><title type='text'>Modos de cifrado: ECB, CBC, CTR, OFB y CFB.</title><content type='html'>&lt;div style="text-align: justify;"&gt;Los algoritmos de cifrado de bloque como DES o AES separan el mensaje en pedazos de tamaño fijo, por ejemplo de 64 o 128 bits. La forma en que se gestionan estos pedazos o bloques de mensaje, se denomina "modo de cifrado". Existen muchos modos de cifrado diferentes, a continuación hablaremos de los más importantes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ECB - Electronic Code Book Mode:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;ECB ha sido estandarizado por el NIST (U.S. National Institute for Standards and Technology). Este modo de cifrado es el más simple de todos, pues se limita a partir el mensaje en bloques y cifrarlos por separado.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_q551Ajwo8ak/RqDjRCHStZI/AAAAAAAAAAs/4ymyk3hVuec/s1600-h/Ecb_encryption.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5089317460693398930" src="http://1.bp.blogspot.com/_q551Ajwo8ak/RqDjRCHStZI/AAAAAAAAAAs/4ymyk3hVuec/s320/Ecb_encryption.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_q551Ajwo8ak/RqDkZSHStbI/AAAAAAAAAA8/DU3GeX8kiGo/s1600-h/Ecb_decryption.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" bord
