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!