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!