Thema: Delphi Hacken bei RSA-Verfahren

Einzelnen Beitrag anzeigen

Meisterschmied

Registriert seit: 3. Nov 2003
45 Beiträge
 
#3

Re: Hacken bei RSA-Verfahren

  Alt 18. Nov 2003, 20:43
Danke Hagen,

scheint es aber nicht zu sein. Ich komm zwar auch auf deinen Wert, aber die Verschlüsselung klappt nicht besser. Bei diesen Werten bekomme ich (wenn ich 26 verschlüsseln will) für

m^e mod n = 26^3 mod p*q = 17576

und

c^d mod n = 32184

Ich hab mal meinen Code reingeschrieben (das ist die Kurzform, dich ich aus Codeschnipseln in eine neue Anwendung geschrieben habe - ist sonst sehr viel länger...). Ich muss außerdem noch kurz warnen, dass er fürchterlich ist, trotzdem scheint er zu funktionieren. Das war oberste Priorität. Schönheit und Effizienz kommt später (für Tipps bin ich aber natürlich immer zu haben ).

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, d, p, q : integer;
begin
  p := 227;
  q := 251;
  a := lcm(226,250);
  d := 3;

  repeat
  Inc(d);
  until ((3*d - 1) mod a) = 0;

  Edit1.Text := IntToStr(d);   // 9417

  Edit2.Text := IntToStr(FastExponation(26,3,p*q)); // 17576
  Edit3.Text := IntToStr(FastExponation(StrToInt(Edit2.Text),d,p*q)); // 32184

end;

function lcm(A, B: Integer): Integer;
begin
  if A = B then Result := Abs(A) else
    if (A = 0) or (B = 0) then Result := 0
      else Result := Abs(A div gcd(A, B) * B);
end;

function gcd(a, b : integer): Integer;
var
  H : Integer;
begin
// Wir verwenden den Euklidischen Algorithmus zur Bestimmung des größten
// gemeinsamen Teilers (gcd = greatest common divisor)

while b > 0 do
  begin
    H := a mod b;
    a := b;
    b := H;
  end;

  Result := a;

end;

function FastExponation(J, exp, n : integer): Integer;
var
  Base, I, T : integer;
begin
  IntToBin(exp);

  Base := J;
  T := Base;
  For I := 2 To length(Bin)-1 do begin
    T := (T*T) mod n;
    If Bin[I] = 1 Then T := (T*Base) mod n;
  end;
  Result := T;
end;

function IntToBin(Int: integer): string;
var
  I : integer;
begin
  BinS := '';
  // Erzeugung eines Binärstrings
  repeat
    BinS := IntToStr(Int mod 2) + BinS;
    Int := Int div 2;
  until Int = 0;

  Setlength(Bin, Length(BinS)+1);

  // In ein Array zerlegen
  For I := 1 To Length(BinS) do
  Bin[I] := StrToInt(Copy(BinS,I,1));

end;
Danke schon mal,

Wieland
  Mit Zitat antworten Zitat