Azav Cipher
Publicado: 04 Oct 2014, 23:36
por azav3
Aquí denuevo compañeros. El último post que hice trato de la encriptación CipherSaber, pero esta vez vengo con una encriptación propia que he creado yo mismo.
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). Ejemplo:
+ Desencripta perfecto cualquiera de los textos encriptados.
+ Si el largo del texto plano original es a. Entonces el largo del texto encriptado b se moverá entre:
2*(a + 2) <= b <= (8/3)*(a + 2)
Captura:

Source Code:
Espero a alguien le sirva.
¡Saludos!
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). Ejemplo:
CHOOSE YOUR MODE:
+To encode write e
+To decode write d
>e
Please enter your plain text
>hola
Encoded text: 7*nK0$5S0g7Hp
CHOOSE YOUR MODE:
+To encode write e
+To decode write d
>e
Please enter your plain text
>hola
Encoded text: ir7*7$5Q0h5Fo
CHOOSE YOUR MODE:
+To encode write e
+To decode write d
>e
Please enter your plain text
>hola
Encoded text: &bR22$7Q1j6Gq
+ Si el largo del texto plano original es a. Entonces el largo del texto encriptado b se moverá entre:
2*(a + 2) <= b <= (8/3)*(a + 2)
Captura:

Source Code:
import random
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, random.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(random.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."
print("#############################################\n####### CipherSaber Encode/Decode #######\n####### Autor: azav3 #######\n####### Also known as: Szudisch, Azav #######\n####### Dedication: indetectables.net #######\n")
while True:
eleccion = input("\nCHOOSE YOUR MODE: \n+To encode write e\n+To decode write d\n>")
if eleccion == "e":
while True:
string = input("\nPlease enter your plain text\n>")
if len(string) > 0:
break
else:
print("The plain text must contain at least 1 character.")
print("\nEncoded text: " + encode(string))
elif eleccion == "d":
while True:
string = input("\nPlease enter your encoded text\n>")
if len(string) >= 4:
break
else:
print("The encripted text must contain at least 4 character.")
if decode(string) != "Invalid text to decode.":
print("\nPlain text: " + decode(string))
else:
print(decode(string))
else:
print("Please enter a valid mode.")
¡Saludos!