Autor Beitrag
Michael R
Hält's aus hier
Beiträge: 4

WIN XP, WIN 2000
D5, D8 Professional
BeitragVerfasst: Di 09.12.03 05:22 
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
--------------------------------------------
ausblenden volle Höhe 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..200of byte;
  my_message, key, ivstr, chiff, klar : string;
  IV : array[0..15of 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);

  //decrypt
  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
--------------------------------------------
ausblenden volle Höhe 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";
?>
lemming
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 470

Mac OS 10.3.1
Delphi 6 Pro, Kylix 3
BeitragVerfasst: Di 09.12.03 10:01 
Ich geh mal davon aus das eine Komponente den Code nicht richtig verschlüsselt. Zwar kommt bei beiden ein Ergebnis raus das auch beide entschlüsseln können, jeddoch nur ihr eigenes verschlüsseltes.

Vielleicht hälst du mal nach einer dritten Anwendung ausschau die dir deinen Text verschlüsselt. Wäre interessant was da raus kommt und welche Komponente (ob Delphi oder PHP) nun richtig tickt.

lemming
stiftmaster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149



BeitragVerfasst: Di 13.09.05 18:03 
hat da jemand schon was rausbekommen. Ich stehe nämlich grade vor dem gleichen Problem...

Stefan
stiftmaster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149



BeitragVerfasst: 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:

ausblenden 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..15of 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