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:

!/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

Introducción 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:

¿Que es DSA? DSA (Digital Signature Algorithm, en español Algoritmo de Firma digital) es un estándar del Gobierno Federal de los Estados Unidos de América o FIPS para firmas digitales. Fue un Algoritmo propuesto por el Instituto_Nacional_de_Normas_y_Tecnología de los Estados Unidos para su uso en su Estándar de Firma Digital(DSS), especificado en el FIPS 186. DSA se hizo público el 30_de_agosto de 1991, este algoritmo como su nombre lo indica, sirve para firmar y no para cifrar información. Una desventaja de este algoritmo es que

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

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.

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

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 ] .

La idea es simple, se toma un campo de la variante "3-4 life" ya que genera patrones mas caóticos, se le introduce una figura que se sabe que se expande rápidamente [ http://videobin.org/+2be/2ly.html ], se avanza 200 generaciones, se hace XOR de las céldas y una clave ( cada celda con un bit de la clave ), y se vuelve a avanzar 75 generaciones.

Después los bits de cada estado hacen XOR con los bits correspondientes del archivo, se pasa al estado siguiente cuando se acaben los bits del anterior y se finaliza el programa cuando se haya cifrado todo el archivo.

Nota: Dudo que sea seguro por que, por ejemplo, hay más bits a 0 que a 1, cuando no debería ser así.

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

A portarse bien ;)

Escapando caracteres especiales en Python [tip]

Actuliazación: json is the way

Supongamos que tenemos un texto como este:
Bla
blablabla\ /
blabla

Y queremos representarlo todo en una línea sin perder información, como hacerlo? 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

[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:

Leyenda:

  • [S]: Seguras
  • [I]: Inseguras
  • [D]: Depende...

$_SERVER:

  • PHP_SELF [I]
  • argv [I]
  • argc [S]
  • GATEWAY_INTERFACE [S]
  • SERVER_ADDR [S]
  • SERVER_NAME [S]
  • SERVER_SOFTWARE [S]
  • SERVER_PROTOCOL [I]
  • REQUEST_METHOD [I]
  • REQUEST_TIME [S]
  • QUERY_STRING [S]: Sin comprobar
  • DOCUMENT_ROOT [S]
  • HTTP_ACCEPT [I]
  • HTTP_ACCEPT* [I]
  • HTTP_CONNECTION [I]
  • HTTP_HOST [D]: Inseguro para el host por defecto si hace fallback
  • HTTP_REFERER [I]
  • HTTP_USER_AGENT [I]
  • HTTPS [S]: Sin comprobar
  • REMOTE_ADDR [S]
  • REMOTE_HOST [D]: Inseguro si el atacante tiene acceso al servidor DNS
  • REMOTE_PORT [S]
  • SCRIPT_FILENAME [S]
  • SERVER_ADMIN [S]
  • SERVER_PORT [S]
  • SERVER_SIGNATURE [S]
  • PATH_TRANSLATED [I]
  • SCRIPT_NAME [S]
  • REQUEST_URI [S]
  • PHP_AUTH_DIGEST [I]
  • PHP_AUTH_USER [I]
  • PHP_AUTH_PW [I]
  • AUTH_TYPE [I]: No he podido comprobarlo
  • PATH_INFO [I]
  • ORIG_PATH_INFO [I]: No he podido comprobarlo

Un tracker BitTorrent en un .php y una tabla MySQL

Esto lleva un rato sin actualizar, así que traigo una cosilla que puede resultar interesante, un tracker de BitTorrent que solo ocupa un archivo .php de 250 líneas y que necesita únicamente una tabla en una base de datos MySQL, además logicamente del servidor web [ announce.php ]

Para montar el tracker hay que subirlo con el nombre announce.php al directorio raíz, de forma que quede algo así: http://www.miservidor.com/announce.php y modificar estas variables:

* $dbhost: La dirección del servidor MySQL.

* $dbuser: El usuario del servidor MySQL.

* $dbpass: La contraseña del servidor MySQL.

* $dbname: La base de datos que se utilizará.
*
* $dbtable: El nombre de la tabla.
*

La estructura de la tabla es esta

* Columnas:

  • Peer_id: char(28)
  • info_hash: char(28)
  • port: smallint unsigned
  • uploaded: int(1)
  • downloaded: int(1)
  • to_go: int(1)
  • ip: varchar(15)
  • peer_key: varchar(255)
  • completed: boolean
  • last_update: int(1)
    *
* Claves:

Newer posts Older posts