Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Hilfe zu RSA Entschlüsselung (https://www.delphipraxis.net/88597-hilfe-zu-rsa-entschluesselung.html)

Tchibo_Tchabo 17. Mär 2007 20:19


Hilfe zu RSA Entschlüsselung
 
Also zuerst möchte ich mich mal entschuldigen dass ich mich hier überhaupt angemeldet habe. Ich habe ehrlich gesagt nicht sehr viel mit Delphi am hut. Meine stärken sind eher so homepage design und so sachen. Aber ich habe ein problem. Unser lehrer will in der 13 jetzt keine Klausur mehr schreiben und hat aufgaben verteilt. Ich habe wohl die AK gezogen und muss ein Programm in Delphi schreiben , was RSA entschlüsselt mit 2 offiziellen Keys. Mathematisch is das ganze kein ding ich habe mich informiert.

Ich bekomme nen Schlüssel M und nen Schlüssel F
und einen Code ...X= 12345 irgendwas ...

F(x)=x^f mod m

mein problem ist jetzt das ganze in delphi zu übertragen.
Wie kann ich das so machen das der vom dem code nur jede einzelne ziffer in die funktion einsetzt und wie setze ich das am ende wieder als ergebnis zusammen... wär echt nett wenn mir jemand helfen könnte , weil das is wohl für so erfahrene leute kein akt.

DGL-luke 17. Mär 2007 20:46

Re: Hilfe zu RSA Entschlüsselung
 
Hallo,

wie wärs damit:

Delphi-Quellcode:
function RSAUncrypt(KeyM,KeyF: Integer,CryptedText: string): string;
const
  Offset = 47;
  i: Integer;
begin
  setlength(Result,length(CryptedText));
  for i := 1 to length(CryptedText) do
    Result[i] := Power(Ord(CryptedText[i])-Offset,KeyF) mod KeyM;
end;
Ich hoffe, durch M und F muss man nicht noch durchiterieren sondern die beiben konstant als Integer.

PS: Habt ihr denn Delphi nicht gelernt in der Schule?

Tchibo_Tchabo 18. Mär 2007 06:17

Re: Hilfe zu RSA Entschlüsselung
 
boah is ja geil ich wusste net das es uncrypt gibt , also als komponente.vielen dank ich probiers gleich mal aus.

danke.

Wir haben delphi gelernt ,aber so einfache sachen wie: Taschenrechner programmieren un son stuß. Ehrlich gesagt haben wir nicht wirklich die lehrer mit ner guten ausbildung , die das draufhaben.Ich hab zumbeispiel nie gelernt das es funktionen gibt oder wie man die überhaupt rausfindet oder so.Dieses offset ist mir auch ganz neu , aber ich will euch net weiter damit stören , ich lese irgendwo nach , was das bedeutet.

PS: Aber warum hast du die Funktion Ord eingefügt? Brauch man diese denn?

Tchibo_Tchabo 18. Mär 2007 06:43

Re: Hilfe zu RSA Entschlüsselung
 
geht leider nicht.

der sagt in der letzten Zeile Operator auf diese Operandentyp nicht anwendbar.

versteh ich grad was falsch oder kann man mit strings nicht rechnen ??

DP-Maintenance 18. Mär 2007 12:54

DP-Maintenance
 
Dieses Thema wurde von "Phoenix" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Hier gehts um Delphi

DGL-luke 18. Mär 2007 13:09

Re: Hilfe zu RSA Entschlüsselung
 
Hallo,

es gibt eine Menge Encryption-Toolsets. z.b. Hagens Hier im Forum suchenDEC, da müsste auch ein RSA-Decrypt drinsein. Aber die Funktion da oben ist mitnichten eine Komponente - die hab ich aus dem Stegreif geschrieben. Was auch die Fehler eventuell erklärt.

Und wenn du einen TR programmieren kannst, sollte dir auch das debuggen der funktion nicht schwerfallen.

Delphi-Referenz durchsuchenOrd wandelt einen Delphi-Referenz durchsuchenChar in seine Position auf der ASCII-Tabelle als Integer um - da die erste Ziffer '0' die Position 48 hat, wandelst du ein '0' in eine 0 um, indem du "Ord('0')-48" ausführst - da kommt nämlich 0 raus.

Wobei man sagen muss, dass meine Konstante "Offset" deshalb noch um eins erhöht werden muss.

Delphi-Referenz durchsuchenPower bzw. Delphi-Referenz durchsuchenIntPower kannst du dazu benutzen, eine Zahl zu potenzieren.

Reicht dir das?

negaH 19. Mär 2007 06:43

Re: Hilfe zu RSA Entschlüsselung
 
Delphi-Quellcode:
function RSAUncrypt(KeyM,KeyF: Integer,CryptedText: string): string;
const
  Offset = 47;
  i: Integer;
begin
  setlength(Result,length(CryptedText));
  for i := 1 to length(CryptedText) do
    Result[i] := Power(Ord(CryptedText[i])-Offset,KeyF) mod KeyM;
end;
Das kann niemals funktionieren

1.) wird mit Fließkommazahlen in Power() gearbeitet und diese können nur maximal 48Bit exakt darstellen. Bei RSA arbeitet man immer mit Ganzzahlen und exakten Berechnngen die auf minidestens 1024 Bit exakt sein müssen. Dh. die Zahlen liegen in Größenordnung 2^1024 und nicht nur 2^48.

2.) wird eine modulare Division im Ganzzahlbereich mit Fließkomma gemischt, das kann der Compiler garnicht übersetzen, inkompatible Datentypen (Power() mod X)

3.) wird die Zahl erst potenziert entstehen rießiggroße Zahlen, rechne mal aus wie groß 2^1024^(2^1024) ist. Dh. überlicherweise rechnet man nicht X^Y mod N so wie es als Formel erscheint, sondern man rechnet mit der Binären Modulare Exponentation die quasi jeden Einzelschritt einer Exponentation modular durchführt. Die maximal größte auftrentende Zahl dabei ist zweimal größer in Bits als das Modul N.
Also auch der Hinweis auf IntPower() ist kontraproduktiv.

4.) wird bei RSA niemals eine Nachricht Zeichenweise ver/entschlüsselt. Dies reduziert die erwünschte Sicherheit des Gesamtverfahrens auf defakto NULL. Normalerseise wird man bei RSA nur in Blöcken a X Bits arbeiten, wobei X meistens >= 1024 ist.

5.) es ist tödlich eine RSA Nachricht direkt mit RSA zu verschlüsseln, dies ist unsicher ! Normalerweise werden heute nur sogenannte Hybridsysteme verwendet. Ein per Zufall erzeugter Schlüssel mindestens 128 Bit groß wird mit RSA verschlüsselt. Die eigentliche Nachricht wird mit einem symmetrischen Verfahren verschlüsselt wobei eben unser Zufallsschlüssel als Passwort dient. Die verschlüsselte Nachricht enthält also mindestens 2 Datenbereiche -> 1.) mit RSA geschützer Zufallskey 2.) Nachricht mit diesem Zufallskey verschlüsselt.

Je nach deiner Aufgabenstellung gehst du folgendermaßen vor:

1.) der Lehrer möchte nur das du demonstrativ RSA erklärst:

- dann reichen Int64 Berechnungen aus da du mit in Wirklichkeit absolut unsicheren Zahlenbereichen arbeiten kannst, quasi Mini-RSA rein zu Demonstration der Mathematik
- du benötigtst eine modulare Exponentation Funktion die du selber schreiben musst. Hier in der DP findest du mehrere Postings dazu -> suche "binäre modulare Exponentation"
- du benötigst eine 3'rd Party Bibliothek die dir mal schnell par Mini-RSA Schlüssel erzeugst die du dann Hardcoded in deinem Source einbaust. Ich meine du willst ja nicht die RSA Schlüsselerzeugung demonstrieren.
- wenn doch benötigst du noch Funktionen zur Primzahlerzeugung (maximal 2^31 Zahlenbereich, auch das findest du hier in der DP)
- und eine Funktion um das Modulare Multiplikative Inverse zu berechnen -> A = B^-1 mod N. Dazu benötigt man den erweiteren euklidschen GCD, auch dafür gibts Source hier in der DP

2.) der Lehrer möchte eine ECHTE RSA von dir
- du benötigst auf alle Fälle eine Bibliothek/Sourcecode der alle notwendigen mathematischen Operationen auf Zahlen der Größenordnung <= 2^4096 berechnen kann
- ich meine ja das deine Lehrer von dir nicht erwarten kann das du selber so eine Lib codest (naja eigentlich doch, aber dazu braucht man zeit)
- deshalb wäre es gerechtfertig eine fertige Library zu benutzen, auch das gibts für Delphi, jedoch ist die Auswahl in JAVA und C/C++ größer
- die weiteren Schritte sind gleich zu 1.)


Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 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