Thema: Delphi Hacken bei RSA-Verfahren

Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#6

Re: Hacken bei RSA-Verfahren

  Alt 19. Nov 2003, 14:56
Deine Exponentation scheint mir nicht richtig zu sein. Hier mal die beiden möglichen Varianten. Beachte auch das diese Verfahren nur mit M,B < 2^16 korrekt arbeiten können. Wird stattdessen Int64 benutzt so liegt die Schranke bei 2^31. Größere Zahlen erzeugen in den Multiplikationen Überläufe.
Exponent E mus größer 1 sein, es sind also keine speziellen Abfragen drin für E <= 0 !

Delphi-Quellcode:
function ExpModLR(B,E,M: Integer): Integer;
// Bottomup Exponentation, wie im PDF beschrieben
var
  T: Integer;
begin
  Result := 1;
  T := B;
  while E > 1 do
  begin
    T := (T * T) mod M;
    E := E shr 1;
    if Odd(E) then Result := (Result * T) mod M;
  end;
end;

function ExpModRL(B,E,M: Integer): Integer;
// Topdown Exponentation, wie die meisten math. Bibliotheken sie nutzen
// Beachte Basis B bleibt konstant, dadurch sind spezielle Optimierungen möglich.
// Es wird eine Multiplikation weniger durchgeführt als obige Exponentation
// Die Abfragen Log2(E) und IsBitSet(E) sind in math. Bibliotheken sehr effizient
// durchzuführen. Dadurch wird Exponent E ebenfalls konstant.

  function Lg2(V: Cardinal): Integer;
  // Result := Trunc(Log2(V))
  asm
      BSR EAX,EAX
  end;
  {begin
    Result := 0;
    while V > 1 do
    begin
      Inc(Result);
      V := V shr 1;
    end;
  end;}


  function IsBitSet(V: Cardinal; Index: Integer): Boolean;
  asm
     BT EAX,EDX
     SETC AL
  end;
{  begin
    Result := Odd(V shr Index);
  end;}


var
  I: Integer;
begin
  Result := B;
  for I := Lg2(E) -1 downto 0 do
  begin
    Result := (Result * Result) mod M;
    if IsBitSet(E, I) then
      Result := (Result * B) mod M;
  end;
end;
Gruß Hagen
  Mit Zitat antworten Zitat