Problem mit RC4 implementierung



  • Hallo,

    ich habe ein Projekt, in dem ich eine RC4 Verschlüsselung anwenden möchte. Nun ist der Teil, den ich Verschlüsseln will, eine sich verändernde unsigned char. Da die von mir verwendete RC4-Klasse aber nur eine Methode zum verschlüsseln von char arraies (genauer char*) überladen ist, kann ich keine einzelnen unsigned chars verschlüsseln.

    Der Fehler entsteht beim Debuggen dann immer an der Stelle, in der strlen() der RC4-Klasse aufgerufen wird. Daher kommt meine Vermutung, dass nur ZeichenKETTEN angenommen werden. Was kann ich tun, damit einzelne unsigned chars verschlüsselt werden?

    Hier nochmals die Klasse:

    #ifndef _BASE64_RC4_
    #define _BASE64_RC4_
    [...]
    class CRC4 
    {
    private:
        unsigned char sbox[256];      /* Encryption array             */
        unsigned char key[256],k;     /* Numeric key values           */
    	int  m, n, i, j, ilen;        /* Ambiguously named counters   */
    public:
    
    	  CRC4 () 
    	  {
    			memset(sbox,0,256);
    			memset(key,0,256);
    	  }
    	  virtual ~CRC4 ()
    	  {							
    			memset(sbox,0,256);  /* remove Key traces in memory  */
    			memset(key,0,256);   
    	  }
    
    	  char *Encrypt(char *pszText,const char *pszKey) 
    	  {
    		    i=0, j=0,n = 0;
    			ilen = (int)strlen(pszKey);
    
    			for (m = 0;  m < 256; m++)  /* Initialize the key sequence */
    			{
    				*(key + m)= *(pszKey + (m % ilen));
    				*(sbox + m) = m;
    			}
    
    			for (m=0; m < 256; m++)
    			{
    				n = (n + *(sbox+m) + *(key + m)) &0xff;
    				SWAP(*(sbox + m),*(sbox + n));
    			}
    
    			ilen = (int)strlen(pszText);
    			for (m = 0; m < ilen; m++)
    			{
    				i = (i + 1) &0xff;
    				j = (j + *(sbox + i)) &0xff;
    				SWAP(*(sbox+i),*(sbox + j));  /* randomly Initialize the key sequence */
    				k = *(sbox + ((*(sbox + i) + *(sbox + j)) &0xff ));
    				if(k == *(pszText + m))       /* avoid '\0' beween the decoded text; */
    					k = 0;
    				*(pszText + m) ^=  k;
    			}
    			return pszText;
    
    	  }
    
    	  char *Decrypt(char *pszText,const char *pszKey)
    	  {
    		  return Encrypt(pszText,pszKey) ;  /* using the same function as encoding */
    	  }
    };
    
    #endif
    

    Danke!


  • Mod

    Pack sie in eine Zeichenkette von einem Zeichen Länge? Und denk an die Nullterminerung.

    Was jetzt die einfachste Methode dafür ist, hängt von deinem konkreten Aufruf ab, den ich leider in deinem kryptischen 😃 Code nicht finden kann. wenn ich schon sowas lese: Ambiguously named counters 🙄



  • SeppJ schrieb:

    Pack sie in eine Zeichenkette von einem Zeichen Länge? Und denk an die Nullterminerung.

    Was jetzt die einfachste Methode dafür ist, hängt von deinem konkreten Aufruf ab, den ich leider in deinem kryptischen 😃 Code nicht finden kann. wenn ich schon sowas lese: Ambiguously named counters 🙄

    Das ist nicht meine Klasse.

    rc4.Encrypt((char*)ch,"a");

    Dabei ist ch die unsigned char, die ich meine....

    So rufe ich die Methode auf. Und er meckert rum.

    Praktisch also char help[1]; ?


  • Mod

    skullyan schrieb:

    rc4.Encrypt((char*)ch,"a");

    Das compiliert? 😕

    Praktisch also char help[1]; ?

    Nein.

    SeppJ schrieb:

    Und denk an die Nullterminerung.

    char help[2]={ch,0};
    


  • SeppJ schrieb:

    skullyan schrieb:

    rc4.Encrypt((char*)ch,"a");

    Das compiliert? 😕

    Praktisch also char help[1]; ?

    Nein.

    SeppJ schrieb:

    Und denk an die Nullterminerung.

    char help[2]={ch,0};
    

    Funktioniert jetzt zwar, aber Programm stürzt nun immer ab. Danke trotzdem...


  • Mod

    skullyan schrieb:

    Funktioniert jetzt zwar, aber Programm stürzt nun immer ab. Danke trotzdem...

    Wenn du es noch ein klein wenig ungenauer beschreibst, könnte man dir sogar helfen 🙄 .

    Ansonsten: Debugger.


Anmelden zum Antworten