Delphi で 3DES を使用して 10 バイトの文字列を暗号化する必要があります。
次の PHP コードと同じ結果が得られるはずです。
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;
DCPCrypt と LockBox 3 を使用してコーディングしようとしていました。DCPCrypt は最近更新されておらず、Delphi 10.1 Berlin で正しく動作するかどうかわからないため、最終的に破棄しました。そのため、LockBox 3 に焦点を当てましたが、暗号化を正しく行うことができませんでした。
暗号化キーは 24 バイトのキーです (私はこれを base64 で表現しています)。LockBox の TSymetricKey クラスを使用してそのようなキーを作成し、それを Codec.Init メソッドに渡す方法が見つかりません。そこで、それを AnsiString に配置し、Password プロパティに設定しました (ただし、ドキュメントには utf8Password があると記載されていますが、見つかりません)。
次に、EncryptAnsiString というメソッドがありますが、これも AnsiStrings ではなく文字列 (Delphi 10.1 Berlin では utf16) を想定しているため (ドキュメントには反対のことが書かれています)、結果が私が探しているものと一致しないことに驚きはありません。 for (その PHP スニペットで暗号化された同じ値)。
これは私の Delphi コードです:
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;
しかし、このコードは PHP コードと同じ結果を得られないだけでなく、呼び出しのたびに同じ入力に対して異なる結果を返します。
注: Codec1 は TCryptographicLibrary コンポーネントにリンクされたコンポーネントであり、ChainMode プロパティが CBC* に設定され、Cipher が 3DES (キーイング オプション 1) に設定されています。
誰かがこの 3DES 暗号化を正しく取得する方法を知っていますか?.
ありがとうございました。