AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Rijnadel in Delphi nicht gleich wie das in PHP
Thema durchsuchen
Ansicht
Themen-Optionen

Rijnadel in Delphi nicht gleich wie das in PHP

Ein Thema von hedie · begonnen am 14. Feb 2008 · letzter Beitrag vom 15. Feb 2008
Antwort Antwort
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#1

Rijnadel in Delphi nicht gleich wie das in PHP

  Alt 14. Feb 2008, 17:13
Hallo

Ich habe in Delphi folgende Units eingebunden

http://www.michael-puff.de/Developer...agen_Reddmann/

Damit erzeuge ich einen Rijndael Verschlüsselten String

Benutzen dazu folgenden code
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
with TCipher_Rijndael.Create do
try
  Init('Passwort');
  showmessage(EncodeBinary('Deins', TFormat_HEX));
finally
  Free;
end;
end;
Nun wollte ich in PHP auch den selben Rijndael String erzeugen.

Als ich nach ca 1 Stunde endlich die LIBMcrypt zum laufen brachte und auch noch einen Rijndale String bekam,
musste ich zu meiner enttäuschung feststellen, das diese nicht identisch sind.

Der code dazu:
Code:
$key = 'Passwort';
$string = 'Deins';
$td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = str_repeat(chr(0), $iv_size);
if (mcrypt_generic_init($td, $key, $iv) != -1) {
$c_t = mcrypt_generic($td, $string);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
}
echo bin2hex($c_t);
Nun meine Fragen:

Wo sehe ich wie hoch die Bitrate ist in Delphi? (128,256..)
Weshalb gibt es in Delphi keinen solchen parameter wie in PHP ofb einer ist?

Und die wichtigste:

Was kann ich tun damit die Strings identisch werden?

Ich danke euch schon jetzt für eure Antworten


Liebe Grüsse
Claudio
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Rijnadel in Delphi nicht gleich wie das in PHP

  Alt 14. Feb 2008, 20:10
In deinem PHP-Script benutzt du einen Initialationsvektor:
Code:
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = str_repeat(chr(0), $iv_size);
In deinem Delphi Code aber nicht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#3

Re: Rijnadel in Delphi nicht gleich wie das in PHP

  Alt 14. Feb 2008, 20:12
probier mal

Delphi-Quellcode:
with TCipher_Rijndael.Create do
try
  Mode := cmOFB8;
  Init('Passwort');
  showmessage(EncodeBinary('Deins', TFormat_HEX));
finally
  Free;
end;
Allerdings scheint es so das du Rijndael-256Bit benutzt. Wenn das Passwort das du mit Init() übergibts zu kurz ist benutzt DEC intern immer einen Rijndael-128 Bit. Der ist schneller und mit einem zu kurzem Passwort macht eine Verschlüsselung mit mehr als 128 Bit keinen Sinn. Dies sugertiert nur Sicherheit wo keine ist.

Versuche als im PHP den 'Rijndeal-128' zu allozieren.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

Re: Rijnadel in Delphi nicht gleich wie das in PHP

  Alt 14. Feb 2008, 20:19
Doch er nutzt einen IV, geht garnicht anders da man immer einen IV benutzt sobald ein CipherMode <> cmECB benutzt wird
Der Standard-InitVector im DEC ist die Wiederholung von $FF.

Möchtest du $00 als IV benutzten dann benutze .Init('Passwort', '', $00); Dabei wird der zb. 8/16 Bytes große IV mit dem Byte $00 gefüllt.
Möchtest du einen komplett individuellen IV benutzt dann geht das mit .Init('Passwort', TFormat_HEX.Decode('0102030405060708...')); oder mit .Init(Password[1], Length(Password), IV, SizeOf(IV)); wobei dann IV eine Datenstruktur ist die exakt Cipher.Context.BlockSize Bytes groß sein muß.
Es gehen also alle Kombinationen mit fast allen datentypen.

Kryptographisch betrachtet sollte man dem IV aber nicht allzuviel Bedeutung beimessen. Es ist besser, statt einem Zufalls-IV, diese Zufallsdatenblock vor die Nachricht zu hängen und dann alles mit festen IV, zb. $FFFFFFFFFFF...FFF, zu verschlüsseln. Der Zufallsdatenblock der also am Anfang der Nachricht steht hat die exakt gleiche Wirkung wie ein externer IV, nur mit dem Untewrschied das er eben verschlüsselt übertragen wird. Ein normaler IV wird unverschlüsselt übertragen. Ergo: die methode den Zufalls-Datenblock in die zu verschl. Naricht einzubetten muß sicherer sein.


Gruß Hagen
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#5

Re: Rijnadel in Delphi nicht gleich wie das in PHP

  Alt 14. Feb 2008, 22:39
Danke für die Antworten

Doch leider klappt es nicht....

Delphi Code:
Delphi-Quellcode:
with TCipher_Rijndael.Create do
try
  Mode := cmOFB8;
  Init('Passwort', '', $00);
  showmessage(EncodeBinary('Deins', TFormat_HEX));
finally
  Free;
end;
Delphi Ausgabe: 095FB1905A

PHP Code:
Code:
$key = 'Passwort';
$string = 'Deins';
$td = mcrypt_module_open('rijndael-128', '', 'ofb', '');
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = str_repeat(chr(0), $iv_size);
if (mcrypt_generic_init($td, $key, $iv) != -1) {
$c_t = mcrypt_generic($td, $string);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
}
echo bin2hex($c_t);
PHP Ausgabe: a1e105e433

Ich habe keine ahnung woran das liegen kann...

Irgendwass mache ich bestimmt falsch... Ich hoffe ihr seht meinen Fehler
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#6

Re: Rijnadel in Delphi nicht gleich wie das in PHP

  Alt 15. Feb 2008, 10:03
Erfolg

Benutze ich diesen Delphi Code

Delphi-Quellcode:
begin
with TCipher_Rijndael.Create do
try
  Mode := cmECBx;
  Init('terertertererfrt');
  showmessage(EncodeBinary('wertzuioplkjhgfd', TFormat_HEXL));
finally
  Free;
end;
Und diesen PHP

Code:
$key = 'terertertererfrt';
$string = 'wertzuioplkjhgfd';
$td = mcrypt_module_open('rijndael-128', '', 'ecb', '');
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = str_repeat(chr(0), $iv_size);
if (mcrypt_generic_init($td, $key, $iv) != -1) {
$c_t = mcrypt_generic($td, $string);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
}
echo bin2hex($c_t);
Dan kommt das gleiche raus...

Aber! Wenn ich in Delphi den zu verschlüsselnden Text ändere, kommt die Meldung:

Code:
Messagelength for cmECBx must be a multiple of 16 bytes.
Ändere ich hingegen den Text in PHP so gibts einfach einen anderen verschlüsselten Text

Was muss ich tun, damit ich mehr als 16 Bytes verschlüsseln kann? Schlussendlich sollen damit auch
Dateien ver und entschlüsselt werden...


Danke schonmal
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#7

Re: Rijnadel in Delphi nicht gleich wie das in PHP

  Alt 15. Feb 2008, 14:25
Delphi-Quellcode:
  with TCipher_Rijndael.Create do
  try
    Mode := cmOFB8;
    Init('Passwort', #0, $00);
    WriteLn(EncodeBinary('Deins', TFormat_HEX));
  finally
    Free;
  end;
ergibt bei mir a1e105e433.

ECB ist ein Modus der immer ganze Blöcke verschlüsseln muß, es gibt bei diesem kein Padding. Wenn also PHP ohne Fehlermeldung es zulässt und man zb. eine 17 Bytes lange Nachricht in diesem Modus verschlüsseln kann, dann ist dies verfahrenstechnisch unsicher. ECB heist Electronic Codebook und das heist soviel wie: lasse den Cipher arbeiten ohne irgendwelches Post-/Preprocessing, ohne Feedback Verküpfungen der Datenblöcke untereinander, damit die vielen Programmierer mit ihren unterschiedlichen Programmirsprachen eine gemeinsamme Basis besitzen mit der man eine Querüberprüfung der Implementationen machen kann. ECB sollte man also niemals so nackig für reale Verschlüsselungen benutzen, es sei denn die Nachrichten sind aus Zufall. Da AES ein Blockciophr ist und mit Blöcken a 16 Bytes arbeitet wird er also die Nachricht in Blöcken a 16 Bytes Länge zerlegen und jeden Block separat verschlüsseln. Da jeder Blockcipher so nur Blockweise richtig ver- und wieder entschlüsseln kann heist dies das eine Nachricht auf eine Länge erweitert werden muß die durch 16 ohne Probleme teilbar ist. Andere Blockcipher benutzen zb. 8 Bytes oder 12 Bytes Blockgröße, je nach Algorithmus. Die Fehlermeldung vom DEC ist also ein Hinweis darauf das du was machen möchtest das technisch nicht korrekt funktionieren kann und kryptographisch keinen Sinn ergibt (ausser um zu testen ob der Programierer der Library seine Arbeit richtig gemacht hat und solche Fehlbenutzungen unterbindet, naja PHP halt )

Gruß Hagen
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#8

Re: Rijnadel in Delphi nicht gleich wie das in PHP

  Alt 15. Feb 2008, 14:33
Woow

Hab vielen Dank hagen für deinen Sehr Interessanten und Langen Beitrag

Ich denke ich weis nun wesshalb es bei mir nicht geklappt hat,

Ich hab #0 nicht geschrieben....

Jiip grad getestet es war das

Danke nochmal
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#9

Re: Rijnadel in Delphi nicht gleich wie das in PHP

  Alt 15. Feb 2008, 16:54
Falls es darum http://www.delphipraxis.net/internal...363&highlight= geht dann findest du am Ende einen fertigen Source um Rapidshare-was-weiß-ich zu ver-/entschlüsseln.

Gruß hagen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 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