Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

13.06.2007, 20:13

Problem beim implementieren des RSA Algorithmus

Hi leutz,

ich code gerade eine kleine Klasse um Zeichen mit RSA zu verschlüsseln!
Das ganze sieht bisher so aus:

C-/C++-Quelltext

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
#ifndef HPP_KRYPTO
#define HPP_KRYPTO

namespace KRYPTO
{
    class RSA
    {
    private:
        unsigned long inline getcharValue(char zeichen)       ;
    public:
        char encode(unsigned long p, unsigned long q, unsigned long e, char zeichen)  ;
        std::string encode(unsigned long p, unsigned long q, unsigned long e, char zeichen[]);
    };
}

unsigned long inline KRYPTO::RSA::getcharValue(char zeichen)
{
    return static_cast<unsigned long>(zeichen);
}

char KRYPTO::RSA::encode(unsigned long p, unsigned long q, unsigned long e, char zeichen)
{
    unsigned long n = p*q;
    unsigned long m = getcharValue(zeichen);
    unsigned long c = (m^e) % n ;   
    char r = static_cast<char>(c);
    return r;
}
std::string KRYPTO::RSA::encode(unsigned long p, unsigned long q, unsigned long e, char zeichen[])
{
    for(unsigned int i = 0; i<strlen(zeichen); i++)
    {
        zeichen[i] = encode(p,q,e,zeichen[i]);
    }
    std::string text = zeichen;
    return text;
}

#endif


Dieser Header lässt sich prima kompilieren!
Aber wenn ichs ausprobiere kommt etwas unerwartetes dabei raus.
Ich führe das ganze wie folgt aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
int main()
{
    KRYPTO::RSA rsa;
    char arra[] = "HALLOICHMAGMICH";
    std::cout<<arra<<std::endl;
    std::cout<<rsa.encode(3,7,3,arra).c_str()<<std::endl;
    std::cin.sync();
    std::cin.get();
    return 0;
}


Als Ergebnis erhalte ich allerdings eine Zeichenkette die 4 Zeichen weniger hat als der Klartext!
Das darf normalerweise bei einem Blockchiffre nicht sein.
Ich bin dankbar für jede Hilfe
»TheProgrammer«
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

13.06.2007, 20:27

Scheinbar gehst du davon aus, dass der ^-Operator potenziert.
Dies ist nicht der Fall. ^ ist xor.

3

13.06.2007, 20:33

oh ja das wirds dann wohl sein ^^
und was ist der Potenzieroperator?
(Ok ich weiß, dass ist ne nOOb Frage aber ich habs noch nie gebraucht)

»TheProgrammer«
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

Sheddex

unregistriert

4

13.06.2007, 20:39

Es gibt keinen, du musst die Funktion "Pow" aus math.h verwenden oder sie dir eben selber schreiben.

5

13.06.2007, 20:40

okay das hab ich mal gemacht, jetzt siehts so aus, aber bei dem ausführen mit dem Code von oben bekomm ich 3 Zeichen raus obwohl ich 14 eingegeben habe!

C-/C++-Quelltext

1
2
    unsigned long c = (int)pow((long double)m,(int)e);
    c = c % n;
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

13.06.2007, 20:55

Vielleicht ist das vierte Zeichen 0. Das würde die String-Ausgabe als "Ende des Strings" ansehen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

13.06.2007, 21:06

Gib halt mal die rohen Bytes aus. Btw... das is ja ein toller Salat aus unsigned long und rumgecaste... :badgrin:
@D13_Dreinig

8

13.06.2007, 21:31

Zitat

Vielleicht ist das vierte Zeichen 0. Das würde die String-Ausgabe als "Ende des Strings" ansehen.

Ja daran hats gelegen ich habe eine Bedingung vergessen die der Verschlüsselungsexponent erfüllen muss, sobald ich einen legitimen ausgewählt habe gings.
Danke für eure Hilfe
»TheProgrammer«
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

9

14.06.2007, 09:41

@Theprogrammer: Du solltest deine Klasse eventuell nochmal überarbeiten und dir den RSA algo genau ansehen!

Z.B.: ist es sehr langsam den Schlüssel für jedes Zeichen neu zu berechnen, 1 mal würde reichen. Zudem ist die Chifre nur bei großen Blöcken sicher. Dann wäre da noch

C-/C++-Quelltext

1
char KRYPTO::RSA::encode(unsigned long p, unsigned long q, unsigned long e, char zeichen)

Die Größe des neuen Blockes hängt von der Schlüssellänge ab. Bei dir 2*sizeof(unsigned long) aber speichern willst du in 1*sizeof(char). Kann also nicht ganz stimmen.

10

14.06.2007, 18:43

Zitat

Die Größe des neuen Blockes hängt von der Schlüssellänge ab

Das versteh ich jetzt nicht ganz, die Länge des verschlüsselten Blocks ist doch immer gleich der des Klartexts sonst hätte die Formel c = m^e mod n ja keinen Sinn den dadurch das der Modulpooperator angewendet wird kann das Ergebnis nicht größer sein als der zu verschlüsselnde Block, oder nicht?
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

Werbeanzeige