Frage zu Verschlüsselungsklasse



  • Hi,

    den Code für AES habe ich von hier:
    http://www.lomont.org/Software/Misc/AES/AES.php

    Mein Code funktioniert zwar, aber die Werte (für numBlocks und die Arraygrößen) sind mehr oder weniger geraten und ich würde gerne wissen welche Werte dort wirklich eingesetzt werden müssen.

    #include <string>
    #include <iostream>
    #include "aes.h"
    
    int main()
    {
    
    	AES a;
    
    	a.SetParameters(128);
    
    	std::string KEY;
    	std::getline(std::cin, KEY);
    	std::string INPUT = "just a test!";
    
    	a.StartEncryption((unsigned char *) KEY.c_str());
    
    	int n = INPUT.length()/8;
    	char *out = new char[INPUT.length() + 32];
    	a.Encrypt((unsigned char *) INPUT.c_str(), (unsigned char *) out, n);
    
    	std::getline(std::cin, KEY);
    	a.StartDecryption((unsigned char *) KEY.c_str());
    
    	char *out2 = new char[INPUT.length() + 32];
    	a.Decrypt((unsigned char *) out, (unsigned char *) out2, n);
    
    	printf("%s\n", out2);
    
    	delete[] out;
    	delete[] out2;
    }
    

    Danke,
    Ency



  • Schau doch einfach mal in den Header rein

    http://www.lomont.org/Software/Misc/AES/AES.h

    (Wer lesen kann ist klar im Vorteil)



  • loks schrieb:

    Schau doch einfach mal in den Header rein

    http://www.lomont.org/Software/Misc/AES/AES.h

    (Wer lesen kann ist klar im Vorteil)

    Ich habe mir die Header natürlich angeguckt sonst wäre ich auch überhaupt nicht so weit gekommen. Trotzdem bin ich mir nicht so sicher, wie ich es nun richtig mache und aus dem Grund frage ich nun hier nach 🙂

    Vielen Dank,
    Ency



  • EXAMPLE: want to encrypt 37 bytes of data with 192 bit key, which will use 3 16 byte blocks
    AES aes;
    aes.SetParameters(192);
    aes.StartEncryption(key);
    aes.Encrypt(data,output,3); // note data and output must be at least 48 bytes!

    Also, für Leute die in Mathe nicht so stark sind.

    37 bytes data in Blöcken zu 16 byte = 37 / 16 = 2,31 Blöcke. Da nur ganze Blöcke gehen wird auf 3 Blöcke aufgerundet.

    3 Blöcke zu 16 byte = 3 * 16 = 48 byte, also müssen die buffer je 48 bytes groß sein



  • loks schrieb:

    EXAMPLE: want to encrypt 37 bytes of data with 192 bit key, which will use 3 16 byte blocks
    AES aes;
    aes.SetParameters(192);
    aes.StartEncryption(key);
    aes.Encrypt(data,output,3); // note data and output must be at least 48 bytes!

    Also, für Leute die in Mathe nicht so stark sind.

    37 bytes data in Blöcken zu 16 byte = 37 / 16 = 2,31 Blöcke. Da nur ganze Blöcke gehen wird auf 3 Blöcke aufgerundet.

    3 Blöcke zu 16 byte = 3 * 16 = 48 byte, also müssen die buffer je 48 bytes groß sein

    Vielen Dank. Habe es jetzt geschafft 🙂

    Doch eine Frage habe ich noch: Was muss ich ändern um mit Unicode arbeiten zu können? Ich habe schon versucht alles durch wchar_t zu ersetzen, aber dann schlägt folgendes assert fehl:

    // we'll brute force the inverse table
    
    /* Zeile 211: schlägt fehl */ assert(GF2_8_mult(0x57,0x13) == 0xFE); // test these first
    assert(GF2_8_mult(0x01,0x01) == 0x01);
    assert(GF2_8_mult(0xFF,0x55) == 0xF8);
    

    Ich weiß leider nicht, was diese Zeilen genau machen und verstehe den Fehler daher nicht. Vermutlich muss der Wert für wchar_t anders lauten? Weiß es nicht...

    Vielen Dank,
    Ency



  • Ency schrieb:

    Was muss ich ändern um mit Unicode arbeiten zu können? Ich habe schon versucht alles durch wchar_t zu ersetzen...

    du musst einfach nur deine daten als bytes betrachten. AES arbeitet byte-orientiert. diese soganannten 'galois field' funktionen in wchar_t umzustricken, macht keinen sinn.
    🙂



  • ~fricky schrieb:

    Ency schrieb:

    Was muss ich ändern um mit Unicode arbeiten zu können? Ich habe schon versucht alles durch wchar_t zu ersetzen...

    du musst einfach nur deine daten als bytes betrachten. AES arbeitet byte-orientiert. diese soganannten 'galois field' funktionen in wchar_t umzustricken, macht keinen sinn.
    🙂

    Muss ich bei der Größe des Arrays etwas ändern? Bis jetzt mache ich es so:

    // Anzahl der Blöcke
    int n = ceil( (float) ((INPUT.length() * sizeof(INPUT[0])) / 16 ) );
    
    // Entschlüsseln
    wchar_t *out = new wchar_t[n * 16];
    a.Encrypt((unsigned char *) INPUT.c_str(), (unsigned char *) out, n);
    
    // Verschlüsseln:
    wchar_t *out2 = new wchar_t[n * 16];
    a.Decrypt((unsigned char *) out, (unsigned char *) out2, n);
    

    Mein Problem: Wenn ich einen Text eingebe, dann wird dieser nicht komplett entschlüsselt. Führe ich aber vorher noch n += 3; aus dann klappt alles. Es muss also etwas mit der Größe zu tun haben. Nur was? Jemand eine Idee.



  • Ency schrieb:

    Mein Problem: Wenn ich einen Text eingebe, dann wird dieser nicht komplett entschlüsselt. Führe ich aber vorher noch n += 3; aus dann klappt alles.

    naja, das liegt wohl daran, dass AES eine blockchiffre ist. d.h. du musst deinen text mit nullen auffüllen, damit er ein vielfaches von 16 bytes lang wird.
    🙂



  • ~fricky schrieb:

    Ency schrieb:

    Mein Problem: Wenn ich einen Text eingebe, dann wird dieser nicht komplett entschlüsselt. Führe ich aber vorher noch n += 3; aus dann klappt alles.

    naja, das liegt wohl daran, dass AES eine blockchiffre ist. d.h. du musst deinen text mit nullen auffüllen, damit er ein vielfaches von 16 bytes lang wird.
    🙂

    Aber ich habe mal dies probiert:

    int n = ceil( (float) (INPUT.length() * sizeof(INPUT[0])) / 16  ) + 1;
    

    So scheint es zu klappen. Wäre das denn jetzt korrekt? Würde es gerne möglichst korrekt programmieren.



  • Ency schrieb:

    int n = ceil( (float) (INPUT.length() * sizeof(INPUT[0])) / 16  ) + 1;
    

    So scheint es zu klappen. Wäre das denn jetzt korrekt? Würde es gerne möglichst korrekt programmieren.

    ^^kann sein dass das geht. die formel scheint aber zu kompliziert zu sein. um die anzahl von 16'er blöcken aus einer anzahl an bytes zu berechnen, würde ich's so machen:

    anzahl_blocks = (laenge+15)/16
    

    🙂


Anmelden zum Antworten