Wie kann man viele Dateien mit AES-GCM verschlüsseln, ohne jedes Mal die Schlüsselableitungsfunktion auszuführen?

Nov 20 2020

Verknüpfte Frage: AES verschlüsselt mehrere Dateien


Mit a passwordmuss ich 100.000 Dateien verschlüsseln. (Vielleicht 100.000 Dateien heute; oder vielleicht 50.000 heute, 10.000 morgen und 40.000 Dateien in der nächsten Woche).

  • Bisher habe ich das gemacht (Pseudocode):

    for each file:
        plaintext = file.read()
        nonce = getrandom(bytes=16)
        key = KDF_PBKDF2(password, salt=nonce, count=1000000)  # very slow for each file!
        ciphertext, tag = AES_GCM_cipher(key, nonce=nonce).encrypt(plaintext)
        write to disk:   nonce | ciphertext | tag
    

    und um die verschlüsselte Datei zu entschlüsseln

    nonce, ciphertext, tag = file.read()
    key = KDF_PBKDF2(password, salt=nonce, count=1000000)    # very slow for each file!
    plaintext = AES_GCM_cipher(key, nonce=nonce).decrypt(ciphertext)
    

    Dies ist natürlich nicht optimal, da ich die KDF-Funktion für jede Datei ausführe und dies langsam ist!

  • Ich habe über diese Lösung nachgedacht:

    # do this ONLY ONCE for each encryption session:
    salt = getrandom(bytes=16)
    key = KDF_PBKDF2(password, salt=salt, count=1000000)   # run only once
    
    for each file:
        plaintext = file.read()
        nonce = getrandom(bytes=16)
        ciphertext, tag = AES_GCM_cipher(key, nonce=nonce).encrypt(plaintext)
        write to disk:   salt | nonce | ciphertext | tag
    

    Dies hat jedoch den Nachteil, dass saltam Anfang jeder verschlüsselten Datei 16 weitere Bytes ( ) vorangestellt werden müssen. Ist es eine übliche Praxis?

    Und vor allem hat es folgenden Nachteil beim Entschlüsseln:

    for each encrypted file:
        salt, nonce, ciphertext, tag = file.read()           # since salt may be different for each file
                                                             # we have to run:
        key = KDF_PBKDF2(password, salt=salt, count=1000000) # very slow for each file!
        ...
    

    Da dies saltam Anfang jeder verschlüsselten Datei steht, müssen wir die KDF-Funktion ausführen ... für jede verschlüsselte Datei, die wir entschlüsseln möchten! Dies wird sehr langsam sein.

    Wir könnten sie in den Cache stellen cache[salt] = key, sodass saltwir sie bereits haben , wenn wir sie wiederfinden key, aber ich bin mir nicht sicher, ob dies eine elegante Lösung ist.

Frage: Mit welchem ​​Schema können 100.000 Dateien (in einem Durchgang oder in mehreren Sitzungen) mit einem Kennwort mit AES-GCM verschlüsselt werden?

Antworten

1 fgrieu Nov 20 2020 at 15:18

Eine ernsthafte Frage zur passwortbasierten Kryptographie darf nicht von Argon2 abweichenKDF_PBKDF2 , sondern zu Argon2 laufen (oder verschlüsseln, wenn es leichter verfügbar ist)! Der Bitcoin-Abbau hat (im Jahr 2020) gezeigt, dass dedizierte ASICs, die SHA-256 mit hoher Geschwindigkeit (220 TH / s) und Effizienz (15 pJ / H) ausführen, für einige tausend US-Dollar im Handel erhältlich sein können. Dies macht es unhaltbar, sich auf PBKDF2-HMAC zu verlassen, das auf Standardhardware ausgeführt wird, um vom Benutzer gewählte Passwörter in Hochsicherheitsanwendungen zu erweitern.

Die vorgeschlagene Methode weist eine Eigenschaft auf: Sie saltist mehreren Dateien gemeinsam, wenn und saltnur dann, wenn sie zusammen verschlüsselt wurden. Dies ist sowohl ein möglicherweise unerwünschtes Informationsleck als auch eine Möglichkeit, den genannten Nachteil zu beheben: Der bei der Entschlüsselung verwendete Code zum Strecken des Kennworts kann einen RAM-Cache von ( saltkey) Paaren verwalten.

Ich würde in Betracht ziehen, AES-GCM durch AES-GCM-SIV zu ersetzen , um im Falle eines Stotterns des RNG beruhigt zu sein, aber bedenken Sie, dass zwei Durchgänge über die Daten erforderlich sind.

So sehr ich befürworte, das letzte Byte zu kürzen, wenn es zählt (z. B. wenn die Daten auf einem Barcode liegen oder ein langsames oder / und verbrauchendes Kommunikationsmedium durchlaufen), empfehle ich nicht, bei der Dateiverschlüsselung wie wir zu sparen saltund die nonceGröße zu ändern sind in den 1980er Jahren.