Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi hagen reddman dec (https://www.delphipraxis.net/158374-hagen-reddman-dec.html)

darknes 15. Feb 2011 12:24

Delphi-Version: 7

hagen reddman dec
 
hallo hagen es geht um deine compnente dec wenn ich diesen code verwende
Delphi-Quellcode:
function md4(s:string):string ;
begin
s:=THash_MD5.Create.DigestStr(nil);
result:=s;
end;
bekomme ich einen error an follgender stelle in meinem quellcode
Delphi-Quellcode:
result := GetMD5(IntToHex(x,0));
Zu meiner frage wie muss ich es anpssen das ich deinen code wie diesen hier benutzen kann
Delphi-Quellcode:
result := MD5DigestToStr(MD5String(s));//erstellt einen md5hash
Da es bei dir diese function nicht gibt.

himitsu 15. Feb 2011 13:19

AW: hagen reddman dec
 
MD4 oder MD5 ... was nun?

Wieso wird der Parameter "s" nicht genutzt?

Wann gibst dudas mit
Delphi-Quellcode:
THash_MD5.Create
erstellte Objekt wieder frei?

Di übergist DigestStr ein nil und wunderst dich dann, daß es eventuell knallt?

darknes 15. Feb 2011 14:29

AW: hagen reddman dec
 
Es soll md5 sein die function heisst nur md4(testzwecke).

Selbst wenn ich es freigebe:

Delphi-Quellcode:
t:THash_MD5;
begin
t:=THash_MD5.Create;
t.init;
Result:=t.DigestStr(TFormat_MIME64);
t.done;
end;
Der md5 string soll ja für diese functionen sein;
Delphi-Quellcode:
function GetUser: string; // Function to get UserName
var // Declaring our variables
StrUserName: PChar; // PointerChar
Size: DWord; // DWORD integer Begin //
Begin
Size:=250; // Set size to 250 (max UN length)
GetMem(StrUserName, Size); // Allocate some memory
GetUserName(StrUserName, Size); // API to get UN
result := StrPas(StrUserName); // Return the UN
FreeMem(StrUserName); // Free up the allocated memory
end;

 Procedure RSADecrypt(CT : String; D : String; N : String; var PT : String);
 Var
 c,d1,n1,p : TFGInt;
Begin
ConvertHexStringToBase256String(CT,CT);
Base256StringToFGInt(CT,c);
ConvertHexStringToBase256String(D,D);
Base256StringToFGInt(D,d1);
ConvertHexStringToBase256String(N,N);
Base256StringToFGInt(N,n1);
FGIntModExp(c,d1,n1,p); // C ^ D mod N
FGIntToBase256String(P,PT);
ConvertBase256StringToHexString(PT,PT);
FGIntDestroy(c); // Destroy FGInt (important!)
FGIntDestroy(d1); // Destroy FGInt (important!)
FGIntDestroy(n1); // Destroy FGInt (important!)
FGIntDestroy(p); // Destroy FGInt (important!) End;

end;

function HexToInt(s : string) : Int64; // Convert HEX to Int64 integers
begin // Begin
if (s <> '') and (s[1] <> '$') then // If s != &#8216;&#8217; and s[1] is not $ then
result := strToInt64('$' + s ) // Convert &#8216;$&#8217;+s to Int64 ($ = HEX)
else // Else
result := strToInt64(s); // Convert s to Int64 end;

end;


function Part1(s: string): string; // Part 1
var // Declaring variables
i, x : integer; // Counter and Holder as integers
begin // Begin
x := 0; // Initialize x as 0
for i := 1 to length(s) do // For 1 to 32 do
begin // Begin
x := x + HexToInt(s[i]); // hier knallt es wenn ich oben den code verwende
end; // End
result := new_md5(IntToHex(x,0)); // Get the MD5 of x
end;

function Part2(s: string): string; // Part 2
var // Declaring Variables
i, j, x : integer; // 2 Counters and a holder as integers begin //
Begin
i := 1; // Initialize i as 1
j := 2; // Initialize j as 2
x := 0; // Initialize x as 0
while i <= length(s) do // If i <= 32, then execute loop begin //
Begin
x := x + HexToInt(s[i] + s[j]); // Pair
inc(i,2); // Increment counter
inc(j,2); // Increment counter
end; // End
result := new_md5(IntToHex(x,0)); // Get the MD5 of x oder hier
end;


function Part3(s: string): string; // Part 3
var // Declaring variables
arr : array [1..8] of string; // Array [1..8] of strings
i, x : integer; // Counter and Holder as integers begin //
Begin
arr[1] := s[01] + s[02] + s[03] + s[04]; // I got a little lazy here...
arr[2] := s[05] + s[06] + s[07] + s[08]; // Manually splitting the MD5 into
arr[3] := s[09] + s[10] + s[11] + s[12]; // Groups of 4... made possible by
arr[4] := s[13] + s[14] + s[15] + s[16]; // The creators of Copy/Paste &#402;º
arr[5] := s[17] + s[18] + s[19] + s[20]; // Still going...
arr[6] := s[21] + s[22] + s[23] + s[24]; // And going...
arr[7] := s[25] + s[26] + s[27] + s[28]; // Almost...
arr[8] := s[29] + s[30] + s[31] + s[32]; // Finally!
x := 0; // Initialize x as 0
for i := 1 to 8 do // 1 to length of the array do loop begin //
Begin
x := x + HexToInt(arr[i]); // Groups of 4
end; // End
result := new_md5(IntToHex(x,0)); // Get the MD5 of x
end;

function Part4(s: string): string; // Part 4
var // Refer to Part 3 for more info...
arr : array [1..4] of string;
i, x : integer;
begin
arr[1] := s[01] + s[02] + s[03] + s[04] + s[05] + s[06] + S[07] + s[08];
arr[2] := s[09] + s[10] + s[11] + s[12] + s[13] + s[14] + s[15] + s[16];
arr[3] := s[17] + s[18] + s[19] + s[20] + s[21] + s[22] + s[23] + s[24];
arr[4] := s[25] + s[26] + s[27] + s[28] + s[29] + s[30] + s[31] + s[32];
x := 0;
for i := 1 to 4 do
begin
x := x + HexToInt(arr[i]);
end;
result := new_md5(IntToHex(x,0));
end;

function Part5(s: string): string; // Part 5
var // Refer to Part 3 for more info...
arr : array [1..4] of string;
x : int64;
i : integer;
begin
x := 0;
arr[1] := s[01] + s[02] + s[03] + s[04] + s[05] + s[06] + s[07] + s[08] +
          s[09] + s[10] + s[11] + s[12] + s[13] + s[14] + s[15] + s[16];

arr[2] := s[17] + s[18] + s[19] + s[20] + s[21] + s[22] + s[23] + s[24] +
          s[25] + s[26] + s[27] + s[28] + s[29] + s[30] + s[31] + s[32];
for i := 1 to 2 do
begin
x := x + HexToInt(arr[i]);
end;
result := new_md5(IntToHex(x,0));
end;


procedure TForm1.btn1Click(Sender: TObject);
Var // Declaring variables
A,b: string; // Strings &#8216;a&#8217; and &#8216;b&#8217; (b = serial)
begin // Begin
a := Part1(new_md5(GetUser)); //Part 1
a := Part2(a); // Part 2
a := Part3(a); // Part 3
a := Part4(a); // Part 4
a := Part5(a); // Part 5 { RSA Decrypt the final MD5 hash (result goes in &#8216;b&#8217;): }
RSADecrypt(a,'3E6CBE18ABF0172741C8A583CA54402D',
'D679E4D420CF78D335DC9AD165F9D819',b);
edt1.text := b; // Print out serial end; // End
end;
Wie gesagt das hier geht bei dec ja nicht.
//function GetMD5(s: string): string; // Gets MD5 hash for what’s sent begin //
//Begin
//result := MD5DigestToStr(MD5String(s)); // Calculate MD5 hash hier wird s genutzt
//end;

gammatester 15. Feb 2011 15:11

AW: hagen reddman dec
 
Du mußt doch wohl auch angeben, von was der Hash berechnet werden soll. Diese Zeilen
Delphi-Quellcode:
  t := THash_MD5.Create;
  t.init;
  writeln(t.calcbinary('abc', TFormat_Hex));
  writeln(t.calcbinary('abc', TFormat_MIME64));
liefern zB die richtigen Werte für den Ansistring 'abc':
Code:
Hex:   900150983CD24FB0D6963F7D28E17F72
Mime64: kAFQmDzST7DWlj99KOF/cg==

Deep-Sea 15. Feb 2011 15:55

AW: hagen reddman dec
 
Zitat:

Zitat von darknes (Beitrag 1081843)
Selbst wenn ich es freigebe:

Delphi-Quellcode:
t:THash_MD5;
begin
t:=THash_MD5.Create;
t.init;
Result:=t.DigestStr(TFormat_MIME64);
t.done;
end;

Freigeben? Ja wo denn? Es müsste dieser Form folgen (was es nicht tut):
Delphi-Quellcode:
begin
  LokaleVariable := TEineKlasse.Create;
  try
    // Tue etwas mit LokaleVariable ...
  finally
    LokaleVariable.Free;
  end;
end;

alzaimar 15. Feb 2011 16:09

AW: hagen reddman dec
 
Einen dermaßenen Kommentar-Overkill habe ich noch nie gesehen. :shock:
Delphi-Quellcode:
Begin // Begin
  i := 0; // Initialize i as 0
  inc(i); // Increment i
:wall:
Ein gutes Programm kommt ganz ohne Kommentare aus

himitsu 15. Feb 2011 16:54

AW: hagen reddman dec
 
Ich wollte das noch nicht ansprechen. (PS: selbst Begin kann man kommentieren? :shock: )
Aber mal im Ernst, ist dir aufgefallen, daß sich dadrin auch ein wichtiger Kommentar versteckt, welcher für uns Helfer bestimmt ist?

Ganz ohne nicht, aber nur das Wichtige, welches man wirklich nicht so einfach verstehen kann.

darknes 15. Feb 2011 18:55

AW: hagen reddman dec
 
Deswegen wollte ich die md5 unit von dec verwenden.
Hier wird der md5 string ja generiert aber diese function geht bei mir nicht da die md5.pas einen fehler anzeigt.
Delphi-Quellcode:
//function GetMD5(s: string): string;
//Begin
//result := MD5DigestToStr(MD5String(s)); //stammt aus der md5.pas die ich hier gefunden habe
//end;
Und in hex wird der md5 ja hier umgewandelt :
Delphi-Quellcode:
result := new_md5(IntToHex(x,0));
Hier wird doch der benutzer name in hex umgewandelt:
Delphi-Quellcode:
Part1(new_md5(GetUser));
Allso kann man keinen normalen md5 string generiren mit dieser unit?
@gammatester teste doch einfach mal die getmd5 function und du siehst was rauskommt.
Der md5 string soll ja für die anderen sachen erstellt werden nicht für 'abc'
sondern einen md5 string für den MD5 Hash the UserName

lbccaleb 15. Feb 2011 19:19

AW: hagen reddman dec
 
Zitat:

Zitat von darknes (Beitrag 1081968)
Hier wird der md5 string ja generiert aber diese function geht bei mir nicht da die md5.pas einen fehler anzeigt.

Ja was denn für ein Fehler? Vllt solltest du diesen mal genau benennen damit man dir hier weiter helfen kann!

darknes 15. Feb 2011 19:30

AW: hagen reddman dec
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok hier an diese stelle
Delphi-Quellcode:
MD5Update(Context, @Buffer, ReadBytes);
zeigt ihr mir diesen error an [Error] md5.pas(407): Incompatible types: 'Array' and 'TByteArray'
hier ist die md.pas die ich verwende.
Da ich nichts an der md5.pas geändert habe verstehe ich bei diesem error nur bahnhof.

gammatester 15. Feb 2011 19:35

AW: hagen reddman dec
 
Zitat:

Zitat von darknes (Beitrag 1081968)
Deswegen wollte ich die md5 unit von dec verwenden.
Hier wird der md5 string ja generiert aber diese function geht bei mir nicht da die md5.pas einen fehler anzeigt.
Delphi-Quellcode:
//function GetMD5(s: string): string;
//Begin
//result := MD5DigestToStr(MD5String(s)); //stammt aus der md5.pas die ich hier gefunden habe
//end;
Und in hex wird der md5 ja hier umgewandelt :
Delphi-Quellcode:
result := new_md5(IntToHex(x,0));
Hier wird doch der benutzer name in hex umgewandelt:
Delphi-Quellcode:
Part1(new_md5(GetUser));
Allso kann man keinen normalen md5 string generiren mit dieser unit?
@gammatester teste doch einfach mal die getmd5 function und du siehst was rauskommt.
Der md5 string soll ja für die anderen sachen erstellt werden nicht für 'abc'
sondern einen md5 string für den MD5 Hash the UserName

[Dies zum inzwischen gelöschten Teil]
Was immer es ist, auf jeden Fall nicht der MD5-Hash von 'abc'? Und schon gar nicht berechnet mit einer Deiner Code-Schnipsel.

Außerdem: Durch Zahlen zählen erhält man klein MD5 Hash.
Außerdem: Wieso wird neuerdings für RSA eine MD5 benötigt?

Im übrigen finde ich Deine Reaktion etwas - na sagen wir - merkwürdig. Du hast offensichtlich wenig Ahnung, wie Du zu einem richtigen Hashdigest kommst, 'findest' ein md5.pas Unit, die aber nicht funktioniert, willst deshalb DEC benutzen, und ich soll mal irgendeine weitere dieser Obskuritäten testen?

Was für ein Kraut rauchst Du eigentlich, um auf solche Ideen zu kommen?

Jetzt speziell auf den letzten Teil. Willst Du damit sagen, daß Du keine Ahnung hast, wie man von 'abc' auf einen beliebigen String verallgemeinert? Dann laß bitte die Finger von MD5 und erst recht von RSA.

darknes 15. Feb 2011 19:58

AW: hagen reddman dec
 
Das hab ich nicht gesagt und ich rauche kein was auch immer.

RSA Decrypt the final MD5 hash (result goes in 'b')
D679E4D420CF78D335DC9AD165F9D819 //b oder auch modul N base 16 format size 128 bits oder liege ich da falsch?
Hier aus der md5.pas

Delphi-Quellcode:
{ The MD5String function evaluates the MD5 hashsum for
  a string. The S parameter specifies a string to
  evaluate hashsum }
function MD5String(const S: string): TMD5Digest;
und hier das andere
Delphi-Quellcode:
{ The MD5DigestToStr function converts the result of
  a hashsum evaluation function into a string of
  hexadecimal digits }
function MD5DigestToStr(const Digest: TMD5Digest): string;
und meine function die ich verwenden wollte aber die nicht geht.
Delphi-Quellcode:
function GetMD5(s: string): string;
Begin
result := MD5DigestToStr(MD5String(s));//hier wird doch die md5 hashume in einen string umgewandelt oder liege ich da falsch?
end;

Klaus01 15. Feb 2011 20:20

AW: hagen reddman dec
 
Guten Abend,

mit Deiner angehängten MD5.pas funktioniert der folgende Code
ohne Murren.


Delphi-Quellcode:
uses
  md5;


procedure TForm1.Button1Click(Sender: TObject);
begin
  edit2.Text := MD5DigestToStr(Md5String(Edit1.Text));
end;
Nachtrag:
Meine Delphi Version: TDE 2006
Was ist denn Deine: >= 2009 -> String = Unicode String


Grüße
Klaus

darknes 16. Feb 2011 12:22

AW: hagen reddman dec
 
Meine delphi version ist delphi 7 lite full welche version das genau ist kann ich dir nicht sagen scheint eine gemodde version von delphi 7 second edition zu sein.
Genau deswegen verstehe ich nur bahnhof bei jedem anderen geht diese md5.pas nur bei mir nicht.
Hab erst gedacht es läge an den vista api´s deswegen hab eine neuinstallation ohne diese api´s gemacht selber fehler.
Rsa kann sehr woll md5 verwenden für C da ja

Encrypt Cipher_text = M ^ E MOD N
Decrypt Message text = C ^ D MOD N

Oder hab ich das jetzt auch falsch verstanden?

Wollte es so lösen :
Delphi-Quellcode:
function new_md5(s:string):string ;
var
  t:THash_MD5;
begin
  t:=THash_MD5.Create;
  try
  t.Init;
Result:=t.CalcBinary('s',TFormat_HEX);
t.Done;
finally
  t.Free; //hier wird THash_MD5 freigelassen.
end;
end;
aber wenn ich das verwende bekomme ich einen range check error.
Delphi-Quellcode:
if (s <> '') and (s[1] <> '$') then

gammatester 16. Feb 2011 12:45

AW: hagen reddman dec
 
Zitat:

Zitat von darknes (Beitrag 1082173)
Meine delphi version ist delphi 7 lite full welche version das genau ist kann ich dir nicht sagen scheint eine gemodde version von delphi 7 second edition zu sein.
Genau deswegen verstehe ich nur bahnhof bei jedem anderen geht diese md5.pas nur bei mir nicht.
Hab erst gedacht es läge an den vista api´s deswegen hab eine neuinstallation ohne diese api´s gemacht selber fehler.
Rsa kann sehr woll md5 verwenden für C da ja

Encrypt Cipher_text = M ^ E MOD N
Decrypt Message text = C ^ D MOD N

Oder hab ich das jetzt auch falsch verstanden?

Noch ein letzer Versuch:

Das ist doch aber völlig unerheblich ob C aus einem MD5 Hashherkommt oder erwürfelt wurde.

Wenn es immer noch dieser Fehler ist,
Zitat:

Zitat von darknes (Beitrag 1081976)
Ok hier an diese stelle
Delphi-Quellcode:
MD5Update(Context, @Buffer, ReadBytes);
zeigt ihr mir diesen error an [Error] md5.pas(407): Incompatible types: 'Array' and 'TByteArray'
hier ist die md.pas die ich verwende.
Da ich nichts an der md5.pas geändert habe verstehe ich bei diesem error nur bahnhof.

dann kann ich mir beim besten Willen nicht vorstellen, wie Du da hinkommst, denn das ist ja in der
Delphi-Quellcode:
function MD5Stream(const Stream: TStream): TMD5Digest;
und Du verwendest (zumindest was Du bisher gezeigt hast) ja keine Streams.

Im übrigen habe ich schwere Sicherheitsbedenken bei Deinem Code: 128-Bit RSA ist viel viel zuwenig um sicher zu sein. Aber viel schlimmer ist die "Security by Obscurity" durch Deine Part1- bis Part5- Verwurschtelungen. Ist Dir eigentlich bewußt, daß allein Part1 höchsten 9 Bit Sicherheit erzeugt, wenn die 128 Eingangsbits zufällig sind, da Du 32 4-Bit-Werte summierst. Part2 bis Part5 werden diese 9 Bit Zufall noch weiter runterdrücken.

darknes 16. Feb 2011 13:02

AW: hagen reddman dec
 
Nein der fehler hat sich doch geändert hab ich oben verbessert aber ich lande an dieser stelle im code mit md5.pas wie gesagt warum auch immer da ich keine streams verwende wie du schon gesagt hast.
Das 128 zu wenig sind ist mir schon klar aber das ist nicht für eine software die ich schützen will.
Sagt dir das word keygenme etwas besser gesagt in diesem falle tut_me.
Ich hoffe das thema ist hier erlaubt wenn nicht tut es mir leid.

lbccaleb 16. Feb 2011 13:15

AW: hagen reddman dec
 
Zitat:

Zitat von darknes (Beitrag 1082188)
Das 128 zu wenig sind ist mir schon klar aber das ist nicht für eine software die ich schützen will.
Sagt dir das word keygenme etwas besser gesagt in diesem falle tut_me.

Ja wieso sollte es nicht erlaubt sein? Verboten ist es ja erst wenn du an fremden Dateien rumfuhrwerkst, wo der Programmierer nicht möchte das du das machst! Diese Art von Programmen, sin da ja dafür gemacht geknackt zu werden. Sicher ist deren Funktion fraglich, vor allem für dich, da du dich anscheinend mit der Materie noch nicht so auskennst. Vllt solltest du daher erstmal Anfangen, mit Programmen die auch einen Nutzen haben, und nicht nur als Übungszweck für irgendwelche Hacker bereitstehen.

darknes 16. Feb 2011 13:41

AW: hagen reddman dec
 
Ich kenne mich schon mit dieser Materie aus nur halt auf dem wege des pachtens hab erst zwei keygens geschrieben beide waren aber ohne cryptos und dieser hier ist ja für mich zum lernen gedacht nicht für sonstige zwecke.
Wobei das eine kein richtiger keygen ist da die serial nicht random ist.
Da ein echter keygen random serials ausgibt die aber immer gültig sind.
Das mit dem kraut rauchen könnte man alls falsche unterstellung anzeigen nur so alls tip.
Back to topic :
Wenn ich dich auf sonstige art beleidigt habe tut es mir leid @gammatester

negaH 16. Feb 2011 21:46

AW: hagen reddman dec
 
Ok, ich gebe zu für einen unerfahrenen Delphientwickler ist die korrekte Benutzung der DEC THash Klassen bischen ungewohnt.

Alle .Calc???() Methoden der THash Klassen sind als Klassenmetoden deklariert. Dh. du benutzt

Delphi-Quellcode:
  WriteLn( THash_M5.CalcBinary('abc', TFormat_HEX) );
  WriteLn( THash_SHA1.CalcFile('c:\test.txt', TFormat_MIME) );
oder

Delphi-Quellcode:
var
  MyClass: THashClass;
begin
  MyClass := THash_MD5;
  WriteLn( MyClass.CalcBinary(.....) );
end;
In den obigen Beispielen wird per Einzeiler und mit Hilfe von Klassenmethoden alles in einem Rutsch berechnet, was die häufigste Anwendungen ist.

Nur in den selteneren Fällen benutzt man die Hash Klassen im DEC auf die gewohnte und herkömliche Weise:

Delphi-Quellcode:
var
  Hash: TDECHash;
  Data: array[0..2] of Byte;
begin
  Hash := THash_MD5.Create;
  try
    Hash.Init;
    Hash.Calc(Data[0], 1);
    Hash.Calc(Data[1], 2);
    Hash.Done;
    Result := Hash.DigestStr(TFormat_HEX);
  finally
    Hash.Free;
  end;
end;
In diesem Beispiel sieht man die einschlägige Vorgehensweise mit der Erstellung einer Objektinstanz. Deweiteren benutzt man die Methode .Calc() mit typlosen Zeiger auf Datenbereiche und Angabe der zu berechneden Datenbytes.

Man benutzt dies so wenn man, wie oben im Bespiele gezeigt, über getrennte Daten/Speicherbereiche eine Berechnung durchführen muß so als wenn diese zusammenhanglosen Datenbereiche ein einziger Datenbereich wäre. Also Zb. wenn man komplexere Datenstruktren/Records in/aus Streams speichdert/lädt und im gleichen Atemzug auch einen Hash berechnen möchte.

Die zweite Methode der Benutzung der Hashklassen ist also eher die Ausnahme und dient der Komnpatibilität und der Implementation besonderer Verfahren/Protokolle. Siehe dazu zB. die Medthoden .KDF?() und .MGF?() an die quasi dynmische Datenbereiche errechnen, diese mit den übergebenen Datenberechen verkettet und so eine Berechnung stückchenweise durchführen so als hätte man diese Daten in einem Datenbereich erstmal vorher berechnet.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 Uhr.

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