Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Problem mit RC4 implementierung     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
skullyan
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.02.2009
Beiträge: 471
Beitrag skullyan Mitglied 16:37:56 02.09.2010   Titel:   Problem mit RC4 implementierung            Zitieren

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:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#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
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#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
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#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!

_________________
NULL


Zuletzt bearbeitet von skullyan am 16:44:04 02.09.2010, insgesamt 2-mal bearbeitet
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 13597
Beitrag SeppJ Moderator 16:51:11 02.09.2010   Titel:              Zitieren

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 :D Code nicht finden kann. wenn ich schon sowas lese: Ambiguously named counters :rolleyes:
skullyan
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.02.2009
Beiträge: 471
Beitrag skullyan Mitglied 16:56:21 02.09.2010   Titel:              Zitieren

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 :D Code nicht finden kann. wenn ich schon sowas lese: Ambiguously named counters :rolleyes:


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];?

_________________
NULL
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 13597
Beitrag SeppJ Moderator 17:00:45 02.09.2010   Titel:              Zitieren

skullyan schrieb:

rc4.Encrypt((char*)ch,"a");
Das compiliert? :confused:
Zitat:

Praktisch also char help[1];?
Nein.
SeppJ schrieb:
Und denk an die Nullterminerung.
C/C++ Code:
char help[2]={ch,0};
C/C++ Code:
char help[2]={ch,0};
C/C++ Code:
char help[2]={ch,0};
skullyan
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.02.2009
Beiträge: 471
Beitrag skullyan Mitglied 17:47:42 02.09.2010   Titel:              Zitieren

SeppJ schrieb:
skullyan schrieb:

rc4.Encrypt((char*)ch,"a");
Das compiliert? :confused:
Zitat:

Praktisch also char help[1];?
Nein.
SeppJ schrieb:
Und denk an die Nullterminerung.
C/C++ Code:
char help[2]={ch,0};
C/C++ Code:
char help[2]={ch,0};
C/C++ Code:
char help[2]={ch,0};


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

_________________
NULL
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 13597
Beitrag SeppJ Moderator 19:10:25 02.09.2010   Titel:              Zitieren

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 :rolleyes: .

Ansonsten: Debugger.
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Problem mit RC4 implementierung   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.