Michael R - Di 09.12.03 05:22
Titel: Brauche Hilfe bei Client-Server APP / AES Verschlüsselung
Ich versuche gerade eine Verschlüsselung zwischen einer Delphi Anwendung und einem PHP Server zu verwirklichen. Gewählt habe ich dafür AES/rijndael-128. In beiden Fällen nutzte ich standart Komponenten.
Delphi: TDCP_rijndael Component (DCPcrypt Cryptographic Component
Library v2)
PHP: mcrypt-Module
Beide Seiten arbeiten, :? Jedoch leider unterschiedlich :!: Die Ergebnisse der Verschlüsselungen passen nicht obwohl ich den selben Key und iv verwende. Ich habe nicht die leiseste Ahnung was ich falsch mache. Beispiele sowohl Ausgabe als auch Source sind unten. (Ich vermute, das der Fehler beim IV liegt)
:?: :?: Ist dort draussen IRGENDJEMAND der mir einen Hinweis geben kann :?: :?:
-------------------------------------------------------------
OUTPUT DELPHI
--------------------------------------------
Message (32): abcdefghABCDEFGHabcdefghABCDEFGH
key (8 ) : a7bc27da
iv (16 ): 1234567890123456
crypted dezimal (32): 186 235 158 205 73 220 102 143 180 191 61 223 142
151 162 105 49 42 14 146 177 40 148 37 165 219 5 11 196 50 223 5
decrypted (32): abcdefghABCDEFGHabcdefghABCDEFGH
--------------------------------------------
OUTPUT PHP
--------------------------------------------
Message (32): abcdefghABCDEFGHabcdefghABCDEFGH
key (8 ) : a7bc27da
iv (16): 1234567890123456
crypted dezimal (32): 85 159 135 147 169 17 58 218 94 196 193 195 194
113 84 193 128 48 98 152 7 240 200 114 148 67 95 11 88 169 42 236
decrypted (16): abcdefghABCDEFGHabcdefghABCDEFGH
--------------------------------------------
SOURCE DELPHI
--------------------------------------------
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| First the code procedure TForm1.Button1Click(Sender: TObject); var indata, outdata : array[0..200] of byte; my_message, key, ivstr, chiff, klar : string; IV : array[0..15] of byte; i : integer; begin memo1.clear;
my_message := 'abcdefghABCDEFGHabcdefghABCDEFGH'; key := 'a7bc27da'; ivstr := '1234567890123456';
for i := 0 to 15 do iv[i] := ord(ivstr[i+1]); for i := 0 to 200 do indata[i] := 0; for i := 0 to 200 do outdata[i] := 0; for i := 0 to length(my_message)-1 do indata[i] := ord(my_message[i+1]);
DCP_rijndael1.init(key,sizeof(key)*8,@iv); DCP_rijndael1.EncryptCBC(indata,outdata,length(my_message));
chiff:=''; klar:=''; for i := 0 to length(my_message)-1 do begin chiff := chiff + chr(outdata[i]); klar := klar + inttostr(outdata[i])+' '; end;
memo1.lines.add('Message ('+inttostr(length(my_message))+'): '+my_message); memo1.lines.add('key ('+inttostr(length(key))+'): '+key); memo1.lines.add('iv ('+inttostr(length(ivstr))+'): '+ivstr); memo1.lines.add('crypted dezimal ('+inttostr(length(chiff))+'): '+klar);
for i:=0 to 200 do indata[i]:=0; DCP_rijndael1.init(key,sizeof(key)*8,@iv); DCP_rijndael1.DEcryptCBC(outdata,indata,length(my_message));
klar:=''; for i:=0 to length(my_message)-1 do klar := klar + chr(indata[i]);
memo1.lines.add('decrypted ('+inttostr(length(klar))+'): '+klar); end; |
--------------------------------------------
SOURCE PHP
--------------------------------------------
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| <?php $message = 'abcdefghABCDEFGHabcdefghABCDEFGH'; $key = 'a7bc27da'; $iv = '1234567890123456';
/* Open the cipher */ $td = mcrypt_module_open ('rijndael-128', '', 'cbc', ''); /* Intialize encryption */ mcrypt_generic_init ($td, $key, $iv); /* Encrypt data */ $encrypted = mcrypt_generic ($td, $message); /* Terminate encryption handler */ mcrypt_generic_deinit ($td);
echo "Message (". strlen($message)."): $message<br>\n"; echo "key (". strlen($key)."): $key<br>\n"; echo "iv (". strlen($iv)."): $iv<br>\n"; echo "crypted dezimal (".strlen($encrypted)."): "; for ($i=0; $i < strlen($encrypted); $i++) { echo ord(substr($encrypted, $i, 1)).' '; } echo "<br>\n"; /* Initialize encryption module for decryption */ mcrypt_generic_init ($td, $key, $iv); /* Decrypt encrypted string */ $decrypted = mdecrypt_generic ($td, $encrypted); /* Terminate decryption handle and close module */ mcrypt_generic_deinit ($td); mcrypt_module_close ($td);
/* Show string */ echo "decrypted (". strlen($iv)."): $decrypted<br>\n"; ?> |
stiftmaster - Di 13.09.05 21:56
Hi Leute,
ich bin der Sache heute mal weiter auf den Grund gegangen. Als erstes habe ich mir mal n' Package im Internet organisiert, mit dem man AES in Delphi behandeln kann. Das Teil macht einen Vernünftigen Eindruck. Dann habe ich in Delphi folgendes gecodet:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure TForm1.Button1Click(Sender: TObject); var AES: TCipher_Rijndael; Enc, ivstr: string; I: Integer; IV : array[0..15] of Byte; begin try ivstr := '1234567890123456';
for I := 0 to 15 do iv[I] := ord(ivstr[I + 1]);
AES := TCipher_Rijndael.Create('a7bc27da', nil); AES.Init('a7bc27da', Length('a7bc27da'), @iv); Enc := AES.EncodeString('abcdefghABCDEFGHabcdefghABCDEFGH');
Memo1.Text := ''; for I := 0 to Length(Enc) - 1 do Memo1.Text := Memo1.Text + ' ' + IntToStr(ord(Enc[I])); finally AES.Free; end; end; |
Der PHP-Code von oben habe ich so übernommen - liefert bei mir auch das gleiche Ergebnis. Die Delphi-Variante hingegen, schmeißt mir folgendes an den Kopf:
85 159 135 147 169 17 58 218 94 196 193 195 194 113 84 193 160 92 158 172 219 237 177 165 124 51 29 235 187 118 99
Die ersten 16 Zeichen stimmen doch gut überein - doch dann hörts auf - ab da herrscht das absolute Chaos. Weiß einer von euch, wo da der Fehler ist bzw. hat einer von euch Erfahrung mit der Problematik.
Ich danke euch für eure Hilfe
Stefan