#1 19. Januar 2009 RC4 nachbauen Hallo, versuche gerade den RC4-Algo nachzubauen , momentan stecke ich beim auffüllen des Strings fest. er gibt mir beim ausführen des Programms folgendes aus: Komicherweise schreibt er im Array bis zum Feld 255, aber etwas steht noch dahinter, so komische Zeichen und dann wird auch noch der Inhalt vom data String ausgegeben . Irgendetwas stimmt da also nicht, hier mal der SourceCode: Code: // RC4-Protection.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <string> using namespace std; using std::string; string RC4(char key[],char data[]) { char pwd[256]; strcpy(pwd,key); int pwd_lenght = strlen(pwd); int keyPuffer; int sub[256]; for(int i=0; i < 256; i++) { key[i]=pwd[i%pwd_lenght]; sub[i]=i; } cout << key << strlen(key) << key[255]<< pwd_lenght; return "blub1"; } int _tmain(int argc, _TCHAR* argv[]) { cout<< "blub\n"; char text[256]; char pw[256]; strcpy(text,"Hallo Welt"); strcpy(pw,"geheim"); cout<< RC4(pw,text); getchar(); return 0; } + Multi-Zitat Zitieren
#2 19. Januar 2009 AW: RC4 nachbauen ehm du gibst einen string ein, den lässt du 257 mal wiederholen und fügst Hallo Welt hinten dran. das ende des strings ist glaube ich organisatorisch, sprich \0 oder sowas. ich weiß das leider nicht mehr genau, aber \0 stand irgendwie immer am ende des strings und definierte so mit das ende. ansonsten habe ich hier noch was für dich: PHP: Initialisierung : Setze j = 0 Setze k [] = ( Schlüssel - Zeichenfolge beliebiger Länge > 0 ) Setze s [] = ( sBox - Zeichenfolge der Länge 2 ^ n ) Für i = 0 bis LängeVon ( s ) s [ i ] = i j = 0 Für i = 0 bis LängeVon ( s ) j = ( j + s [ i ] + k [ i mod LängeVon ( k )]) mod LängeVon ( s ) vertausche ( s [ i ], s [ j ]) PHP: Setze i = 0 und j = 0 Wiederhole für alle Zeichen des Nachrichtenstroms i = ( i + 1 ) mod LängeVon ( s ) j = ( j + s [ i ]) mod LängeVon ( s ) vertausche ( s [ i ], s [ j ]) Zufallszeichen = s [( s [ i ]+ s [ j ]) mod LängeVon ( s )] ChiffreZeichen = Zufallszeichen XOR ( nächstes Zeichen des Nachrichtenstroms ) + Multi-Zitat Zitieren
#3 19. Januar 2009 AW: RC4 nachbauen was ich nicht verstehe: Wieso wird "Hallo Welt" ausgegeben? ich benutze ja nirgends das Char Array Data[], wo dieses ja drin steht. deinen Pseudo code werde ich mir mal anschauen und versuchen umzusetzen , vielen dank dafür, BW haste. + Multi-Zitat Zitieren
#4 20. Januar 2009 AW: RC4 nachbauen hallo welt wird ausgegeben weil das am nächsten speicherblock draufsteht. du terminierst deinen string nicht (muss mit '\0' terminiert sein), deswegen wird einfach im speicher weitergelesen und da steht dann irgendwann das hallo welt! + Multi-Zitat Zitieren
#5 20. Januar 2009 AW: RC4 nachbauen So, hab mal versucht den Pseudocode zu implementieren. Nun bekomme ich leider bei der Laufzeit einen Fehler, und zwar kommt folgende Meldung: "integer division by zero" Leider weiß ich nicht wo genau der Wurm steckt Code: // RC4-Protection.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <string> #include <vector> using namespace std; using std::string; void RC4(char key[],char data[]) { char chiffreKey[256]; int j=0; char s[256]; for(int i=0; i< strlen(key); i++) { s[i]=i; } for(int i=0; i< strlen(key); i++) { j=(j + s[i] + key[i%strlen(key)]) % strlen(key); swap(s[i],s[j]); } int i=0; j=0; char randomKey; for(int x=0; x<strlen(key); x++) { i=(i+1) % strlen(key); j=(j+s[i]) % strlen(key); swap(s[i],s[j]); randomKey= s[(s[i]+s[j]) % strlen(s)]; chiffreKey[x] = randomKey ^ data[x]; } cout << chiffreKey; } int _tmain(int argc, _TCHAR* argv[]) { cout<< "blub\n"; char text[256]; char pw[256]; strcpy(text,"Hallo Welt"); strcpy(pw,"geheim"); RC4(pw,text); getchar(); return 0; } + Multi-Zitat Zitieren
#6 20. Januar 2009 AW: RC4 nachbauen benutze den debugger. irgendwo bei den modulo operationen ist der fehler und schau dir genau an wo er und vor allem WANN er durch 0 teilen will, oder bau if's ein für eine 0 division um herauszufinden wo das ist. + Multi-Zitat Zitieren
#7 26. Januar 2009 AW: RC4 nachbauen hi, also ich hab paar stellen gefunden, wo der fehler sein konnte: 1. char s[256]; // signed char wertebereich [-127; 127] for(int i=0; i< strlen(key); i++) { s=i; // was meinst du was passiert, wenn i > 127 ist? } 2. bei einer direkten zuweisung s=i, muss char-array explizit terminiert werden s[strlen(key)] = '\0', sonst hast du bei cout- oder printf-ausgaben fehler. er gibt alle was im speicher ab stelle z.B. s[0] steht bis er eine null gefunden hat. das erklärt warum er dir müll bis "Hello Welt274e6" ausgibt + Multi-Zitat Zitieren
#8 26. Januar 2009 AW: RC4 nachbauen Code: s[strlen(key)] = '\0' Das ist aber nicht gut strlen() macht auch nix anderes, als alle Zeichen bis zum \0 zu zählen, also kannst du den string gleich ohne \0 lassen ^^ + Multi-Zitat Zitieren
#9 26. Januar 2009 AW: RC4 nachbauen hast du recht, ich hab von strlen(key) übernohmen copy & paste. s = '\0'; nach der for-schleife + Multi-Zitat Zitieren