Ir al contenido
Pacman

Snakecode, sencillo motor de cifrado en python.

Recommended Posts

Hola a tod@s, me gustaría compartir con vosotros un pequeño código que escribí llamado snakecode, un sencillo motor de cifrado ideado por mi.

 

A cada letra se le asigna una contraseña en decimal, por ejemplo 87, después se generan números aleatorios cuyas cifras sumen 87, con un número expecífico de cifras, por ejemplo.

A=54
N=78

Numero de cifras= 20 (este valor es modificable, y es lo que le da cierta "seguridad" al algoritmo)

Esto, me genera para A 10 posibles números de 20 cifras cuyas cifras suman 54:

31706939100402030051
52038006011123216265
10409351006800097001
11240783015532034311
11604135400050094830
50856331022112540114
16500223212451129323
33030134483501075121
31271042080542207402
60409023363920110203

Y para N, otros 10 posibles números de 20 cifras que suman 78:

60523332883840472064
13071392290003775739
61963260910480616046
30774401568821406561
93473382829210411731
42150264442662226479
27601108413968813451
34644873104047405644
10948108933719004506
24248793022440718470

Por lo tanto, el mensaje "ANA", podría ser:

31706939100402030051934733828 29210411731604090233639201102 03

o cualquier combinación, ya que lo importante no es el número en si, si no lo que sumen sus cifras, para descifrarlo, solo tendrías que dividir los números de 20 en 20, sumar los números y comparar.

# -*- encoding: utf-8 -*-

#snakecode is free software: you can redistribute it and/or modify
   # it under the terms of the GNU General Public License as published by
    #the Free Software Foundation, either version 3 of the License, or
    #(at your option) any later version.

    #SnakeCode is distributed in the hope that it will be useful,
    #but WITHOUT ANY WARRANTY; without even the implied warranty of
    #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #GNU General Public License for more details.
    #
    #You should have received a copy of the GNU General Public License
   # along with this program.  If not, see <http://www.gnu.org/licenses/>.


#constantes

maxr=120
minr=60

import random

#Devuelve la suma de las cifras de un numero

def suma(numero):

	resultado=0
	while numero>0:
		resultado+=numero%10
		numero/=10
	return resultado

#Genera una lista con Z numeros aleatorios de X cifras, cuyas cifras sumen Y cantidad

def generador_aleatorio(numero_de_suma, numero_de_cifras, cantidad_de_numeros):
	max=""
	min="1"
	lista_numeros=[]

	for x in range(0, numero_de_cifras):
		max+="9"
	for x in range(1, numero_de_cifras):
		min+="0"

	while cantidad_de_numeros>0:
		var=random.randint(int(min), int(max))
		if suma(var)==numero_de_suma and lista_numeros.count(var)==0:
			cantidad_de_numeros-=1
			lista_numeros.append(var)
			print var
	return lista_numeros

# Genera una clave optimizada automáticamente devolviendo una lista, esa lista puede ser utilizada posteriormente al inicializar el motor con init

def generar_clave(nc):

	maximo=nc*maxr/20
	minimo=nc*minr/20

	pass_random=[]
	
	while len(pass_random)<28:

		var=random.randrange(minimo, maximo)
		if pass_random.count(var)==0:
			pass_random.append(var)

	return pass_random

# Inicializa el motor, el primer parámetro es el numero de cifras y el segundo es la lista que contiene la clave, ambos parametros imprescindibles para cifrar y descifrar con exito, el tercer parámetro, que es opcional, es la cantidad de numeros por letra generados.

def init(nc, lista, nn=20):
 
	global claves
	global letras	
	global numero_cifras
	numero_cifras=nc

	claves={}
	letras=( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "ñ", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", " ")
	for y in range(0, 28):
		print "inicializando letra ", letras[y]
		claves[letras[y]]=generador_aleatorio(int(lista[y]), nc, nn)

	print "se ha generado la clave", lista, "con un numero de cifras de", nc

				
#Devuelve un texto cifrado pasandole un texto en claro

def cifrar(texto):

	cifrado=""
	for x in texto:
		
		cifrado+=str(random.choice(claves[x]))
	
	return cifrado
	
#Devuelve un texto en claro pasandole un texto cifrado

def descifrar(cifrado):

	separado=[]
	for x in range(0, len(cifrado), numero_cifras):

		separado.append(cifrado[x:x+numero_cifras])
	
	texto=""
	
	for x in separado:
		for y in claves:

			if suma(int(x))==suma(int(claves[y][0])):

				texto+=y

	return texto

Para usarlo primero importais el modulo con "import snakecode", luego generais una clave aleatoria con la funcion generar_clave() a la cual se le debe pasar el numero de cifras a utilizar, ejemplo "mi_clave=snakecode.generar_clave(25)" genera una clave optimizada para generar numeros de 25 cifras, cuando tenemos dicha clave debemos de inicializar el motor, es decir, generar todos los numeros aleatorios de X cifras que se usarán para cifrar y descifrar, para ello "snakecode.init(25, mi_clave)", el primer argumento es el numero de cifras que hemos especificado antes al generar la clave, y el otro argumento es la clave generada, despues de todo el proceso ya podremos cifrar y descifrar con "cifrado=snakecode.cifrar("hola mundo") y descifrar con "snakecode.descifrar(cifrado)", evidentemente la otra persona que tenga que descifrar el mensaje, en vez de crear una clave aleatoria en el primer paso,debe de especificar la misma clave con la que se cifró originalmente (si no vaya guasa XD), cabe mencionar que dicha clave es una lista, así que sería de la siguiente forma "mi_clave=[65, 96, 67, 97, 75, 100, 113, 109, 95, 105, 114, 73, 103, 90, 116, 119, 115, 81, 60, 101, 93, 118, 83, 72, 66, 86, 62, 89]" el resto del proceso es exactamente igual.

 

Podeis descargar tanto el código fuente en .tar como un .deb para debian y derivados como un .pkg.tar.xz para archlinux en mi página web http://www.hispagnu.no-ip.org

 

Saludos y espero que os guste.

Editado por elmoyer

Compartir este post


Enlace al post
Compartir en otros sitios

Yo estoy un poco verde todavía con el tema de python, todo lo que sabia se me ha olvidado :(

 

Al importarlo me da SyntaxError: Non-ASCII character  en la linea 63, donde declaras la variable letras...

 

No te olvides de copiar la primera linea, la de:

# -*- encoding: utf-8 -*-

Compartir este post


Enlace al post
Compartir en otros sitios

 

Yo estoy un poco verde todavía con el tema de python, todo lo que sabia se me ha olvidado :(

 

Al importarlo me da SyntaxError: Non-ASCII character  en la linea 63, donde declaras la variable letras...

 

No te olvides de copiar la primera linea, la de:

# -*- encoding: utf-8 -*-

Era justo eso, gracias!

Compartir este post


Enlace al post
Compartir en otros sitios

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invitado
Responder en este tema...

×   Has incluido contenido con formato.   Eliminar formato

  Sólo se permiten 75 emoticonos como máximo.

×   Tu enlace ha sido insertado automáticamente.   Deshacer y mostrar como enlace

×   Su contenido anterior ha sido restaurado.   Limpiar editor

×   No puedes pegar imágenes directamente. Súbelas a algún hosting de imágenes y pega la dirección URL


×
×
  • Crear Nuevo...