Buenas, vengo a traerles la solución a un reto de [Enlace externo eliminado para invitados]
#Cifrado Kamasutra en Python - Sanko
#Reto UDT - Cifrado Kamasutra

# -*- coding: utf-8 -*- 
from random import randint
from string import maketrans

class cif_Kamasutra():
	
	def __init__(self):
		self.text = raw_input("Write the text to encode|> ")
		self.text = self.text.upper()
		self._gen_alfabeto()
		
	def _gen_alfabeto(self):
		#This func has been coded by Pink
		self.alfabeto = ['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']
		letra1=""
		letra2=""
		self.retorno=""
		
		for n in range(len(self.alfabeto)):
			ram = randint(0,len(self.alfabeto)-1)
			letra1 = self.alfabeto[ram]
			letra2 = self.alfabeto[n]
			self.alfabeto[n] = letra1
			self.alfabeto[ram] = letra2
			
		for n in range(len(self.alfabeto)):
			self.retorno+=self.alfabeto[n]
		
		#extra code
		print "\nDict: %s"% self.retorno
		self.new_alphabet = self.retorno[::-1]

		self.__encode()
		self.__decode()
		
	def __encode(self):
		self.encoded = maketrans(self.retorno, self.new_alphabet)
		self.final_str = self.text.translate(self.encoded)
		print "Encoded: ", self.text.translate(self.encoded)
		
	def __decode(self):
		decoded = maketrans(self.new_alphabet, self.retorno)
		print "Decoded: ", self.final_str.translate(decoded)
		

cif_Kamasutra()
Una imágen vale más que mil palabras:
Imagen


Saludos
Este cifrado consiste en una tabla en la que dispondremos de las 26 letras del abecedario de forma aleatoria, como este ejemplo:

Imagen


La tabla, como dije, ha de ser aleatoria, no es ninguna en particular.

El proceso de cifrado/descifrado consiste en sustituir cada letra del texto original por la correspondiente en el par, el resultado se obtendrá siempre en mayúsculas (el texto original se pasará a mayúsculas previamente), y los caracteres que no figuren en la tabla se dejarán tal cual, esto es una mejora que varía del cifrado original.

Ejemplo:

Texto a cifrar: "Hola UdTools"

La letra "H" se sustituirá con su pareja de la tabla: "K"
La letra "o" se sustituirá con su pareja de la tabla: "C"
La letra "l" se sustituirá con su pareja de la tabla: "I"
La letra "a" se sustituirá con su pareja de la tabla: "U"
El espacio o cualquier letra que no figure en la tabla se mantendrá ya que no figura en la tabla.
La letra "U" se sustituirá con su pareja de la tabla: "A"
La letra "d" se sustituirá con su pareja de la tabla: "Z"
La letra "T" se sustituirá con su pareja de la tabla: "P"
La letra "o" se sustituirá con su pareja de la tabla: "C"
La letra "o" se sustituirá con su pareja de la tabla: "C"
La letra "l" se sustituirá con su pareja de la tabla: "I"
La letra "s" se sustituirá con su pareja de la tabla: "M"

De modo que el texto cifrado será: "KCIU AZPCCIM"
Y el descifrado será: "HOLA UDTOOLS"

Antes dije que el texto inicial se convertirá a mayúsculas, pero podéis hacerlo de modo que se puedan usar minúsculas y sólo se sustituyan las letras en mayúsculas, de modo que:

Texto a cifrar: "Hola UdTools"
Texto Cifrado: "Kola AdPools"
Texto Descifrado: "Hola UdTools"

Como véis, sólo se han sustituido las letras en mayúscula.

Lo que sí se mantendrá en mayúsculas es el alfabeto de la tabla.

Lo podéis hacer de cualquiera de las 2 formas, la última forma es mucho más débil que la primera, pero permitiría obtener el texto original tal cual y sin modificar.

Además, y de manera opcional, se creará un generador de tablas para usar en el cifrado.

Suerte a todos.
De esta manera cuando generó el diccionario le doy la vuelta a la string:
self.new_alphabet = self.retorno[::-1]
Y luego con maketrans comparo el dicc generado con el dado de vuelta y así la primera se reemplazará por la última y así continuamente hasta cifrar la cadena entera.
Buenisimo sanko eres el amo con python, sin duda alguna esto es un buen ejemplo de code, si retorno al ruby pienso traducirlo, eres un grande, un saludo
Abolición para el torneo del toro de la vega. Death to the murderers of bulls.
Responder

Volver a “Fuentes”