Einzelnen Beitrag anzeigen

gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Verständnisfrage: AES-128 entschlüsseln

  Alt 21. Jul 2022, 07:32
Danke.

Nach ein bisschen Einarbeitung allgemein in das Thema AES-CBC und DEC habe ich nun meine Entschlüsselung hingekriegt.
Der Tipp mit DEC war Gold wert!

Eine kurze Frage noch:
Nach meinem "Datenlieferanten" soll ich die korrekte Entschlüsselung daran erkennen, dass im Output die ersten 2 Byte immer mit $2F2F belegt seinen.

Es kann also nicht sein, dass, wenn ich beim IV oder bei ChipherKey einen "Tippfehler" drin habe, dass dann die ersten 2 Byte auch mit $2F2F belegt sind?
Ich muß z.B. den IV pro "Datenpaket" immer wieder neu erstellen/berechnen.
Was, wenn ich dort einen Fehler drin habe ...?

--Edit:
Das sehe ich jetzt erst! Und ich wundere mich, wieso das Ganze keinen Sinn ergibt^^
Irgend wie scheint die Entschlüsselung doch nicht zu funktionieren.

Die Bytes von 9 bis 16 sind falsch. Der Rest passt.
Falsch:
Zitat:
2F 2F 0C 13 46 00 00 00 0E 60 CF 2D 8E 08 60 CD 21 8C 04 13 46 00 00 00 8D 04 93 13 2C FB FE 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF BF 0F 03 6F 7D 91 75 C0 BB 43 F2 E3 6C 82 76 29
Korrekt:
Zitat:
2F 2F 0C 13 46 00 00 00 02 6C C3 21 82 04 6C C1 21 8C 04 13 46 00 00 00 8D 04 93 13 2C FB FE 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF BF 0F 03 6F 7D 91 75 C0 BB 43 F2 E3 6C 82 76 29
Ich habe das mittler weile mit mehreren Daten getestet (unterschl. IV und Keys) und immer an der gleichen Stelle (9-16) stimmen die Daten nicht.
Was kann das sein?


Delphi-Quellcode:
procedure StrToByteArray (AStr:string; var RetBytes:TBytes);
var
  nLen,nCount : integer;
  sStr, sByte : string;
begin

  AStr := StringReplace(AStr,' ' ,'',[rfreplaceAll]);
  nLen := Length(AStr);

  if nLen mod 2 = 0 then
  begin
    sStr := AStr;
    nLen := nLen div 2;
    SetLength(RetBytes, nLen);
    nCount := 0;
    while sStr<>'do
    begin
      sByte := Copy (sStr,1,2);
      sStr := Copy (sStr,3, maxint);

      RetBytes[nCount] := StrtoInt('$' + sByte);
      inc(nCount);
    end;

  end;

end;

Procedure DoIt();

var
  aBytes,aCryptData,aDecyptData : TBytes;
  myCipher : TCipher_AES;
  CipherKey : RawByteString;
  IV : RawByteString;
bein
    
    StrToByteArray('496A85044524010723232323232323',aBytes);
    IV := BytesToRawString(aBytes);

    StrToByteArray('5A8470C4806F4A87CEF4D5F2D985AB18',aBytes);
    CipherKey := BytesToRawString(aBytes);

   StrToByteArray('63 82 E1 48 B2 8D AA 7A 59 EE EB F7 E4 29 CA 23 F5 A6 23 E6 8E 89 0A 93 12 0B 2D AA A9 02 63 6C 0F 8E 5C 35 B6 35 D9 E5 49 30 D8 05 BC 2F 6D 3D 09 32 97 ED 08 41 0A 7C 57 14 EB EB 35 76 1F 2B 0D 04 EF CD 76 E9 5A E1 17 C1 3E 67 75 00 00 00',aBytes);

    myCipher := TCipher_AES.Create;
    try
      try
        myCipher.Init(CipherKey, IV, $2F);
        myCipher.Mode := cmCBCx;
        aDecyptData := myCipher.DecodeBytes(aCryptData);
        Result := TRUE;
      except
          //
      end;
    finally
      myCipher.Free;
    end;
....
// im aDecyrptData sind Byte 9 - 16 falsch, der rest stimmt

Geändert von gmc616 (21. Jul 2022 um 15:40 Uhr)
  Mit Zitat antworten Zitat