Entwickler-Ecke

Sonstiges (Delphi) - Frage zu DCPCrypt


Seven of Nine - Di 24.04.12 21:03
Titel: Frage zu DCPCrypt
Hallo,
Ich kämpfe gerade mit der Einbindung von DCPCrypt

hier ein Stück SourceCode, das so gesehen auch das tut was es soll ;)
ich generiere für AES einen Key und einen IV dazu
übergebe dann ein "gecryptetes" 16 ByteArray (Cipher_Block)
und erhalte das "entcryptete" 16 ByteArray zurück(Cipher_OutData)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Var 
  Cipher : TDCP_rijndael;
  AES_Key :       Array [0..15of Byte = ($32,$43,$f6,$a8,$88,$5a,$30,$8d,  $31,$31,$98,$a2,$e0,$37,$07,$34);
  AES_IV  :       Array [0..15of Byte = ($00,$01,$00,$01,$00,$01,$00,$01,  $00,$01,$00,$01,$00,$01,$00,$01);
  Cipher_Block  : Array [0..15of Byte = ($9b,$dd,$38,$72,$36,$8f,$6d,$67,  $39,$44,$dd,$9e,$14,$29,$3f,$35);
  Cipher_OutData: Array [0..15of Byte;

begin
  Cipher := TDCP_rijndael.Create(nil);
  Cipher.Init      (AES_Key, SizeOf(AES_Key)*8, @AES_IV);
  //Cipher.EncryptCBC(Cipher_InData, Cipher_Block, Length(Cipher_InData) );
  Cipher.Reset;
  Cipher.DecryptCBC(Cipher_Block, Cipher_OutData, Length(Cipher_Block) );
  Cipher.Burn;
  Cipher.Free;
end;


soweit so gut, ABER, ich möchte die Ver/Entschlüsselung nicht mit einem fixen Array (16 Byte)
sondern mit einem dynamischen definierbarem Array of Byte machen dessen Größe ich zur Laufzeit auch merfach ändern könnte.

hierzu würe ich folgende Änderungen zu oben vornehmen



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TByteArray = Array of Byte;

Var 
  Cipher_OutData: TByteArray;  //nicht "Array [0..15] of Byte;"
....
  SetLength(Cipher_OutData,length(Cipher_Block));
  Cipher.DecryptCBC(Cipher_Block, Cipher_OutData, Length(Cipher_Block) );  //wie vorher



ich erhalte dann aber ein "leeres" Byte Array durch die Funktion "Cipher.DecryptCBC(..." zurück
wo liegt mein (Denk)fehler?

lG Martin


uall@ogc - Mi 25.04.12 13:32

Du solltest das nächste mal besser gleich dazuschreiben um welche Komponente es sich handelt. Die Funktion sieht so aus:

Delphi-Quelltext
1:
procedure DecryptCBC(const Indata; var Outdata; Size: longword); virtual;                    

also musst du bei einem Dyn. Array statt
Cipher_Block, Cipher_OutData
immer
Cipher_Block[0], Cipher_OutData[0]
übergeben.

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Seven of Nine - Mi 25.04.12 20:44

Danke für deinen Hinweis Narses, du hast mir dmit geholfen!

wie du völlig korrekt gemerkt hast hatte ich hier im Sourcecode in meinem Aufruf die "[0]" bei der Übergabe vergessen.
Das ganze hatte ich in meinem Testsourcecode zwar drin aber aus versehen hier nicht geschrieben und dort einen fehler bei der Längendefinition eines Der Arays gemacht

wie auch immr jetzt klappts

DICKES DANKE !!!

lG Martin


Narses - Mi 25.04.12 21:05

Moin!

user profile iconSeven of Nine hat folgendes geschrieben Zum zitierten Posting springen:
Danke für deinen Hinweis Narses, du hast mir dmit geholfen!
:shock: :gruebel: Ähm, ich habe nur die Tags dazugebaut, geholfen hat dir user profile iconuall@ogc! :beer: :zustimm:

cu
Narses


Seven of Nine - Mi 25.04.12 21:38

Oupsss, Danke Daniel !


Seven of Nine - So 29.04.12 06:23

Ich kämpfe leider noch immer, bzw. wieder mit dem Thema

Ich möchte eigentlich "Nur" ein vorgegebenes "array of byte" entschlüsseln (Größe vorgegeben zb 20016 bytes)
Ich kenne den zu verwendenden Crypt-Algo -> “128bit aes encryption mit cbc ohne padding“ (ich denke mal das läuft unter "Rjindael")
Key und IV sind bekannt und beide 16 bytes lang

Ich weiß wie das Ergebnis aussehen soll, leider liefert mir mein compilierter Sourcecode nicht das decryptete Ergebnis das ich erwarte
und ich weiß nicht was ich falsch mache. :(

Ich vermute meinen Fehler in der fehlenden Umsetzng des "cbc"
weiß aber nicht wie ich das mit der Komponente machen sollte, bzw ob/wie ich das einstellen muss

was ich mir auch noch denken könnte, ist das ich keine "Hash-Operatione" anwende
mir ist auch ehrlich gesagt nicht ganz klar was diese genau machen, bzw ob ich das überhaupt benötige
(ich will ja "nur" “128bit aes encryption mit cbc ohne padding“ entschlüsseln)

Help please!
hier mein aktueller Code


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
Var
  EncryptedData,  DecryptedData: TByteArray;
  AES_Key, AES_IV : TByteArray;

begin
  SetLength(AES_Key,16);
  AES_Key[0]    := $00;  AES_Key[1]  := $BA//und so weiter bis byte 16
  SetLength(AES_IV ,16);
  AES_IV[0]    := $01;  AES_IV[1]  := $02//und so weiter bis byte 16

  aBlockSize := 20016//or any other number, maybe NOT a factor of 16 Bytes
  Setlength(EncryptedData,aBlockSize);  
  Setlength(DecryptedData, aBlockSize);
  ms.Position := $0 ; //position innerhalb eines memory streams von wo ich die "encrypteten Daten auslese", hier: von Position 0 an
  ms.Read(EncryptedData[0], aBlockSize);  //array of bytes zum entschlüsseln auffüllen 

  Cipher := TDCP_rijndael.Create(nil);
  Cipher.Init(AES_Key, Length(AES_Key)*8, @AES_IV);
  Cipher.Reset;  
  Cipher.DecryptCBC(EncryptedData[0], DecryptedData[0], aBlockSize); //-> ByteArray “DecryptedData” sollte die entschluesselten daten beinhalten, leider passt das derzeit noch nicht;
  Cipher.Burn;
  Cipher.Free;


ich haette natuerlich auch kein Problem eine andere Komponente einzusetzen.
Voraussetzung: ich muesste wissen wie man damit folgenden Job erledigt
- ein vorliegendes Array of Byte mit “128bit aes encryption mit cbc ohne padding“ korrekt entschluesseln


lG Martin


Gammatester - So 29.04.12 13:36

user profile iconSeven of Nine hat folgendes geschrieben Zum zitierten Posting springen:
Ich kämpfe leider noch immer, bzw. wieder mit dem Thema

Warum verwendest Du denn nicht die natürliche Deklaration var AES_Key, AES_IV: array[0..15of byte; sondern dieses unsägliche TByteArray? Und wenn Du es schon (aus welchen Gründen auch immer) hernimmst, warum benutzt Du EncryptedData[0] aber nicht AES_Key[0], AES_IV[0]? TByteArray ist doch dynamisch, also wohl ein Pointer, und Pascal würde eigentich @AES_Key^[0] verlangen. Wer weiß, welches Compilergewusel Delphi dafür @AES_IV veranstaltet? (Meinem Pascalverständnis nach, ist das die Adresse des Pointers AES_Key, aber nicht die Adresse des 0.-ten Bytes). Dem wirst Du ohne Probleme mit dem array[0..15] of byte aus dem Weg gehen.

Gruß Gammatester

PS: Dir ist aber schon klar, daß "128bit aes encryption mit cbc ohne padding" nur mglich ist bei Textlängen, die ein Vielfaches der Blocklänge sind?


Seven of Nine - So 29.04.12 15:01

Hallo Grammatester
Mein Sonntagnachmittag ist gerettet, vielen Dank.
ich hatte mal wieder den Wald vor lauter Bäumen nicht gesehen. Aber ich denke mal genau für so etwas sind Foren wie diese auch da!

Das mit dem Pointer für den IV ist übrigens so normal, liegt an der Defintion der DCPCrypt Init-Routine

Delphi-Quelltext
1:
procedure Init(const Key; Size: longword; InitVector: pointer); virtual;                    


lG Martin