AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein RSA - Problem bei der verschlüsselung/entschlüsselung
Thema durchsuchen
Ansicht
Themen-Optionen

RSA - Problem bei der verschlüsselung/entschlüsselung

Ein Thema von schweindi · begonnen am 23. Feb 2010 · letzter Beitrag vom 24. Feb 2010
 
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.754 Beiträge
 
Delphi 12 Athens
 
#13

Re: RSA - Problem bei der verschlüsselung/entschlüsselung

  Alt 24. Feb 2010, 10:10
Zitat von gammatester:
außerdem hat es eine ungewöhnliche Parameterreihenfolge
och, sowas läßt sich ja leicht beheben

- die beiden Parameter umgedreht
- Das Funktionsergebnis über Result, statt Funktionsnamen
* (leichter zu erkennen, ob Funktionsaufruf oder Ergebniszuweisung)
- die Fertig-Variable abgeschaft
Delphi-Quellcode:
program t_mrsa2;

{$ifdef WIN32}
  {$apptype console}
{$endif}

function mod_inv(A, B: LongInt): LongInt;
  {liefert 1 / A mod B}
var
  n1, n2, b1, b2, q, r, t: LongInt;
begin
  if B >= 1 then begin
    n1 := B;
    n2 := A;
    b1 := 0;
    b2 := 1;
    while true do begin
       r := n1 mod n2;
       q := n1 div n2;
       if r = 0 then begin
         if b2 < 0 then b2 := b2 + B;
         Result := b2;
         Break; // oder gleich Exit;
       end;
       n1 := n2;
       n2 := r;
       t := b2;
       b2 := b1 - q * b2;
       b1 := t;
    end;
  end else
    Result := B;
end;

function expmod(b, x, m: LongInt): LongInt;
  var
    quad, halb, erg: LongInt;
   {
    Berechnet die diskrete Exponentialfunktion b hoch x modulo m
    unter ausschließlicher Verwendung der Operationen Quadrieren
    und Multiplizieren. Der Rest wird nach jeder Operation bestimmt,
    um große Zwischenergebnisse zu vermeiden.
    - mod bezeichnet die Modulo-Operation
    - div bezeichnet die ganzzahlige Division
   }

begin
  Quad := b; {Basis}
  Halb := x; {Exponent}
  Erg := 1; {Ergebnis}
  while Halb > 0 do
    begin
      if Halb mod 2 > 0 then
         Erg := (Erg * Quad) mod m;
       Quad := (Quad * Quad) mod m;
       Halb := Halb div 2;
    end;
  Result := Erg;
end;

var
  p, q, n, e, d, phi, i, x, y: LongInt;
begin
  p := 17;
  q := 19;
  n := p * q;
  phi := (p - 1) * (q - 1);
  e := 5;
  d := mod_inv(e, phi);
  WriteLn('d=', d);
  for i := 0 to 255 do begin
    x := expmod(i, e, n);
    y := expmod(x, d, n);
    if y <> i then WriteLn('Fehler: y<>i für i=', i);
    if (i < 11) or (i > 240) then WriteLn(i:5, x:5, y:5);
  end;
end.
Für größere berechnugsräume gibt es Int64.
Extended kann zwar theoretisch größere Werte enthalten, aber es gibt nur 19-20 signifikante Dezimalstellen ... alles andere wird Aufgrund des internen Formates quasi weggerundet.
Int64 hat genausoviele Stellen, aber keine Rundungsfehler.

Für mehr mußt du dann auf andere Mittel ausweichen: BigNumber, BigInt oder Dergleichen
Hier im Forum suchenTBigInt
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz