Azav Cipher Algorithm

Iniciado por Azav, Octubre 10, 2014, 12:38:57 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

¡Buenas a todos!

Vengo a dejarles aquí un código para encriptar y desencriptar texto. Lo he llamado Azav Cipher, lo he creado completamente yo en Python 3.4

Características del cifrado:
+ No tiene una cantidad máxima de caracteres a encriptar.
+ No usa clave.
+ Para un mismo texto plano se generan siempre textos encriptados diferentes y no siempre de igual largo (lo hice así intencionalmente).
+ Desencripta perfecto cualquiera de los textos encriptados.
+ En esta segunda versión le he creado una GUI con tkinter, bastante simple pero ha quedado bien.

Código: python
from random import randint, choice
from tkinter import Tk, messagebox, Text, Button

def encode(string):
#Pasamos a binario el mensaje original:
binMSG = ""
i = 0
while i < len(string):
caracter_MSG_binario = bin(ord(string[i])).replace("0b", "").zfill(8)
binMSG = binMSG + caracter_MSG_binario
i += 1
#Dividimos el mensaje binario en dos cadenas de igual largo.
Segmento1 = binMSG[:(int(len(binMSG)/2))]
Segmento2 = binMSG[(int(len(binMSG)/2)):]
#A cada segmento agregamos una cadena aleotoria inicial para generar encriptaciones diferentes para un mismo mensaje.
Segmento1 = random_bin_chain(8) + Segmento1
Segmento2 = random_bin_chain(8) + Segmento2
# (0 = @), (1 = $), (1 = &), (2 = *)
i = 0
cadena_final = ""
while i < len(Segmento1):
if Segmento1[i] == Segmento2[i] == "0":
cadena_final += "@"
elif Segmento1[i] == Segmento2[i] == "1":
cadena_final += "$"
elif Segmento1[i] == "1" and Segmento2[i] == "0":
cadena_final += "&"
elif Segmento1[i] == "0" and Segmento2[i] == "1":
cadena_final += "*"
i += 1
#Transformamos los simbolos en caracteres normales (letras y numeros) y acortamos la cadena a la mitad.
simbolos = ["@", "$", "&", "*"]
valores = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.="
i = k = 0
while i < 4:
for elemento in simbolos:
match = elemento + simbolos[i]
coincidencias = cadena_final.count(match)
j = 1
while j <= coincidencias:
cadena_final = cadena_final.replace(match, choice(valores[k:k+4]), 1)
j += 1
k += 4
i += 1
return cadena_final
#El largo de la cadena final es siempre mayor a 2*(string + 2)
#El largo de la cadena final es siempre menor a (8/3)*(string + 2)

def decode(string):
simbolos = ["@", "$", "&", "*"]
valores = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.="
#Lo primero es obtener la cadena de simbolos ["@", "$", "&", "*"]
#Para ello transformamos las letras en simbolos.
listavalores = []
k = 0
while (k+4) <= len(valores):
listavalores.append(valores[k:k+4])
k += 4

i = k = 0
while i < 4:
for elemento in simbolos:
match = elemento + simbolos[i]
for caracter in listavalores[k]:
string = string.replace(caracter, match)
k += 1
i += 1
cadena_simbolos = string[8:]
#La cadena de simbolos representa la suma de los dos segmentos del mensaje
segmento1 = segmento2 = ""
for elemento in cadena_simbolos:
if elemento == "@":
segmento1 = segmento1 + "0"
segmento2 = segmento2 + "0"
elif elemento == "$":
segmento1 = segmento1 + "1"
segmento2 = segmento2 + "1"
elif elemento == "&":
segmento1 = segmento1 + "1"
segmento2 = segmento2 + "0"
elif elemento == "*":
segmento1 = segmento1 + "0"
segmento2 = segmento2 + "1"
cadena_binaria = segmento1 + segmento2
#Ahora queda transformar la cadena binaria a texto plano.
if (len(cadena_binaria) % 8) == 0:
repeticiones = (len(cadena_binaria) // 8)
j = k = 0
valor_original = ""
while k <= (repeticiones - 1):
segmento_8 = cadena_binaria[j:j + 8]
ascii_value = bin_to_ascii(segmento_8)
str_value = chr(ascii_value)
valor_original = valor_original + str(str_value)
j += 8
k += 1
else:
return ("Invalid text to decode.")
return valor_original

def random_bin_chain(large):
binary_chain = ""
for i in range(0, large):
binary_chain = binary_chain + str(randint(0, 1))
return binary_chain

def bin_to_ascii(bin_number):
    bin_number_str = str(bin_number)
    if len(bin_number_str) == 8:
        i = 0
        dec_number = 0
        while i <= 7:
            dec_number = dec_number + (int(bin_number_str[i]) * (2 ** (7 - i)))
            i += 1
        return dec_number
    else:
        return "Error decoding."

def load_GUI():
def EncodeClicked():
string = txtInput.get('1.0', 'end').strip()
if len(string) > 0:
result = encode(string)
txtInput.delete('1.0', 'end')
txtInput.insert('1.0', result)
else:
messagebox.showwarning("Azav Cipher","The plain text must contain at least 1 character.")

def DecodeClicked():
string = txtInput.get('1.0', 'end').strip()
if len(string) >= 4:
if decode(string) != "Invalid text to decode.":
result = decode(string)
txtInput.delete('1.0', 'end')
txtInput.insert('1.0', result)
else:
messagebox.showwarning("Azav Cipher","The encoded text is not valid to decode.")
else:
messagebox.showwarning("Azav Cipher","The encoded text must contain at least 4 characters.")

#Main Window
mainWindow = Tk()
mainWindow.geometry("520x270")
mainWindow.title("Azav Cipher")
#TextBox
txtInput = Text(mainWindow, height="12", width="60", relief = 'flat')
txtInput.place(x=20, y=20)
#Encode & Decode Buttons
cmdEncode = Button(mainWindow,  text = 'Encode', width = 30, command = lambda:EncodeClicked()).place(x=20, y = 230)
cmdEncode = Button(mainWindow,  text = 'Decode', width = 30, command = lambda:DecodeClicked()).place(x=285, y = 230)
#Start
mainWindow.mainloop()


load_GUI()


¡Espero a alguien le sirva!  ;)

Interesante brother, te dejo +1

Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta