3

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 暗号化を正しく取得する方法を知っていますか?.

ありがとうございました。

4

1 に答える 1