Ich muss eine 10-Byte-Zeichenfolge in Delphi mit 3DES verschlüsseln.Verschlüsseln String mit 3DES mit Delphi 10.1 Berlin
Es muss das gleiche Ergebnis als dieser PHP-Code erhalten:
function encrypt_3DES($message, $key){
$bytes = array(0,0,0,0,0,0,0,0);
$iv = implode(array_map("chr", $bytes));
$ciphertext = mcrypt_encrypt(MCRYPT_3DES, $key, $message, MCRYPT_MODE_CBC, $iv);
return $ciphertext;
ich es mit DCPCrypt und LockBox 3. Ich DCPCrypt schließlich verworfen haben, Code versucht haben, weil es keine Aktualisierung war in letzter Zeit und ich Ich bin mir nicht sicher, ob es mit Delphi 10.1 Berlin richtig funktioniert, also habe ich mich auf LockBox 3 konzentriert, aber ich war nicht in der Lage, die Verschlüsselung richtig zu machen.
Der Verschlüsselungsschlüssel ist ein 24bytes-Schlüssel (den ich seine Base64-Darstellung habe). Ich kann nicht finden, wie man solchen Schlüssel unter Verwendung der TSymetricKey Klasse der LockBox anstellt, um ihn an eine Codec.Init Methode zu übergeben. Also setze ich es auf einen AnsiString und setze es auf die Password -Eigenschaft (obwohl die Dokumentation sagt, dass es ein utf8Password gibt, aber ich kann es nicht finden).
Dann gibt es eine Methode namens EncryptAnsiString, aber wieder erwartet sie Zeichenketten (utf16 auf Delphi 10.1 Berlin) statt AnsiStrings (obwohl die Dokumentation das Gegenteil sagt), also bin ich nicht überrascht, dass das Ergebnis nicht was entspricht Ich suche (der gleiche Wert verschlüsselt auf diesem PHP-Snippet).
Das ist mein Delphi-Code:
function Encrypt(Data: AnsiString; LocalKey: AnsiString): AnsiString;
var
BinaryLocalKey: TBytes;
strLocalKey, strTripleDes: AnsiString;
begin
BinaryLocalKey := DecodeBase64(LocalKey);
setString(strLocalKey, PAnsiChar(@BinaryLocalKey[0]), Length(BinaryLocalKey));
Codec1.Rest;
Codec1.Password := strLocalKey;
Codec1.EncryptAnsiString(Data, strTripleDES);
Codec1.Reset;
Result := strTripleDes;
end;
aber dieser Code nicht nur nicht das gleiche Ergebnis wie der PHP-Code nicht erhalten, aber bei jeder nennen es ein anderes Ergebnis für den gleichen Eingang zurückgibt.
HINWEIS: CODEC1 ist eine Komponente mit einer TCryptographicLibrary Komponente verbunden ist, und mit dem propertis ChainMode auf CBC * und Cipher auf 3DES gesetzt (Keying Option 1)
Hat jemand wissen, wie man richtig diese 3DES-Verschlüsselung zu bekommen? .
Vielen Dank.
Warum arbeiten Sie mit Text statt mit Bytes? –
Ich kann nicht sehen, wie man den Schlüssel/das Passwort unter Verwendung der Bytes einstellt. Aber ja, ich sollte die Verschlüsselung mit Bytes anstelle von Strings durchführen können. Ich werde es versuchen, danke. –
Ich bin ziemlich zuversichtlich, dass das Problem sollte das Passwort/Key, und ich kann nicht sehen, wie sie als binär eingestellt werden. Sobald der Schlüssel gesetzt ist, sollte ich in der Lage sein, im Speicher zu entschlüsseln, ist aber ziemlich komplex (Sie müssen die Entschlüsselung initiieren und abschließen und das Ergebnis über einen Stream erhalten), sieht viel zu übertrieben aus, um eine 10-Byte-Zeichenfolge zu verschlüsseln. Byte-Schlüssel, wie ich nur tun muss. –