Cifrado. #1

Iniciado por 000000 000000, Diciembre 25, 2019, 08:27:53 PM

Tema anterior - Siguiente tema

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

Diciembre 25, 2019, 08:27:53 PM Ultima modificación: Enero 22, 2020, 09:19:13 AM por HATI
Hola.  ;)


Buenas hoy les traigo un taller para aprender para que sirven las codificaciones, cuales son las principales codificaciones y como hacer un par de ellas un tanto sencillas. Antes de empezar quiero que me perdonen por tal vez en alguna parte ser inculto.


PARA QUE SIRVEN.

El problema de tener texto no codificado ha sido un problema desde la antigüedad, de hecho el conocido emperador romano César invento una codificación para que los enemigos no viesen lo que quería hacer, esta codificación es conocida como César es muy sencilla pero en la época era muy útil consiste en  por ejemplo quieres codificar la siguiente cadena "undercode" lo que tendrías que hacer es pasar X letra para delante por ejemplo tenemos la letra "a" la codificamos pasando solo 1 letra nos quedaría que "a" es "b" en en caso de "undercode" quedaría así "vñefsdpef", pero esto actualmente es inútil ya que es muy sencillo de romper probando X letras para delante y se han desarrollado nuevos algoritmos más seguros usados en muchos campos, por ejemplo las redes WIFI a quién no le suena WEP WPA WPA2 el WEP se consiguió romper pero los otros siguen en pie, otro uso que le podemos dar a las codificaciones es algo que al estar en este foro lo estas usando, http y https su diferencia es que http no esta cifrada la conexión al servidor pero el https si que lo esta por eso una es más segura que la otra, ahora que ya sabemos algunos de sus usos vamos a ver cuales son las principales codificaciones seguras y sus diferencias. (Conclusión sirven para que nadie que no queramos acceda a nuestros datos.)

TIPOS DE CODIFICACIONES.

Codificación simétrico y asimétrico:




Estos dos son cifrados con clave, primero vallamos con el simétrico, cuando le pones contraseña a tu teléfono le pones una clave y luego descifras el teléfono con esa misma clave por ejemplo AES, pero el asimétrico es un poco más difícil de explicar básicamente cifras con una clave y descifras con otra, porque tienes claves publicas y claves privadas, estas suelen hacerse con números primos por ejemplo el 3 y el 11 eso sería nuestra clave privada, pero cuando lo multiplicamos nos daría
33 y esa sería nuestra clave pública en este caso 33 sería la codificación final, este un claro ejemplo de el algoritmo RSA inventado por Alan Turing para la guerra de los americanos contra los nazis, bueno volvamos con la clave pública en este caso es muy fácil adivinar que la clave privada es 3 y 11 pero esto lo hacen con números como 2^77.232.917 − 1 y claro no es tan obvio en esos casos :'( para saber las claves privadas habría que factorizar, pero le cuesta mucho a los ordenadores cosas como esas con números grandes.


Hash.




Su nombre viene de un plato de comida en el que se mezclan todos ingredientes mucho, lo mismo pasa en la codificación se mezcla mucho. Este tipo de codificación en muy usado en bases de datos a la hora de guardar contraseñas, es un tipo cifrado "irreversible" solamente puedes acceder cuando codificas la contraseña y es igual a la que ya tenías por ejemplo:
if password == "B221D9DBB083A7F33428D7C2A3C3198AE925614D70210E28716CCAA7CD4DDB79":
                login()
Ese es un hash sha256 con la palabra hola codificada si al codificarla es igual al texto de arriba pues le deja pasar en el caso contrario no, la única forma de romper estos hash es a fuerza bruto haciendo los hash de palabras corrientes como hola y clasificándolos para tener una especie de diccionario de hashes, existen páginas web para romperlos que tienen millones de hashes almacenados con palabras corrientes, esa es la razón de tener contraseñas seguras ya que si acceden a una base de datos de un sitio web con las contraseñas codificadas en un hash las contraseñas fáciles estarán en el diccionario. Otro uso que se le puede dar a los hashes son las monedas virtuales pero no me meto porque no controlo mucho simplemente creo que el primero que rompa el hash se leva el $.


Crear tus propias codificaciones.


En este caso vamos a hacer 2 un poco simples la verdad, pero nos ayudará a comprender mejor como funciona, vamos a crear uno sin clave al estilo César y un hash muy sencillito.


Codificación estilo César:

Código: python
		vb = input("Texto a codificar: ")
                                cambiar += vb.replace("a", "ªªªªªªªªªª") #remplazo un carácter por otro

cambiar1 += cambiar.replace("b", "$$$$")

cambiar2 += cambiar1.replace("c", "´´´´´´´´")

cambiar3 += cambiar2.replace("d", "^^^^^^^^^^^^^^")

cambiar4 += cambiar3.replace("e", "¨¨¨¨¨")

cambiar5 += cambiar4.replace("f", "·······················")

cambiar6 += cambiar5.replace("g", "ççççç")

cambiar7 += cambiar6.replace("h", "|||||||||||||||")


Y así se remplazaran algunos caracteres por otros, para añadir mas es muy sencillo si sabes programar, pero ahora vallamos a lo gordo, al hash(no debería llamarlo así porque se descifra con un poco de trabajo, pero bueno todo depende del algoritmo que le pongas).

Código: python
contador = 0
has = input("CADENA>> ")
has = has.lower()
longitud = len(has)
hash = []
hashnum = []
def main():
    for letra in has:
        hash.append(letra)
        if "a" ==  letra:
            hashnum.append(18289)
        if "b" ==  letra:
            hashnum.append(19919)
        if "c" == letra:
            hashnum.append(33359)
        if "d" == letra:
            hashnum.append(29077)
           
        if "e" == letra:
            hashnum.append(30319)
        if "f" == letra:
            hashnum.append(31847)
        if "g" == letra:
            hashnum.append(28843)
        if "h" == letra:
            hashnum.append(26627)
        if "i" == letra:
            hashnum.append(25301)
        if "j" == letra:
            hashnum.append(34159)
        if "k" == letra:
            hashnum.append(29179)
        if "l" == letra:
            hashnum.append(26113)
        if "n" == letra:
            hashnum.append(28817)
        if "m" == letra:
            hashnum.append(65053)
        if "o" == letra:
            hashnum.append(64223)
        if "p" == letra:
            hashnum.append(52457)
        if "q" == letra:
            hashnum.append(89983)
        if "r" == letra:
            hashnum.append(97673)
        if "s" == letra:
            hashnum.append(11171)
        if "t" == letra:
            hashnum.append(76259)
        if "u" == letra:
            hashnum.append(80363)
        if "v" == letra:
            hashnum.append(68891)
        if "w" == letra:
            hashnum.append(91837)
        if "x" == letra:
            hashnum.append(99989)
        if "y" == letra:
            hashnum.append(34763)
        if "z" == letra:
            hashnum.append(74077)
        if " " == letra:
            hashnum.append(70141)
        if "." == letra:
            hashnum.append(19961)
        if "-" == letra:
            hashnum.append(64019)
        if "_" == letra:
            hashnum.append(72173)
        if "}" == letra:
            hashnum.append(93503)
        if "{" == letra:
            hashnum.append(52567)
        if "+" == letra:
            hashnum.append(12401)
        if "*" == letra:
            hashnum.append(58309)
        if "," == letra:
            hashnum.append(95873)
        if ";" == letra:
            hashnum.append(33037)
        if ":" == letra:
            hashnum.append(27337)
        if "1" == letra:
            hashnum.append(26489)
        if "2" == letra:
            hashnum.append(89329)
        if "3" == letra:
            hashnum.append(88019)
        if "4" == letra:
            hashnum.append(94201)
        if "5" == letra:
            hashnum.append(49031)
        if "6" == letra:
            hashnum.append(41023)
        if "7" == letra:
            hashnum.append(88793)
        if "8" == letra:
            hashnum.append(94169)
        if "9" == letra:
            hashnum.append(20509)
        if "0" == letra:
            hashnum.append(13841)
        if "[" == letra:
            hashnum.append(89041)
        if "]" == letra:
            hashnum.append(92809)
        if '"' == letra:
            hashnum.append(23819)
        if "'" == letra:
            hashnum.append(25097)
        if "=" == letra:
            hashnum.append(93827)
        if "(" == letra:
            hashnum.append(54151)
        if ")" == letra:
            hashnum.append(17957)
        if "!" == letra:
            hashnum.append(11003)
        if "@" == letra:
            hashnum.append(12301)
        if "#" == letra:
            hashnum.append(14891)
        if "$" == letra:
            hashnum.append(21139)
        if "/" == letra:
            hashnum.append(21503)
        if "´" == letra:
            hashnum.append(14713)
        if "`" == letra:
            hashnum.append(11833)
        if "¨" == letra:
            hashnum.append(14759)
main()
#Algoritmo
while True:
    if longitud == 0:
        break
    hashfinal = hashnum[0]*99149 #Multiplico el primer número primo de la lista por otro número primo.
    longitud-=1
    hashfinal = hashfinal*hashnum[-1] #Multiplico lo anterior por el ultimo número de la lista
    longitud-=1
    break
print(hashfinal)


Simplemente remplazo letras por números primos que guardo en una lista para luego jugar con ellos en el algoritmo de cifrado que en este caso es muy muy simple pero si a vosotros se os ocurre algo más complejo ponedlo en un comentario y así aprendemos todos, antes de despedirme les dejo aquí una lista de números primos algo grande por si quieren hacer algo por el estilo

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

Saludos.  ;D

Solo por comentar, igual corregiría el término de codificación por cifrado. Lo comento porque normalmente se suele distinguir entre codificación que suele entenderse como la traslación de uso de un alfabeto a otro, codificación ASCII, codificación binaria, codificación hexadecimal, codificación base64, etc... cuando no existe ningun secreto o proceso en el que se oculta la información utilizando un password. Se suelen meter también los algoritmos de compresión, donde la información se codifica de manera que ocupen menos espacio en memoria aprovechandose normalmente de las repeticiones de series numericas dentro de la información a compartir o almacenar.
El término cifrado se suelle utilizar cuando se realiza un ocultamiento de algo mediante una opración matemática en la que si no dispones del secreto o password no vas a poder recuperar la información.
Pero es solo un punto de vista, si no te gusta pues lo cambio. :) un abrazo.

Lo siento, no contesto dudas por MP, si tienes dudas las planteas en el foro.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Solo por comentar, igual corregiría el término de codificación por cifrado. Lo comento porque normalmente se suele distinguir entre codificación que suele entenderse como la traslación de uso de un alfabeto a otro, codificación ASCII, codificación binaria, codificación hexadecimal, codificación base64, etc... cuando no existe ningun secreto o proceso en el que se oculta la información utilizando un password. Se suelen meter también los algoritmos de compresión, donde la información se codifica de manera que ocupen menos espacio en memoria aprovechandose normalmente de las repeticiones de series numericas dentro de la información a compartir o almacenar.
El término cifrado se suelle utilizar cuando se realiza un ocultamiento de algo mediante una opración matemática en la que si no dispones del secreto o password no vas a poder recuperar la información.
Pero es solo un punto de vista, si no te gusta pues lo cambio. :) un abrazo.

Cierto Gracias, también me lo dijo dtxdf a mi me sonaba también a partir de ahora lo pondré como decís  ;)