Me voy a salir un poco de tema para recomendar un programa de "arte generativo", Evolvotron, lo que hace es mostrar al usuario unas imágenes de la que tiene que seleccionar una, así continuamente para encontrar con un algoritmo genético una imágen a gusto del usuario (requiere un poco de paciencia para cojerle el truco), la única parte mala es que según la web parece que no funciona en el SO de Microsoft (aunque es GPL y usa Qt y BOOST, no debería ser difícil portarlo).
Y con un poco de paciencia acabas con un wallpaper o con una galería como esta[ gigrafx - deviantart ]
Enfin, que si andais aburridos ya teneis que hacer :P
miércoles, 30 de marzo de 2011
lunes, 28 de marzo de 2011
Programa para manejar archivos .torrent
La idea era escribir un programa que manejara archivos .torrent ( añadir, modificar y eliminar datos ) y de paso un mini-libreria ( tres archivos ).
Por partes, aquí está el código [ btcat.zip ], se compila con make o compilando directamente btcat.c
Los argumentos son estos:
./btcat -f <file> -l [-b]
./btcat -f <file> -e <element> {-s|-a <type>|-r|-m <value>} -o <output> [-b]
./btcat -n -o <output>
./btcat -h
-h: Shows this help
-l: Lists the *.torrent file content
-s: Shows an element
-r: Deletes an element
-a: Adds an element
-n: Creates a new file
Types:
d: Dictionary
l: List
i: Integer
s: String
Note: Dictionaries and lists ignore the value
-m: Modify an element
-e: File element
-o: Output file
-b: Shows also the binary information
-f: Set's the target file
Por partes, aquí está el código [ btcat.zip ], se compila con make o compilando directamente btcat.c
Los argumentos son estos:
./btcat -f <file> -l [-b]
./btcat -f <file> -e <element> {-s|-a <type>|-r|-m <value>} -o <output> [-b]
./btcat -n -o <output>
./btcat -h
-h: Shows this help
-l: Lists the *.torrent file content
-s: Shows an element
-r: Deletes an element
-a: Adds an element
-n: Creates a new file
Types:
d: Dictionary
l: List
i: Integer
s: String
Note: Dictionaries and lists ignore the value
-m: Modify an element
-e: File element
-o: Output file
-b: Shows also the binary information
-f: Set's the target file
Etiquetas:
bittorrent,
C,
torrent
jueves, 24 de marzo de 2011
Comprobación de números primos con el FIPS186
Que no se diga, aquí está el código del algoritmo y una comprobación para ver el número de falsos positivos y negativos:
Por ejemplo:
Primos: 1225
Falsos negativos: 608
Falsos positivos: 0
ps: se me pasó poner la licencia, como siempre está bajo WTFPL
Saludos
Por ejemplo:
Primos: 1225
Falsos negativos: 608
Falsos positivos: 0
ps: se me pasó poner la licencia, como siempre está bajo WTFPL
Saludos
Etiquetas:
python
miércoles, 23 de marzo de 2011
Introduccion a la criptografia, con Python: DSA (V -2)
Después de 8 meses de demorar el momento de enfrentarse a DSA, continúa esta introducción a la criptografía ( aaaleluyaaaa... )
Pues seguimos con la introduccion a la criptografia... acababamos de ver el cifrado usando ElGamal y quedaba pendiente el algoritmo de firmado usando DSA para pasar a la sexta parte ( hashes de nuevo ), así que ahí vamos, documentación y código intercalado:
Pues seguimos con la introduccion a la criptografia... acababamos de ver el cifrado usando ElGamal y quedaba pendiente el algoritmo de firmado usando DSA para pasar a la sexta parte ( hashes de nuevo ), así que ahí vamos, documentación y código intercalado:
Etiquetas:
cifrado asimetrico,
DSA,
introduccion a la criptografia,
python
Obtener el número de bits de un número en Python [tip]
Perdón a los que les estoy rallando con esto de los tips, son cosas que cuando no se te ocurren no sabes de donde sacarlas, pero ya escritas son simples y obvias, sin más dilación:
def bitN(i):
return len(bin(i)[2:])
Me explico, se pasa a binario bin(i), se separa el número del indicador de formato [2:] (0b) y se muestra su longitud len( )
Saludos
def bitN(i):
return len(bin(i)[2:])
Me explico, se pasa a binario bin(i), se separa el número del indicador de formato [2:] (0b) y se muestra su longitud len( )
Saludos
martes, 22 de marzo de 2011
Humo y espejos con el terminal y `cat`
Cross-posteado en el blog de HackXCrack
Si alguna vez se te ocurrió lanzar un cat a un archivo que no fuera de texto, como una imágen o un ejecutable hay ciertas posibilidades de que notaras que había pasado algo raro cuando el comando volvió, el terminal "pensó" que habías escrito algunos caracteres... es más, si pulsaste [enter] para pasar a una línea limpia pensando que solo es basura que dejó el archivo, el terminal había intentado ejecutar el comando!
Me atreveré a decir que lo que pasó fue que en algún momento el cat mostró el par de caracteres \x1b Z ( \x1b es ESC ), mostrando algo como "62;9;c", hay más combinaciones que producen estos eventos pero esta, por ser la más corta, es la que tiene más probabilidades de darse por casualidad.
Todo esto viene porque el terminal emula un procolo antiguo, que acepta ciertas combinaciones de datos como caracteres de control (algo similar era en lo que se basaba el phreaking analógico :P ), aprovechando esto y esperando que el usuario también pulse instintivamente [enter] para pasar a una línea en blanco intentaremos que el usuario que lea un archivo ejecute un comando :), aunque la verdad sea dicha, estamos muy limitados.
Nota: aquí hablo del comando cat, pero pasa lo mismo con cualquiera que muestre algo directamente por pantalla, head, tail, un echo preparado o el programa que muestra un archivo que escribiste cuando aprendías.
Nota2: realmente todo esto tiene un motivo, pero si hay que profundizar en el protocolo el día de hoy se nos queda corto, si quieres hecharle un vistazo a sus entrañas revisa los links del final.
Etiquetas:
bash
jueves, 17 de marzo de 2011
Adivina el lenguaje [solución]
Se ve que andamos con poca imaginación hoy, así que mientras tanto aquí va un pequeño reto, a ver si alguien consigue adivinar en que lenguaje esotérico está escrito este código: http://pastebin.com/Lb4qJtjY
Pista: lo que hace el código es mostrar por pantalla CodigoParaLlevar (sin el salto de línea de rigor :P )
Actualización: ya pasó un tiempo, así que esta es la solución
Suerte
Pista: lo que hace el código es mostrar por pantalla CodigoParaLlevar (sin el salto de línea de rigor :P )
Actualización: ya pasó un tiempo, así que esta es la solución
Suerte
Etiquetas:
esoterico
miércoles, 16 de marzo de 2011
Cifrando con autómatas celulares
Hoy traigo un pequeño experimento, este es un cifrado que se basa en el mismo concepto que otro código anterior [ Un autómata celular para generar números pseudo-aleatorios ], pero en vez de generar números aleatorios, sirve como cifrado de flujo [ http://pastebin.com/uX1WpGjF ] .
Etiquetas:
automata celular,
cifrado de flujo,
python
lunes, 14 de marzo de 2011
Como monitorear un terminal desde otro [tip]
En el terminal que se quiere monitorear
mkfifo tunel
script -q -f tunel
En el terminal donde se quiere mostrar ( se podría enviar a través de la red o lo que fuera )
cat tunel
Una ventaja (o un inconveniente) es que el que monitorea no puede hacer cambios en el terminal. Por otro lado, si se hace esto, el comando script no devuelve el control hasta que alguien se conecte.
ps: si solo quisieramos guardar las sesiones, sin monitorearlas, solo habría que hacer script -f <archivo de log>
A portarse bien ;)
mkfifo tunel
script -q -f tunel
En el terminal donde se quiere mostrar ( se podría enviar a través de la red o lo que fuera )
cat tunel
Una ventaja (o un inconveniente) es que el que monitorea no puede hacer cambios en el terminal. Por otro lado, si se hace esto, el comando script no devuelve el control hasta que alguien se conecte.
ps: si solo quisieramos guardar las sesiones, sin monitorearlas, solo habría que hacer script -f <archivo de log>
A portarse bien ;)
viernes, 11 de marzo de 2011
Escapando caracteres especiales en Python [tip]
Supongamos que tenemos un texto como este:
def miniscape(s):
return str([s])[2:-2]
Resultado:
\nBla\nblablabla\\ /\nblabla\n
Y para darle la vuelta?
def miniunscape(s):
i = 0
while True:
try:
x = s.index("\\x", i)
if not((x > 0) and (s[x-1] == "\\")):
s = s[:x]+chr(int(s[x+2:x+4],16))+s[x+4:]
i = x + 1
except:
break
reptable = [("\\\\","\\"),("\\n","\n"),("\\'","'"),("\\a","\a"),
("\\b","\b"),("\\f","\f"),("\\r","\r"),("\\t","\t"),
("\\v","\v")]
for r in reptable:
i = 0
while True:
try:
x = s.index(r[0], i)
if not((x > 0) and (s[x-1] == "\\")):
s = s[:x]+r[1]+s[x+2:]
i = x + 1
except:
break
return s
En pastebin [ http://pastebin.com/5uvf3tBK ]
Y ya está, nos vemos
BlaY queremos representarlo todo en una línea sin perder información, como hacerlo?
blablabla\ /
blabla
def miniscape(s):
return str([s])[2:-2]
Resultado:
\nBla\nblablabla\\ /\nblabla\n
Y para darle la vuelta?
def miniunscape(s):
i = 0
while True:
try:
x = s.index("\\x", i)
if not((x > 0) and (s[x-1] == "\\")):
s = s[:x]+chr(int(s[x+2:x+4],16))+s[x+4:]
i = x + 1
except:
break
reptable = [("\\\\","\\"),("\\n","\n"),("\\'","'"),("\\a","\a"),
("\\b","\b"),("\\f","\f"),("\\r","\r"),("\\t","\t"),
("\\v","\v")]
for r in reptable:
i = 0
while True:
try:
x = s.index(r[0], i)
if not((x > 0) and (s[x-1] == "\\")):
s = s[:x]+r[1]+s[x+2:]
i = x + 1
except:
break
return s
En pastebin [ http://pastebin.com/5uvf3tBK ]
Y ya está, nos vemos
miércoles, 2 de marzo de 2011
[Cheatsheet] de variables inseguras en PHP
Hoy algo de carne, una chuleta sobre las variables superglobales (woh!) no fiables, donde el cliente puede meter mano:
Etiquetas:
cheatsheet,
php,
seguridad
Suscribirse a:
Entradas (Atom)
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import random
""" FIPS186
Step 1. Set i = 1 and n > or = to 50.
Step 2. Set w = the integer to be tested, w = 1 + 2 a m, where m is odd and 2 a is m, where m is odd and 2 is the largest power of 2 dividing w - 1
Step 3. Generate a random integer b in the range 1 < b < w
Step 4. Set j = 0 and z = b**m mod w mod w
Step 5. If j = 0 and z = 1, or if z = w - 1, go to step 9
Step 6. If j > 0 and z = 1, go to step 8
Step 7. j = j + 1. If j < a, set z = z 2 mod w and go to step 5 mod w and go to step 5
Step 8. w is not prime. Stop.
Step 9. If i < n, set i = i + 1 and go to step 3. Otherwise, w is probably prime
"""
from math import sqrt
# Comprobación real
def rchk(n):
for i in xrange(2,int(sqrt(n))+1):
if not n % i:
return False
return True
# Especificada en el FIPS186
def chkprime(w, n = 50):
m = w-1
a = 0
while not m & 1:
m >>= 1
a += 1
i = 0
while True:
b = random.randint(2, w-1)
j = 0
while True:
z = (b**m) % w
if ( j == 0 and z == 1) or \
z == w-1:
if (i<n):
i += 1
break
else:
return True
if j > 0 and z == 1:
return False
j += 1
if j < a:
z = ( z * z ) % w
else:
return False
fn = 0
fp = 0
pr = 0
inicio = 10
fin = 10000
import sys
for i in xrange(inicio,fin):
c = chkprime(i)
r = rchk(i)
if not i%100:
sys.stdout.write("\r"+str(i)+" "+str(pr))
sys.stdout.flush()
if c:
pr += 1
if c != r:
if c:
fp += 1
pr -= 1
else:
fn += 1
pr += 1
print ""
print "Primos:", pr
print "Falsos negativos:", fn
print "Falsos positivos:", fp