[C/C++] RC4 nachbauen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Leon, 19. Januar 2009 .

Schlagworte:
  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:

    Bild

    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;
    }
    
    
     
  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  )
     
    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 )
       
    = ( 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 
    = ( 1 mod LängeVon ( s )
       
    = ( 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 )

     
  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.
     
  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!
     
  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;
    }
    
    
     
  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.
     
  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
     
  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 ^^
     
  9. 26. Januar 2009
    AW: RC4 nachbauen

    hast du recht, ich hab von strlen(key) übernohmen copy & paste. s = '\0'; nach der for-schleife
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.