Utilizzo di un hash per crittografare i dati

0

Ultimamente, ho letto della crittografia e ho pensato ad un metodo per utilizzare gli hash per crittografare i dati. Da quello che so, gli hash sono unici per ogni oggetto e sono funzioni unidirezionali. La crittografia, d'altro canto, è a due vie. La crittografia si basa su una chiave per decrittografare i dati crittografati. Questa chiave è la chiave (nessun gioco di parole previsto) per la forza della crittografia. Come è creato è tutto. Quello che mi chiedo è che si potrebbe modificare i dati usando un hash di una passphrase, per creare una crittografia sicura? Ad esempio:

  1. Hai una stringa di dati.
  2. Genera un hash di una passphrase.
  3. Combini i caratteri corrispondenti dell'hash e dei dati insieme i.e

[data = asdfgh] + [hash = qwertyuiop] --- > risultato = ÒêÉØÛá

Nota: questo è solo un esempio di come potresti usare l'hash per modificare i dati. Il punto principale è che si modificano i dati in modo semplice con l'hash: addizione, sottrazione, ORing, ecc. Si ottiene il punto.

Dopo averlo crittografato, puoi eliminare l'hash. Per decrittografarlo, tutto ciò che devi fare è invertire l'operazione usando la stessa funzione di hashing e salt. Tutto ciò che serve è la passphrase utilizzata per l'hash originale.

Sembra che funzionerebbe, perché se gli hash sono veramente unici, l'unico modo, sembra, senza forzatura bruta, di decodificare i dati sarebbe di usare lo stesso hash di quello che hai usato per crittografarlo.

Questo sembra troppo semplice, e dato che sono un noob in questo settore, sono sicuro che ci sono dei difetti di sicurezza. C'è qualcosa di intrinsecamente insicuro su questo?

Grazie

Nel caso in cui desideri un codice vero e proprio, ecco un rapido programma python che ne dimostra esattamente il contenuto:

#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))
    
posta Anthony 29.01.2016 - 06:01
fonte

2 risposte

5

Se comprendo correttamente il tuo approccio e il tuo codice, semplicemente non usi la passphrase originale per "crittografia" ma una chiave derivata da passphrase e un salt statico. Questo approccio di non utilizzare la passphrase originale ma una chiave derivata viene anche chiamato allungamento della chiave utilizzando una funzione di derivazione della chiave . Lo scopo è quello di creare una chiave "migliore" nascondendo una passphrase non così casuale dietro operazioni complesse che richiedono volutamente un lungo periodo di tempo e quindi rendono più difficile forzare la frase d'accesso originale. La chiave derivata viene quindi utilizzata per la crittografia, ma comunque con un buon algoritmo di crittografia.

Sfortunatamente il modo in cui hai usato queste idee è sbagliato. Non stai utilizzando la chiave derivata in una crittografia strong ma solo in una semplice operazione come XOR. Questo semplice tipo di "crittografia" rende facile ottenere la chiave di crittografia (ad esempio la chiave derivata da passphrase e salt) se sono noti dati crittografati sufficienti o se è noto un numero limitato di testo. Una volta che l'utente malintenzionato ha questa chiave derivata, è in grado di decrittografare tutti i dati, ovvero non è necessario trovare la passphrase e il sale utilizzati per la creazione di questa chiave.

A parte il fatto che la funzione di derivazione della chiave è un hash veloce che renderebbe più facile la forzatura bruta. Ma ancora una volta non è nemmeno necessario invertire la derivazione della chiave per decodificare il contenuto.

    
risposta data 29.01.2016 - 06:50
fonte
0

La caratteristica fondamentale degli hash è che sono irreversibili, quindi l'utilizzo di questo metodo per "decrittografare" i dati ti lascerebbe nella stessa posizione degli avversari, che è un forzante brutale del messaggio.

Potresti affermare di avere il sopravvento in quella competizione di forza bruta "conoscendo" la password che era stata usata nell'hash come un "salt" di sorta, ma se potessi sicuro trasmettere quel sale all'obiettivo finale in modo sicuro, perché non utilizzare quel canale sicuro per i dati reali?

    
risposta data 29.01.2016 - 06:26
fonte

Leggi altre domande sui tag