Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi RSA - Schlüsselerzeugung Problem (https://www.delphipraxis.net/146615-rsa-schluesselerzeugung-problem.html)

thomas42 23. Jan 2010 19:27


RSA - Schlüsselerzeugung Problem
 
So mein erster post hier im Forum. Hoffe er passt hier einiegermaßen rein. :wink:
Ich schreibe jetzt seit einieger Zeit an einem einfachen Programm zur RSA-Verschlüsselung inklusive Key-Erzeugung. Letzteres bereitet mir allerdings Probleme. Der Public Key ist ja noch schnell gefunden, für den Private Key brauch ich aber den erw. Euklidischen Algorithmus. Also kurz gesucht und gefunden, danach dann noch auf BigNumber2 (http://www.delphi-forum.de/viewtopic...hlight=bignum2) umgeschrieben, um an größere Zahlen zu kommen.

Das ganze funktioniert auch soweit, nur ist der Zahlenraum in dem ich Berechnungen durchfüren kann sehr klein.

Ein kleines Beispiel:
Public Key= 160
e= 7
Privatekey= 23
korrekter Privatekey= 23 ->ok
---
Public Key= 1409*1447= 2038823
e= 7
Privatekey= 148334775
korrekter Privatekey= 1454263 -> ???? mehrere dezimalstellen zuviel + andere zahlen

Nun stellt sich die Frage, wie kann ich die Leistungsfähigkeit meines Keygenerators noch steigern, damit ich auch solche Berechnungen ausführen kann? Habe noch ne Funktion zur binären Modulo-Exponentation, die ich auch bei der Verschlüsselung nutze, aber die kann ich ja wohl kaum überall hier einbauen.

Hier jedenfalls erstmal der Quelltest zum erw. Euklid. Algo.:

Delphi-Quellcode:
function invers_mod2(e,m:TBigNumber):TBigNumber;
var m0,x0,x1,y0,y1,xx,yy,q,r:TBigNumber;
    bpos:Boolean;
begin
  m0:=m; x0:=BMD_StrToBigNum('1',false); x1:=BMD_StrToBigNum('0',false); y0:=BMD_StrToBigNum('0',false); y1:=BMD_StrToBigNum('1',false); bPos:=true;
  while BM_CompareNE(e,BMD_StrToBigNum('0',false)) do Begin
    q:= BM_Divide(m,e) ;
    r:= BM_Modulo(m,e);
    m:=e;
    e:=r;
    xx:=x1;
    yy:=y1;
    x1:=BM_Add(BM_Multiply(q,x1),x0);
    y1:=BM_Add(BM_Multiply(q,y1),y0);
    x0:=xx;
    y0:=yy;
    bPos:=not bPos;
  End;
  if(bPos) then y0:=BM_Sub(BMD_StrToBigNum('0',false),y0);
  if BM_CompareL(y0,m) then y0:=BM_ADD(m0,y0);
  result:=y0;
end;
Vorschläge?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz