leer un texto, pasar cada linea a SHA-1 y comprobar occurencias (Pagina 1) / Scripts y programación / Foro Wifi-libre.com

El libre pensamiento para un internet libre

No estas registrado.     

Anuncio

Wifi-highpower.es es distribuidor oficial de Alfa Network

#1 27-09-2015 19:28:19

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 2,051

leer un texto, pasar cada linea a SHA-1 y comprobar occurencias

Buenas tardes.
Abro este post en relación con estos temas :     Technicolor TG 784n v3 (Jazztell_XXXXXX y redes portuguesas "Meo") y Algoritmo "Stkey" de Kevin Devine para routers Speedtouch/Thomson
Mi idea es hacer brute forces con SHA-1.
Necesito algo de velocidad, mas de la que me da bash, así que quiero hacer lo en C o python.
Entonces creo mis listas de "seriales potenciales"  con crunch y lo que quiero hacer es

  1. abrir el diccionario y leerlo liña por liña

  2. Pasar cada liña por SHA-1

  3. Comprobar si tengo una ocurrencia con el pass

Nada muy complicado.
En bash se hace así

while read line; do
[commandos]
done < diccionario.txt

El bucle while para leer un texto liña por liña es la forma optima en bash según he leído,
Me preguntaba si en C era así..
Si alguien con conocimientos en C o phyton pasa por aquí y puede dar consejos y hacer sugestiones, gracias de antemano... Hasta pronto wink

Desconectado

Anuncio

Wifi-highpower.es es distribuidor oficial de Alfa Network

#2 28-09-2015 20:43:03

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 2,051

Re: leer un texto, pasar cada linea a SHA-1 y comprobar occurencias

He mirrado un poco en más y he intetado hacer esto en C y en python
Python es definitivamente mas simple big_smile
Esto es lo que he hecho para leer un texto linea a linea y pasar cada linea a SHA-1
No se si es optimo pero es sin dudas mucho mas rápido que con bash.

import hashlib
with open('/home/kcdtv/Bureau/TGnumeros.txt') as fp:
    for line in fp:
        m = hashlib.sha1()
        m.update(line)
        print m.hexdigest() 

Como lo imaginaba, a la diferencia de bash, se aconseja un bucle de tipo "for" en lugar de un "while". Tiene sentido: el "for" es mas directo y es solo porque bash no es realmente un Lenguaje de programación que es más eficaz leer un texto linea por linea pasando por un bucle while.
Para los novatos quienes, como yo, solo conocen un poco su consola linux y no tienen ni idea de programación, explico lo que he hecho
la primera liña :

import hashlib

Esto es para "importar" (usar) una librería. Se llama hashlib. Es porque nos sirve para generar hashes (md5, SHA-1 etc...)
Es una librería básica que tenemos "de serie" con nuestro python

Luego empleamos el comando with (tengo que echarle un ojo para saber mas precisamente sobre este comando)
Python es mágico y "open" es para abirir un fichero que indicamos a continuación entre paréntesis.
Según lo que intuyo; with va con un "as + algo" y en este caso usamos "fp".

3ra linea : abrimos el clásico bucle "for" cuya estructura es muy simple in idirecta.
Existe en python la "constante" line - que significa linea -  y es perfecta para lo que nos interesa (convertir por sha-1 cada linea de un diccionario, n diccioanrio contiene una palabra por linea y podemos usar "line" directamente)

for line in fp:

Notamos de paso que la "instrucción de cierre" para "declarar nuestra condición de ejecución" son dos puntos (:)

Luego se trata de poner las ordenes que queremos ejecutar cada vez que python lee una linea de nuestro texto.
Lo que queremos hacer es pasar por SHA-1 cada palabra (cada linea ya que usamos un documento de texto igual a un diccionario)

 m = hashlib.sha1()
        m.update(line)
        print m.hexdigest() 

Entonces con

m = hashlib.sha1()

especificamos la función de hash que vamos a emplear sobre "m"

 m.update(line)

generamos el sha-1

print m.hexdigest()

lo imprimimos en pantalla

Algo importante en python : la "indentación" (¿puesta en pagina?)
Como habeís podido notar nuestro bucle for no tiene instr5ucción de cierre
¿Como cerrar nuestro bucle for?
Poniendo una orden al "nivel de for", como aqui:

leer.jpg

A contrario , si no respectamos esta regla, no cerramos nuestro bucle for y la orden se ejecutara a cada linea:

sha12.jpg

Desconectado

#3 06-12-2015 08:49:33

idontcar3
Very Important Usuario

Registrado: 03-08-2015
Mensajes: 11

Re: leer un texto, pasar cada linea a SHA-1 y comprobar occurencias

Disculpa @kcdtv, he estado ocupado y no había hecho login en mucho rato, te hubiera echado la mano con esto...

Pero si te ayudo a hacerlo mas bonito smile

Como saber cuanto tiempo tardo?
Esta informacion puede ser util, ademas... es como bonito mostrarla, no?

from datetime import datetime

import hashlib

# Tick...
tick = datetime.now()

with open('/home/kcdtv/Bureau/TGnumeros.txt') as fp:
    for line in fp:
        m = hashlib.sha1()
        m.update(line)
        print m.hexdigest() 

#Tock.
tock = datetime.now()
diff = tock - tick
print(str(diff.seconds))+' Segundos en total'
print(diff)

añadi estas lineas.

from datetime import datetime
# Tick...
tick = datetime.now()
...

...
#Tock.
tock = datetime.now()
diff = tock - tick
print(str(diff.seconds))+' Segundos en total'
print(diff)

Procedo a explicar.

from datetime import datetime
# Tick...
tick = datetime.now()

la libreria datetime genera objetos datetime (de fecha, hora, tiempo, tu sabes, Años, meses, semanas, dias, horas, minutos, segundos y mas..)

por que se tiene que importar de esa manera?
por que si no la siguiente linea pasaría a ser.

tick = datetime.datetime.now()

No se, algo muy retorcido por sus desarrolladores. pero tendra su razon.

con esa sentencia guardamos una instancia de un objeto datetime, fijado con la hora exacta en que se ejecuto. ejemplo (al momento de escribir esto)

>>> type(tick)
<type 'datetime.datetime'>
>>> print tick
2015-12-06 02:37:09.386000

Luego simplemente repetimos la impresión de la hora y hacemos la matemática.

#Tock.
tock = datetime.now()
# Esto es posible por que son el mismo objeto y se pueden relacionar
diff = tock - tick
print(str(diff.seconds))+' Segundos en total'
print(diff)

Ahora, aca pasa algo interesante.

print(str(diff.seconds)+' Segundos en total')

[*]Hago una llamada a diff.seconds[/*]

diff no es un objeto datetime, es un objeto timedelta. esto quiere decir que es el resultado de una diferencia de objetos datetime.
diff se muestra en formato.

>>> type(diff)
<type 'datetime.timedelta'>
>>> print diff
0:01:01.001000

Al llamar al metodo seconds le estamos pidiendo que nos muestre el tiempo total en segundos.


[*]le aplico el metodo str()[/*]
Al pedirle al objeto timedelta que me de el total en segundos lo devuelve como

>>> type(diff.seconds)
<type 'int'>
>>> print diff.seconds
61
>>>

para poder imprimirlo junto con algun otro texto, en una linea de codigo se debe considerar que el comando

>>> print(diff.seconds+' Segundos en total')

Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    print(diff.seconds+' Segundos en total')
TypeError: unsupported operand type(s) for +: 'int' and 'str'

no puede concatenar objetos de distintos tipos (al menos mezclando str con cualquier otro, en este caso int)

>>> type(str(diff.seconds))
<type 'str'>

al final de la ejecucion mostraria.

61 Segundos en total
0:01:01.001000

NOTA:

# Esta sintaxys es valida para Python 2
print algo
print(algo) #y esta tambien

# Sin embargo para Python 3 se debe escribir de la siguiente manera
print(algo) # Obligatoriamente

Y Bueno ese ha sido mi aporte. con estas sencillas lineas podemos medir el tiempo entre dos puntos. información útil en algunos casos.

Espero que se halla entendido, sea educativo, de ayuda, interesante o cualquier otro calificativo positivo que se le pueda añadir.

sin mas que añadir.
pam

Ultima edición por idontcar3 (06-12-2015 09:12:54)

Desconectado

#4 07-12-2015 14:41:30

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 2,051

Re: leer un texto, pasar cada linea a SHA-1 y comprobar occurencias

¡Muchas gracias! big_smile
Muy bien explicado y instructivo (u otro tipo de calificativo del palo...) wink
¿Sabes que?
Probablemente ( más bien "seguramente") voy a necesitar consejos (ayuda) para hacer un convertidor  base52 <=> hexadecimal
La meta siendo que sea rápido para poder convertir wordlist enteras.
Haré un tema estos días, esta noche misma si tengo tiempo (pero lo dudo, el lunes generalmente voy un poco apurado)
¡Hasta luego !

pam

Desconectado

#5 14-12-2015 10:35:56

idontcar3
Very Important Usuario

Registrado: 03-08-2015
Mensajes: 11

Re: leer un texto, pasar cada linea a SHA-1 y comprobar occurencias

Aclaracion de tu primer post (lo necesita)

kcdtv escribió:

...
Poniendo una orden al "nivel de for", como aqui:
...
import hashlib
with open('/home/kdctv/Bureau/TGnumeros.txt' as fp:
    for line in fp:
        m = hashlib.sha1()
        m.update(line)
        print m.hexdigetst()
    print "fin de bucle"

Esto no quiere decir que yo necesariamente tenga que poner a nivel del ciclo for para que el cierre, recuerda que ya le decimos al ciclo que es lo que interara (en este caso las lineas del documento, una lista finita)

si el codigo fuera.

import hashlib
with open('/home/kdctv/Bureau/TGnumeros.txt' as fp:
    for line in fp:
        m = hashlib.sha1()
        m.update(line)
        print m.hexdigetst()

el programa se ejecutaria como normalmente, solo que al final del ciclo no mostraria el mensaje, finalizaria las lineas y cesaria la ejecucion pues no hay mas que ejecutar

hay veces que necesitas escribirle una sentencia (cuando declaras funciones), si no tienes nada que escribir puedes usar pass

def nueva_funcion()
    # Escribirle el codigo a esta funcion
    pass

Moviendonos al asunto principal.

kcdtv escribió:

... voy a necesitar consejos (ayuda) para hacer un convertidor  base52 <=> hexadecimal...
pam

mira lo que me encontre por alli en la net x_x

http://pydoc.net/Python/BaseHash/2.1.0/basehash/

contiene unas funciones matematicas muy utiles

simplemente hay que replicar la carpeta que ahi muestra (con los dos archivos) en nuestro ordenador, acto seguido crear un archivo (yo le puse main.py) en la misma carpeta donde guardamos la carpeta basehash y jugar un poco con el codigo

>>> from basehash import *
>>> c = base52()
>>> c
<basehash.base52 object at 0x026C8B10>
>>> c.decode('0123456789BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz')
65619590647494106872079167509227825748311557976153772654499440883483291755167717380843L
>>> c.encode("65619590647494106872079167509227825748311557976153772654499440883483291755167717380843")
'123456789BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz'

tambien podrias tomar la definicion de clase base52, la definicion de la clase base, y las funcionas necesarias del archivo prime, pero son varias, cuidado si no son todas, asi que mejor importarlo como muestra el __init__.py


Espero te sirva

pam

Ultima edición por idontcar3 (14-12-2015 10:52:40)

Desconectado

#6 14-12-2015 23:46:58

kcdtv
Administrator

Registrado: 14-11-2014
Mensajes: 2,051

Re: leer un texto, pasar cada linea a SHA-1 y comprobar occurencias

¡Estupendo! ¡Genial! ¡dpm!  smile
Sirve mucho...
...Sería solo por el simple hecho de que se ve claramente la base52 (sabía que era sin las vocales, imaginaba que empezaba por los numeros ... pero no tenía para nada claro si venían primero las mayúsculas o las minúsculas big_smile
Ahora lo que me falta es tiempo para darle fuerte al tema jazztell y con las fiestas que llegan... pero vamos, tiembla 2016, llegamos con fuerza y ganas de darle al martillo pam pam
  big_smile

Desconectado

Anuncio

Wifi-libre.com: El libre pensamiento para un internet libre / Regístrese ahora

Pie de página

Información del usuario

Ultimo usuario registrado: Ike
Usuarios registrados conectados: 1
Invitados conectados: 4

Conectados: Ike

Estadisticas de los foros

Número total de usuarios registrados: 356
Número total de temas: 615
Número total de mensajes: 4,217

Máx. usuarios conectados: 45 el 12-04-2016 12:02:20