Últimamente, he estado leyendo sobre criptografía y he pensado en un método para usar hashes para cifrar datos. Por lo que sé, los hashes son únicos para cada objeto y son funciones unidireccionales. El cifrado por otro lado es de dos vías. El cifrado se basa en una clave para descifrar los datos cifrados. Esta clave es la clave (sin juego de palabras) a la fuerza del cifrado. Cómo se crea es todo. Lo que me pregunto es si se podrían modificar los datos con un hash de una frase de contraseña para crear un cifrado seguro. Por ejemplo:
- Tienes una cadena de datos.
- Se genera un hash de una frase de contraseña.
- Combinas los caracteres correspondientes del hash y los datos, es decir,
[datos = asdfgh] + [hash = qwertyuiop] --- > resultado = ÒêÉØÛá
Nota: Este es solo un ejemplo de cómo puedes usar el hash para modificar los datos. El punto principal es que modificas los datos de manera sencilla con el hash: suma, resta, ORing, etc. Obtienes el punto.
Después de cifrarlo, puedes tirar el hash. Para descifrarlo, todo lo que tiene que hacer es revertir la operación utilizando la misma función de hash y la misma sal. Todo lo que uno necesita es la frase de contraseña utilizada para el hash original.
Esto parece que funcionaría, porque si los hash son realmente únicos, la única forma, sin embargo, parece que, sin forzados brutos, descifrar los datos sería usar el mismo hash que usó para cifrarlos.
Sin embargo, esto parece demasiado simple, y como soy un novato en esta área, estoy seguro de que hay fallas de seguridad. ¿Hay algo inherentemente inseguro sobre esto?
Gracias
En caso de que desee un código real para él, aquí hay un programa rápido de Python que demuestra lo justo:
#Encryption Test
import hashlib
class Key:
def __init__(self, passphrase):
self.passphrase = passphrase.encode('utf-8')
self.salt = 'battery horse staple'.encode('utf-8')
def hash_key(self):
return hashlib.sha256(self.passphrase + b';' + self.salt).hexdigest()
class EDObject:
def __init__(self, edobject):
self.edobject = edobject
self.result_l = []
def encrypt(self, key):
#Add the decimal values of key (hash) and object together.
for i in range(len(self.edobject)):
self.result_l.append(chr(ord(self.edobject[i])+ord(key.hash_key()[i])))
return ''.join(self.result_l)
def decrypt(self, key):
#subtract the decimal values of the key from the encrypted object
for i in range(len(self.edobject)):
self.result_l.append(chr(ord(self.edobject[i])-ord(key.hash_key()[i])))
return ''.join(self.result_l)
if __name__ == '__main__':
o = EDObject(input('object:'))
k = Key(input('pass:'))
if input('e/d:') == 'e':
#Encrypt
print(o.encrypt(k))
else:
#Decrypt
print(o.decrypt(k))