Usando un hash para cifrar datos

0

Ú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:

  1. Tienes una cadena de datos.
  2. Se genera un hash de una frase de contraseña.
  3. 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))
    
pregunta Anthony 29.01.2016 - 06:01
fuente

2 respuestas

5

Si entiendo su enfoque y código correctamente, simplemente no usa la frase de contraseña original para "cifrado", sino una clave derivada de la frase de contraseña y un sal estático. Este enfoque de no usar la frase de contraseña original, sino una clave derivada, también se denomina estiramiento de la clave utilizando una función de derivación de clave . El propósito es hacer una "mejor" clave ocultando una frase de contraseña no tan aleatoria detrás de operaciones complejas que toman deliberadamente un tiempo prolongado y, por lo tanto, hacen más difícil forzar la frase de contraseña original. La clave derivada se utiliza para el cifrado, pero aún con un buen algoritmo de cifrado.

Lamentablemente, la forma en que ha utilizado estas ideas es incorrecta. No está utilizando la clave derivada en un cifrado sólido, sino solo en una operación simple como XOR. Este tipo simple de "cifrado" facilita la obtención de la clave de cifrado (es decir, la clave derivada de la frase de contraseña y la sal) si se conocen suficientes datos cifrados o si se conoce un poco de texto simple. Una vez que el atacante tiene esta clave derivada, puede descifrar todos los datos, es decir, no es necesario averiguar la frase de contraseña original y la sal utilizada para crear esta clave.

Aparte de eso, su función de derivación de claves es un hash rápido que haría más fácil el forzamiento de la fuerza bruta. Pero una vez más, uno ni siquiera necesita revertir la derivación de su clave para descifrar el contenido.

    
respondido por el Steffen Ullrich 29.01.2016 - 06:50
fuente
0

La característica clave de los hashes es que son irreversibles, por lo que el uso de este método para "descifrar" los datos lo dejará en la misma posición que sus adversarios, que es el mensaje que obliga a los ataques.

Podría argumentar que tiene ventaja en esa competencia de fuerza bruta al "conocer" la contraseña que se usó en el hash como una "sal" de algún tipo, pero si pudiera transmita de forma segura esa sal al punto final de destino de forma segura, ¿por qué no usa ese canal seguro para los datos reales?

    
respondido por el Seth M. Larson 29.01.2016 - 06:26
fuente

Lea otras preguntas en las etiquetas