2016-08-09 19 views
3

3DESを使用してDelphiで10バイトの文字列を暗号化する必要があります。Delphi 10.1を使用して3DESで文字列を暗号化する

それは、この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を捨ててきた最近、私DCPCryptとLockBoxしばらく3を使用してコードしようとしているがDelphi 10.1 Berlinで正しく動作するかどうかわからないので、LockBox 3に焦点を当てていますが、暗号化の権利を取得できませんでした。

暗号化キーは24バイトのキーです(これはbase64表現です)。私はCodec.Initメソッドに渡すために、LockBoxのTSymetricKeyクラスを使用してそのようなキーを作成する方法を見つけることができません。だから私はそれをAnsiStringに置き、Passwordプロパティに設定します(ドキュメントにはutf8Passwordがありますが、見つけることはできません)。

EncryptAnsiStringというメソッドがありますが、AnsiStringsの代わりに文字列(Delphi 10.1 Berlinのutf16)が必要です(ドキュメントには反対ですが)。なぜなら結果が私は探しています(その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コンポーネントにリンクされている成分であり、CBC *および暗号に設定propertisのChainModeは3DESに設定して

は、誰かが正しく、この3DES暗号化を取得する方法を知っています(オプション1をキーイング)? 。

ありがとうございます。

+2

バイトではなくテキストで作業するのはなぜですか? –

+0

バイトを使用してキー/パスワードを設定する方法がわかりません。しかし、はい、私は文字列の代わりにバイトを使用して暗号化を行うことができるはずです。私はそれを試してみる、ありがとう。 –

+0

私はこの問題がパスワード/キーを設定するべきであると確信しており、バイナリとして設定する方法はわかりません。キーを設定したら、私はメモリ内で解読できるはずですが、かなり複雑です(解読を開始してストリームを介して結果を得る必要があります).24バイトの文字列を使用して10バイトの文字列を暗号化し、私はちょうどそうする必要があります。 –

答えて

1

メッセージごとにランダムIVが生成されます。 IVの下位8バイトはナンスであり、上位バイトはゼロである。これらの下位8バイトは、出力の前に付加されます。

IVをサイドチャネル経由で送信する場合は、名目上の暗号文から最初の8バイトを削除します。

IVを制御する場合は、バージョン3.7.0(https://github.com/SeanBDurkin/tplockbox)を使用します。高度なオプションを設定し、OnGetIVメソッドを実装する必要があります。

暗号の選択とチェーンモードの選択のためにプロパティエディタで表示されるアスタリスク(*)は、この選択が推奨されることを意味します。

関連する問題