4 Stimmen

Wie verwendet man salsa20 (oder ChaCha)?

Angenommen, wir haben eine große Datei, die in Blöcken von 1024 Bytes oder so gelesen werden kann. Wie kann ich jeden einzelnen Block mit Salsa oder Chacha 20 ver- und entschlüsseln?

Wo kann ich außerdem die Anzahl der Runden angeben (z. B. 8, 12 oder 20)?

Bis jetzt konnte ich es nicht herausfinden, indem ich mir das eSTREAM-Testpaket angesehen habe :(

Ich habe die folgenden Dateien heruntergeladen über eSTREAM und die Salsa20 Startseite :

  • chacha.c
  • ecrypt-config.h
  • ecrypt-machine.h
  • ecrypt-portable.h
  • ecrypt-sync.h

Und ich sehe, dass die Kommentare in encrypt-sync.h über den Aufruf von Funktionen in dieser Reihenfolge sprechen:

  • ECRYPT_keysetup();
  • ECRYPT_ivsetup();
  • ECRYPT_encrypt_bytes();

Aber ich habe absolut keine Ahnung, was genau ich als Parameter eingeben soll, damit das funktioniert...

Hier ist mein bester Versuch bisher, beginnend mit einem kleinen String von Klartext (mein C ist eingerostet... es ist möglich, dass ich einige grundlegende Fehler gemacht habe, obwohl ich es nicht sehen kann):

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "ecrypt-sync.h"

#define CHUNKSIZE 1024

void getRandomBytes(u8 **str, u32 len);
void showData(u8 *data, u8 *header);

int main(int argc, char** argv)
{
    char plaintext[CHUNKSIZE] = "THIS IS A TEST";
    ECRYPT_ctx ctx;
    u8 *key, *IV, *ciphertext, *result;

    /*
    Don't use random values till we get it working with zeroes at least
    getRandomBytes(&key, ECRYPT_MAXKEYSIZE/8);
    getRandomBytes(&IV, ECRYPT_MAXIVSIZE/8);
    */

    key = (u8 *)calloc((size_t)ECRYPT_MAXKEYSIZE/8, sizeof(u8));
    IV = (u8 *)calloc((size_t)ECRYPT_MAXIVSIZE/8, sizeof(u8));

    printf("Encrypting [%s] using random %d bit key and %d bit IV:\n", plaintext, ECRYPT_MAXKEYSIZE, ECRYPT_MAXIVSIZE);

    ECRYPT_init();
    ECRYPT_keysetup(&ctx, key, ECRYPT_MAXKEYSIZE, ECRYPT_MAXIVSIZE);
    ECRYPT_ivsetup(&ctx, IV);

    ciphertext = (u8 *)calloc((size_t)CHUNKSIZE, sizeof(u8));

    ECRYPT_encrypt_bytes(&ctx, plaintext, ciphertext, CHUNKSIZE);

    //showData(ciphertext, "CIPHERTEXT");

    result = (u8 *)calloc((size_t)CHUNKSIZE, sizeof(u8));

    ECRYPT_decrypt_bytes(&ctx, ciphertext, result, CHUNKSIZE);
    printf("And now decrypting back: [%s]\n", result);

    return 0;
}

void showData(u8 *data, u8 *header) {
    printf("\n-----BEGIN %s-----\n%s\n-----END %s-----\n", header, data, header);

}

void getRandomBytes(u8 **str, u32 len) {
    int fd = open("/dev/random", O_RDONLY);
    char *ptr = malloc((size_t) + 1);

    read(fd, ptr, len);
    close(fd);

    ptr[len] = '\0';
    *str = ptr; 
}

Die Ergebnisse sind wie:

Verschlüsselung [DIES IST EIN TEST] mit zufälligem 256-Bit-Schlüssel und 64-Bit-IV: Und jetzt entschlüsseln zurück: [(Bündel von zufälligen Zeichen)]

Wo es sein sollte:

Und jetzt die Entschlüsselung zurück: [DIES IST EIN TEST]

Sie können Ihre Lösung entweder in C oder C++ bereitstellen.

Ich danke Ihnen!

5voto

janm Punkte 17342

Wenn Sie Salsa20 in echtem Code verwenden wollen und Fragen wie diese stellen, möchten Sie wahrscheinlich die NaCl-Bibliothek mit freundlichen C++-Wrappern verwenden.

Siehe Die NaCl-Website .

Um Ihre eigentliche Frage zu beantworten: Sie müssen den IV für den Entschlüsselungsvorgang neu einrichten. Der IV besteht aus Ihrer Nonce und einem Block-Offset. Die Verschlüsselungs-/Entschlüsselungsfunktionen erhöhen den Offset und geben Ihrem Code einen anderen IV für die Ver- und Entschlüsselungsfunktionen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X