Laden...

RSA-Verschlüsselung

Erstellt von prakti08 vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.733 Views
P
prakti08 Themenstarter:in
321 Beiträge seit 2008
vor 15 Jahren
RSA-Verschlüsselung

hi..
ich beschäftige mich grade ein bisschen mit Verschlüsselung und wollte ein beispiel nachprogrammieren...
leider komme ich nicht weiter...

ich habe einen text den ich zeichenweise verschlüsseln möchte...

foreach (char c in x)
            {
              schluessel =  Convert.ToInt64(c);
            }

so habe ich schonmal den zugehoerigen ascii wert...
zum potenzieren braucht man double werte


Math.Pow((double)schluessel,(double)23);

für 116 kommt raus "3,0376221587373076411905554191473e+47";

bis dahin stimmts noch...
mit diesem wert muss ich aber noch modulo rechnen.. und das geht von double nicht...

wenn ich den wert aber umwandeln möchte übersteigt er den wert von dem datentyp long, und es kommt ein negativer wert raus....
wie kann ich das richtig machen?

Use the source, Luke!

Nur, weil man vor sich eine CPU hat, muß man das Denken nicht
einstellen.

P
prakti08 Themenstarter:in
321 Beiträge seit 2008
vor 15 Jahren

ah.. ok..

foreach (char c in x)
            {
              schluessel =  (double)Convert.ToInt32(c);
              zwischenergebnis = Math.Pow(schluessel, (double)23);
              schluessel = zwischenergebnis % 143;
              text += Convert.ToChar((int)schluessel);
            }

geht..

Use the source, Luke!

Nur, weil man vor sich eine CPU hat, muß man das Denken nicht
einstellen.

P
prakti08 Themenstarter:in
321 Beiträge seit 2008
vor 15 Jahren

nee.. stimmt doch nciht...

ergebnis der modulo ist hier in dem fall 74...
müsste aber 51 rauskommen.. (windows taschenrechner)...

woran kann das liegen?

Use the source, Luke!

Nur, weil man vor sich eine CPU hat, muß man das Denken nicht
einstellen.

1.361 Beiträge seit 2007
vor 15 Jahren

Hi prakti08.

Dafür brauchst du einen integralen Datentyp. Du musst mit voller Genauigkeit arbeiten. Und double hat nur eine bestimmte Präzision.

Entweder nimmst du Int64 wie du hattest, aber dann können die Schlüssel eben auch nur so lang sein. Aber fürs Probieren reicht das.

Der Trick ist dabei, dass du nicht potenzierst und danach den Modulo-Rest berechnet, sondern nach jeder Multiplikation (Potenzieren ist ja Hintereinanderausführen von Multiplikation) den Rest berechnet.
Die Mathematik dahinter sorgt dafür, dass das selbe rauskommt 🙂
Das ganze geht dann noch weiter mit schnellem Potenzieren

So bleibst du auch in deinem Datentyp bereich. Wenn deine Schlüssel (und insgesamt die Primzahlen) aber auch größer werden sollen als 32- oder 64-Bit, dann musst du dir einen eigenen Datentyp à la Big-Integer bauen, oder nimmst fertige Implementierungen aus dem Internet.

beste Grüße
zommi

3.971 Beiträge seit 2006
vor 15 Jahren

Den BigInteger gibts bereits auch fertig unter: C# BigInteger Class

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

P
prakti08 Themenstarter:in
321 Beiträge seit 2008
vor 15 Jahren

habs jetzt mal so gelöst...

 private string stringZerlegen(string x,bool verschluesselung)
        {
            int schluessel = 0;
            string text = String.Empty;

            foreach (char c in x)
            {
                if (verschluesselung)
                {
                    schluessel = Convert.ToInt32(c);
                    text += Convert.ToChar(verschluesseln(schluessel));
                }
                else
                {
                    schluessel = Convert.ToInt32(c);
                    text += Convert.ToChar(entschluesseln(schluessel));
                }

            }
            return text;
        }

        private int verschluesseln(int x)
        {
            int schluessel = x;
            int ergebnis = 1;
            int exponent = 23;
            int modulo = 143;
            int sum = 0;
            int mask = 1;

            while (sum < exponent)
            {
                if ((exponent & mask) != 0)
                {
                    ergebnis = (ergebnis * schluessel) % modulo;
                    sum = sum + (exponent & mask);
                }
                schluessel = (schluessel * schluessel) % modulo;
                mask = mask << 1;
            }
            return ergebnis;
        }

das komische ist nur, "u" und "n" 's werden zu "+"... sonst stimmt alles o.O
(beim erneuten entschluesseln)

edit: Fehler gefunden.. die richtextbox in der ich alles anzeige wandelt die ascii zeichen der werte 10,11,13 in \n um und somit sind alle 10, was decodiert ein + wird

Use the source, Luke!

Nur, weil man vor sich eine CPU hat, muß man das Denken nicht
einstellen.

4.207 Beiträge seit 2003
vor 15 Jahren

Den BigInteger gibts bereits auch fertig unter:
>

In .NET 4.0 wird so was ebenfalls enthalten sein, also falls Du damit evtl schon arbeitest ...

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

S
401 Beiträge seit 2008
vor 15 Jahren

Den BigInteger gibts bereits auch fertig unter:
>>

In .NET 4.0 wird so was ebenfalls enthalten sein, also falls Du damit evtl schon arbeitest ...

Warum die .Net-Plattform benutzen, wenn Mono diese bereits zur Verfügung stellt 😉

Gruß,
Thomas

O
778 Beiträge seit 2007
vor 15 Jahren

Warum die .Net-Plattform benutzen

weil wir hier in einem .Net Forum sind? 🙂 Aber ja, man kann auch die Mono-Bibliotheken benutzen, wenn .Net<4.0