AES: Test und Meinung
-
Das sind die Momente in denen man hofft, niemals in die Situation zu kommen den Code eines anderes verstehen zu MÜSSEN.
-
cheers, Swordfish
-
Was mich als Anfänger interessieren würde:
Was sind eigentlich die ganzen Hexzahlen-Blöcke am Anfang?
Sind die mit diesen Werten Bestandteil des Algorithmus oder hast Du die selber generiert?
-
Simonek schrieb:
Was mich als Anfänger interessieren würde:
Was sind eigentlich die ganzen Hexzahlen-Blöcke am Anfang?
Sind die mit diesen Werten Bestandteil des Algorithmus oder hast Du die selber generiert?das sind die sboxen (http://de.wikipedia.org/wiki/S-Box) die sind im AES standard vorgegeben.
-
Ich hätte eine Frage zur Verwendung: Was geben encrypt und decrypt genau zurück? Und 'key' ist ein nullterminierter String?
-
aes::encrypt( )
undaes::decrypt( )
geben die Anzahl der Verarbeiteten Blöcke (16 Bytes) zurück, und - ja, der Schlüssel ist ein Null-Terminierter String. Im finalenelse
Zweig inaes::set_key( )
fehlt übrigens einreturn
vorfalse
.Ist schon komisch, wenn man sich alte Sources nach (nur) zwei Jahren wieder ansieht.
cheers, Swordfish
-
ich hab den code ma in meinen compiler eingefügt aber der sagt:
"data.cpp": E2268 Aufruf der undefinierten Funktion '_stricmp' in Funktion main(int,char * *) in Zeile 30
-
Dann ist dein Compiler (welcher?) nicht Standardkonform.
cheers, Swordfish
PS: Du könntest es mit der POSIX-Funktion
stricmp( )
(ohne Unterstrich) versuchen.
-
Dann ist dein Compiler (welcher?) nicht Standardkonform.
Willst du damit sagen das _stricmp zum C++ Standart gehört?
-
Sorry, hab' mich verlaufen.
_stricmp( )
undstricmp( )
sind beide nicht Standard. Die Meisten C/C++ Bibliotheken (glibc, Dinkumware auf jeden Fall) implementieren sie jedoch.Da
_stricmp( )
nur zur Argumentprüfung verwendet wird, kann man es getrost durchstd::strcmp( )
austauschen und beide Strings vor der Prüfung auf Lower-/Uppercase bringen.cheers, Swordfish
-
ich hab ma versucht das auf text anzuwenden, den der benutzer selbst eingibt, aber es klappt net:
#include "aes.h" #include <iostream> using namespace std; int main() { aes AES; char t; char p; char *text = &t; char *pwd = &p; cin >> t; cout << "\n"; cin >> p; AES.encrypt(&text, strlen(&t), pwd); cout << "\n"; cout << "\n"; cout << "Verschlüsselt:\n"; cout << text << endl; AES.decrypt(&text, strlen(&t), pwd); cout << "Entschlüsselt:\n"; cout << text; return 0; }
das is mitlerweile mein 3. versuch aber es will einfach net klappen, abgesehen davon, dass man nur ein zeichen eingeben kann.
wenn ich
a b
eingebe kommt heraus:
Verschlüsselt: V/çàðEŒ/³A;X: Entschlüsselt: $I¡QŒ-'ͳôçâ'ÙÄ
-
Naja, was bei deinem Code rauskommt ist eher Zufall als Verschlüsselung.
Du solltest dich mal mit Pointern und Zeichenkettenrepräsentation in C/C++ beschäftigen, das gelernte dann wieder verdrängen undstd::string
nehmen Kurz gesagt: in einenchar
passt nur ein einzelnes Zeichen.Ein Beispiel:
#include <iostream> #include "aes.h" int main( ) { std::string input; std::string password; // Eine Zeile nach 'input' lesen: std::cout << "Bitte geben Sie den zu verschluesselnden Text ein:\n"; std::getline( std::cin, input ); // Ein Wort als Key nach 'password' lesen: std::cout << "Bitte geben Sie ein Passwort ein: "; std::cin >> password; // Eine 'aes'-Instanz: aes AES; // Den Text zur Kontrolle einmal als Text, einmal als Hex-Werte ausgeben: std::cout << "\n\nUnverschluesselter Text:\t\"" << input << "\"\n"; std::cout << "Unverschluesselte Daten:\t"; for( std::string::iterator i = input.begin( ); i != input.end( ); ++i ) { std::cout << "0x"; std::cout.width( 2 ); std::cout.fill( '0' ); std::cout << std::hex << static_cast< int >( *i ) << " "; } // Ein char-Array zum rumspielen mit AES daraus backen: size_t length = input.length( ); char *data = new char[ length ]; std::copy( input.begin( ), input.end( ), data ); std::cout << "\n\nVerschluesselung...\n\n"; // <- nomen est omen size_t blocks = AES.encrypt( &data, length, const_cast< char* >( password.c_str( ) ) ); // Verschluesselte Daten ausgeben (nur Hex, als Zeichenkette bringt's ned wirklich was...) std::cout << "Verschluesselte Daten:\t\t"; for( size_t i = 0; i < ( blocks * 16 ); ++i ) { // wir haben 'blocks' blöcke à 16 Bytes bekommen std::cout << "0x"; std::cout.width( 2 ); std::cout.fill( '0' ); std::cout << std::hex << ( static_cast< int >( data[ i ] ) & 0x0ff ) << " "; } std::cout << "\n\nEntschluesselung...\n\n"; // <- ... one way, or another, i'm gonna ... decrypt u! resistance is futile!!!111elf *sing* AES.decrypt( &data, blocks * 16, const_cast< char* >( password.c_str( ) ) ); // vorsicht: mehr Daten! length = strlen( data ); // Entschluesselte Daten als Hex-Werte und Text anzeigen. std::cout << "Entschluesselte Daten:\t\t"; for( size_t i = 0; i < length; ++i ) { std::cout << "0x"; std::cout.width( 2 ); std::cout.fill( '0' ); std::cout << std::hex << ( static_cast< int >( data[ i ] ) & 0x0ff ) << " "; } std::cout << "\nEntschluesselter Text:\t\t" << data << std::endl; }
cheers, Swordfish
-
Wenn du nach 2 Jahren immer noch Kommentare zum Code willst: das Ganze in 'ne Klasse zu packen find ich haesslich
-
Mich wundert dass noch niemand was über die IMO grauenhafte Idee gesagt hat Speicher in der encrypt/decrypt Funktion zu reallokieren.
-
@Blue-Tiger: Ich nach zwei jahren auch
@hustbaer: Sorry, *kleinlaut* ich sag's ja: Den Speicher in encrypt/decrypt zu realloziieren ist GRAUENHAFT!Mal sehen, wahrscheinlich werd ichs refaktorieren und noch Blowfish dazustricken.
cheers, Swordfish
-
Hi @ll
beim compilieren kommt es leider zu Fehlern:Erzeugen [Linker Fehler] Unresolved external 'aes::~aes()' referenced from C:\DOKUMENTE UND EINSTELLUNGEN\ADMINISTRATOR\DESKTOP\AESTETE\UNIT1.OBJ [Linker Fehler] Unresolved external 'aes::aes()' referenced from C:\DOKUMENTE UND EINSTELLUNGEN\ADMINISTRATOR\DESKTOP\AESTETE\UNIT1.OBJ [Linker Fehler] Unresolved external 'aes::encrypt(char * *, unsigned int, char *)' referenced from C:\DOKUMENTE UND EINSTELLUNGEN\ADMINISTRATOR\DESKTOP\AESTETE\UNIT1.OBJ [Linker Fehler] Unresolved external 'aes::decrypt(char * *, unsigned int, char *)' referenced from C:\DOKUMENTE UND EINSTELLUNGEN\ADMINISTRATOR\DESKTOP\AESTETE\UNIT1.OBJ
Könnt ihr mir weiter helfen?
-
Du musst die .cpp-Datei mitkompilieren.
-
Vielen Dank!
Jetzt klappt es endlich!Edit:
Könnte jemand, oder der Autor selbst, die Klasse/das Programm so umschreiben, dass man mit AnsiString arbeiten kann. Bin leider ein AnfängerWähre sehr nett!
MFG StYleZ
-
@StYleZ: verwende doch einfach eine Fertige Library wie die crypto++.
Und was bitte meinst du mit "AnsiString"? Blubb?
-
AnsiString ist ein Datentyp und wird in Borland C++ Builder (VCL) verwendet.
Zu Crypto++:
Bisher hab ich nur Tutorials für die Implementierung von Crypto++ in VC++ gefunden.
Da ich mehr oder weniger Anfänger bin, habe ich keinen schimmer, wie ich Crypto++ im C++ Builder implementieren soll und geschweige den benutzen.Deswegen habe ich um ein Beispiel gebeten.