![]() |
AES: Entschlüsselung JavaScript -> Delphi
Hallo!
Ich möchte einen in JavaScript per AES verschlüsselten Text in Delphi entschlüsseln. Leider bisher ohne Erfolg. JavaScript AES: code.google.com/p/crypto-js Text: message Passwort: test Verschlüsselter Text: U2FsdGVkX19h+WKvkdYWILeBgb10Yg6pVrXS1qAQmmo= IV:aa2d712f7ee98cba8fb3019a5e26f821 Ciphertext:b78181bd74620ea956b5d2d6a0109a6a Salt:61f962af91d61620 Key:9b1c3e329b5e061a571afac99de6c4368390a5475fb60c 5faabb7
Delphi-Quellcode:
Für Hilfe bin ich sehr dankbar!
uses
DECUtil, DECCipher, DECHash, DECFmt, X.System.Data; {$R *.dfm} var ACipherClass: TDECCipherClass = TCipher_Rijndael; ACipherMode: TCipherMode = cmCBCx; AHashClass: TDECHashClass = THash_MD5; ATextFormat: TDECFormatClass = TFormat_Mime64; AKDFIndex: LongWord = 1; function DoDecrypt(const AText: WideString; const APassword: WideString): WideString; overload; var ASalt: Binary; AData: Binary; ACheck: Binary; APass: Binary; ALen: Integer; begin with ValidCipher(ACipherClass).Create, Context do try ASalt := ValidFormat(ATextFormat).Decode(AText); ALen := Length(ASalt) - 16 - BufferSize; AData := System.Copy(ASalt, 17, ALen); ACheck := System.Copy(ASalt, ALen + 17, BufferSize); SetLength(ASalt, 16); APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex); Mode := ACipherMode; Init(APass); SetLength(Result, ALen div SizeOf(AText[1])); Decode(AData[1], Result[1], ALen); if ACheck <> CalcMAC then raise Exception.Create('Invalid data'); finally Free; ProtectBinary(ASalt); ProtectBinary(AData); ProtectBinary(ACheck); ProtectBinary(APass); end; end; procedure TForm1.DecryptClick(Sender: TObject); var Key: WideString; Text: WideString; begin Key := 'test'; Text := 'U2FsdGVkX19h+WKvkdYWILeBgb10Yg6pVrXS1qAQmmo='; Output.Text := DoDecrypt(Text, Key); end; |
AW: AES: Entschlüsselung JavaScript -> Delphi
Wenn du KDFx benutzt kann das nicht funktionieren. Das ist eine KDF die speziell im DEC verwendung findet. Den Schlüssel musst du schon auf die gleiche Art erzeugen. ;)
|
AW: AES: Entschlüsselung JavaScript -> Delphi
Sind Deine DEC-Einstellungen einfach nur Raterei oder hast Du Hinweise, die aber nicht angegeben sind. Im übrigen kann man noch nicht mal experimentieren weil
Code:
überhaupt kein gültiger AES-Hex-Schlüssel sein kann: er enthält Leerzeichen und ist nicht 32, 48, oder 64 Hexdigits lang!
9b1c3e329b5e061a571afac99de6c4368390a5475fb60c 5faabb7
|
AW: AES: Entschlüsselung JavaScript -> Delphi
Die "DoDecrypt Funktion" sieht mir aus, wie aus irgendeinem Beispiel. Die musst du natürlich an deinen Fall anpassen.
|
AW: AES: Entschlüsselung JavaScript -> Delphi
Zitat:
Code:
Text: message
Passwort: test Verschlüsselter Text: U2FsdGVkX1/xZpr6MEv9JPL1mT72zVDp3fJh4a IV:2a6eb83468c3070d50fb8e023f6ff39a Ciphertext:f2f5993ef6cd50e9ddf261e1a0ff62e5 Salt:f1669afa304bfd24 Key:bd9b8462f9a0cbfd174ec633fb3a8d1210685a8e6d9bd00f8b4e7904c8fc3e38 Zitat:
|
AW: AES: Entschlüsselung JavaScript -> Delphi
Schau mal hier.
![]() Es wäre von Vorteil wenn man den JS-Code kennen würde. Denn so kann man nur raten wie der Schlüssel erzeugt wird, welcher Hash Algo benutzt wird, u.s.w. ;) Zitat:
|
AW: AES: Entschlüsselung JavaScript -> Delphi
Zitat:
![]() |
AW: AES: Entschlüsselung JavaScript -> Delphi
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe den JS-Code hinzugefügt.
|
AW: AES: Entschlüsselung JavaScript -> Delphi
Du solltest mal das posten, was du schon hast und auf die Tipps eingehen die dir schon gegeben wurden.
|
AW: AES: Entschlüsselung JavaScript -> Delphi
Entschlüsselung funktioniert nun. Zum Einsatz kommt DCPCrypt.
AES-256, CBC, Zero-Padding:
Delphi-Quellcode:
Meine Frage ist folgende:
aes:U2FsdGVkX1+aaWM2vHVan/zOH4E+9J2g/0Ylv4C1qgA=
iv:34983c5eb8f1596da582a4aa93ca8016 salt:9a696336bc755a9f ciphertext:fcce1f813ef49da0ff4625bf80b5aa00 key:a28401b8f61012a6bde7a7a1df3f4303d6b009f9a5844a022a3ba4abbb0e6596 Wie kann ich den Secret-Key aus Passwort, Salt und Iterations mithilfe einer ![]() Delphi-Code:
Delphi-Quellcode:
JS-Code:
unit DCP.View;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; type TForm1 = class(TForm) CipherText: TLabeledEdit; Key: TLabeledEdit; IV: TLabeledEdit; Decrypt: TButton; Text: TLabeledEdit; procedure DecryptClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses DCPcrypt2, DCPrijndael, DCPbase64, DCPmd5; {$R *.dfm} type TBuffer = record private FBytes: TBytes; function GetByte(const AIndex: Integer): Byte; function GetMemory: PByte; function GetSize: Int64; procedure SetByte(const AIndex: Integer; const AValue: Byte); procedure SetSize(const AValue: Int64); public constructor Create(const ABuffer: Pointer; const ASize: Integer); class function FromHexString(const AHexString: string): TBuffer; static; function ToRawByteString: RawByteString; property Bytes[const AIndex: Integer]: Byte read GetByte write SetByte; default; property Memory: PByte read GetMemory; property Size: Int64 read GetSize write SetSize; end; constructor TBuffer.Create(const ABuffer: Pointer; const ASize: Integer); begin SetLength(FBytes, ASize); if (Assigned(ABuffer) and (ASize > 0)) then begin Move(ABuffer^, FBytes[0], ASize); end; end; class function TBuffer.FromHexString(const AHexString: string): TBuffer; const HexCharSet: TSysCharSet = ['0' .. '9', 'a' .. 'f', 'A' .. 'F']; var Buffer: string; Bytes: TBytes; I: Integer; Index: Integer; Text: string; begin Buffer := StringReplace(AHexString, '0x', '', [rfIgnoreCase, rfReplaceAll]); SetLength(Text, Length(Buffer)); Index := 0; for I := 1 to Length(Buffer) do begin if CharInSet(Buffer[I], HexCharSet) then begin Inc(Index); Text[Index] := Buffer[I]; end; end; SetLength(Bytes, (Index div 2)); HexToBin(PWideChar(Text), PByte(Bytes), Length(Bytes)); Result := TBuffer.Create(@Bytes[0], Length(Bytes)); end; function TBuffer.GetByte(const AIndex: Integer): Byte; begin Result := FBytes[AIndex]; end; function TBuffer.GetMemory: PByte; begin Result := PByte(FBytes); end; function TBuffer.GetSize: Int64; begin Result := Length(FBytes); end; procedure TBuffer.SetByte(const AIndex: Integer; const AValue: Byte); begin FBytes[AIndex] := AValue; end; procedure TBuffer.SetSize(const AValue: Int64); begin SetLength(FBytes, AValue); end; function TBuffer.ToRawByteString: RawByteString; begin Result := UTF8Encode(TEncoding.UTF8.GetString(FBytes)); end; procedure RemoveZeroPadding(ABuffer: TBuffer); var I: Integer; begin for I := ABuffer.Size - 1 downto 0 do begin if ABuffer[I] = 0 then begin ABuffer.Size := ABuffer.Size - 1; end; end; end; procedure TForm1.DecryptClick(Sender: TObject); // aes:U2FsdGVkX1+aaWM2vHVan/zOH4E+9J2g/0Ylv4C1qgA= // iv:34983c5eb8f1596da582a4aa93ca8016 // salt:9a696336bc755a9f // ciphertext:fcce1f813ef49da0ff4625bf80b5aa00 // key:a28401b8f61012a6bde7a7a1df3f4303d6b009f9a5844a022a3ba4abbb0e6596 var Cipher: TDCP_rijndael; I: Integer; LCipherText: TBuffer; LIV: TBuffer; LKey: TBuffer; begin { Ciphertext } LCipherText := TBuffer.FromHexString(CipherText.Text); { Key } LKey := TBuffer.FromHexString(Key.Text); { IV } LIV := TBuffer.FromHexString(IV.Text); { Decryption } Cipher := TDCP_rijndael.Create(Self); try Cipher.Init(LKey.Memory^, 256, LIV.Memory); Cipher.DecryptCBC(LCipherText.Memory^, LCipherText.Memory^, LCipherText.Size); RemoveZeroPadding(LCipherText); Text.Text := LCipherText.ToRawByteString; finally Cipher.Free; end; end; end.
Delphi-Quellcode:
... if ( bValid ) { var pwd = CryptoJS.AES.encrypt(user.val(), pass.val(), { padding: CryptoJS.pad.ZeroPadding }); if (window.console) { console.log('user:%s pass:%s', user.val(), pass.val()); console.log('aes:%s', pwd); console.log('iv:%s salt:%s ciphertext:%s', pwd.iv, pwd.salt, pwd.ciphertext); console.log('key:%s', pwd.key); } ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz