Frage zu Verschlüsselungsklasse
-
Hi,
es klappt alles pefekt, aber ich habe eine (wahrscheinlich) sehr wichtige Frage:
AES_Encrypt(const unsigned char * datain, unsigned char * dataout, unsigned long numBlocks);
Was hat es mit den numBlocks auf sich? Und wie ermittel ich diesen Wert korrekt? Ich habe zum Beispiel folgendes:
char *datain = new char[54]; sprintf(datain, "Ein kleiner Test...");
Wie ermittel ich nun den korrekten Wert für diesen Parameter?
Vielen Dank,
Ency
-
Also 1.wäre ein bißchen mehr info nicht schlecht jetzt
2. nur folgendes vermuten kann:AES verschlüßelt ja immer einen 16 byte Block zu selben zeit. Du musst dann
einfach die Anzahl dieser Blöcke angeben also für ein char array dann:sizeof(datain)/16
(darauf achten das es genau aufgeht)
wie gesagt nur ne vermutung
-
Hi,
den Code für AES habe ich von hier:
http://www.lomont.org/Software/Misc/AES/AES.phpMein 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