Frage

Ich möchte eine sehr große Datei (~ 50 GO) XOR.

Genauer gesagt möchte ich dies tun, indem ich jeden Block von 32 Bytes einer Klartextdatei (wegen mangelnder Speicher) mit dem Schlüssel 3847611839 und erstellen (Block nach Block) eine neue Verschlüsselungsdatei.

Danke für jede Hilfe !!

War es hilfreich?

Lösung

Das klang nach Spaß und klingt nicht nach einer Hausaufgabe.

Ich habe keine zuvor XOR-verkrümmte Datei zu versuchen, aber wenn Sie einen zurück und vorwärts konvertieren, gibt es keinen Unterschied.

Dass ich mindestens versucht habe. Genießen! :) Dies ist alle 4 Bytes mit 0xe555e5bf, ich nehme an, das ist es, was Sie wollten.

Hier ist Bloxor.c

// bloxor.c - by Peter Boström 2009, public domain, use as you see fit. :)

#include <stdio.h>

unsigned int xormask = 0xE555E5BF; //3847611839 in hex.

int main(int argc, char *argv[])
{
    printf("%x\n", xormask);
    if(argc < 3)
    {
        printf("usage: bloxor 'file' 'outfile'\n");
        return -1;
    }

    FILE *in = fopen(argv[1], "rb");
    if(in == NULL)
    {
        printf("Cannot open: %s", argv[2]);
        return -1;
    }

    FILE *out = fopen(argv[2], "wb");

    if(out == NULL)
    {
        fclose(in);
        printf("unable to open '%s' for writing.",argv[2]);
        return -1;
    }
    char buffer[1024]; //presuming 1024 is a good block size, I dunno...

    int count;

    while(count = fread(buffer, 1, 1024, in))
    {
        int i;
        int end = count/4;
        if(count % 4)
            ++end;

        for(i = 0;i < end; ++i)
        {
            ((unsigned int *)buffer)[i] ^= xormask;
        }
        if(fwrite(buffer, 1, count, out) != count)
        {
            fclose(in);
            fclose(out);

            printf("cannot write, disk full?\n");

            return -1;
        }
    }

    fclose(in);
    fclose(out);

    return 0;
}

Andere Tipps

Wie Starblue in einem Kommentar erwähnt: "Seien Sie sich bewusst, dass dies bestenfalls Verschleierung und nicht Verschlüsselung ist". Und es ist wahrscheinlich nicht einmal Verschleierung.

Eine Eigenschaft von Xor ist das (Y xor 0) == Y. Dies bedeutet für Ihren Algorithmus, dass für den Ort in Ihrer sehr großen Datei, in dem sich Nullen läuft (was angesichts der Größe der Datei ziemlich wahrscheinlich ist), Ihr Schlüssel in der Verschlüsselungsdatei angezeigt wird. Schlicht wie Tag.

Ein weiteres schönes Merkmal von XOR verschlüsseltem Zeug ist, dass, wenn jemand sowohl den Klartext als auch den Cipher -Text hat, XOR diese Elemente miteinander zusammenfassen. Wenn die Person weiß, dass die 2 Dateien ein Klartext-/Ciphertext -Paar sind, haben sie den Schlüssel gelernt, der schlecht ist, wenn der Schlüssel für mehr als eine Verschlüsselung verwendet wird. Wenn der Angreifer nicht sicher ist, ob der Klartext und der Ciphertext zusammenhängen, haben er danach eine ziemlich gute Idee, da der Schlüssel ein wiederholtes Muster in der Ausgabe ist. Nichts davon ist ein Problem mit einem Zeitpunkt, da jedes Bit des Schlüssels nur einmal verwendet wird, sodass man etwas Neues aus diesem Angriff lernt.

Viele Leute machen den Fehler, davon auszugehen, dass eine XOR -Verschlüsselung in Ordnung ist, wenn die ausgeführte grundlegende Operation dieselbe ist, weil eine einmalige Pad nach nach nachfolgend unzerbrechlich ist. Der Unterschied besteht darin, dass ein einmaliges Pad jedes zufällige Bit des Schlüssels genau einmal verwendet. Wenn der Klartext unter anderem eine Reihe von Nullen hat, wird nichts über den Schlüssel gelernt, im Gegensatz zu einer einfachen XOR-Chiffre mit fester Schlüsseln.

Wie Bruce Schneier sagte: "Es gibt zwei Arten von Kryptographie auf dieser Welt: Kryptographie, die Ihre Kinderschwester davon abhalten, Ihre Dateien zu lesen, und Kryptographie, die große Regierungen daran hindern, Ihre Dateien zu lesen."

Eine Xor -Chiffre ist kaum eine Kinderschwester -Beweise - wenn auch das auch.

Sie müssen eine Lösung um eine Streaming -Architektur herstellen: Sie lesen die Eingabedatei in "Stream", ändern sie und schreiben das Ergebnis in der Ausgabedatei.

Auf diese Weise müssen Sie nicht die gesamte Datei gleichzeitig lesen.

Wenn Ihre Frage ist, wie es geht, ohne zusätzlichen Speicherplatz auf der Festplatte zu verwenden, würde ich nur in den Stücken in Vielfachen von 32 Bytes (so groß wie möglich) gelesen, mit dem Stück im Speicher arbeiten und dann erneut aufschreiben. Sie sollten in der Lage sein, die zu verwenden ftell und fseek Funktionen, dies zu tun (unter der Annahme Ihrer Annahme long Typ ist natürlich groß genug).

Es kann Seien Sie schneller, um die Datei Speicher zu machen, wenn Sie so viel aus Ihrem Adressraum heraussparen können (und Ihr Betriebssystem unterstützt sie), aber ich würde zuerst die einfachste Lösung versuchen.

Wenn Platz kein Problem ist, lesen Sie natürlich die Stücke ein und schreiben Sie sie in eine neue Datei, so etwas wie das folgende (Pseudo-Code):

open infile
open outfile
while not end of infile:
    read chunk from file
    change chunk
    write chunk to outfile
close outfile
close infile

Diese Art von Lese-/Prozess/Schreiben ist ziemlich grundlegend. Wenn Sie kompliziertere Anforderungen haben, sollten Sie Ihre Frage mit ihnen aktualisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top