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 */ } }; #endifDanke!
-
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
chdie unsigned char, die ich meine....So rufe ich die Methode auf. Und er meckert rum.
Praktisch also
char help[1];?
-
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...
-
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.