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