3

Delphi Encryption Compendium (DEC) を使用して一部のデータを暗号化する Delphi アプリケーションがあります。非常にうまく機能し、問題なく暗号化と復号化を行うことができます。Rijndael 暗号化を使用しています。

私の課題は、Delphi で暗号化されたデータを Node.JS で復号化することです (crypto の機能を使用)。私は StackOverflow の質問Delphi DEC ライブラリ (Rijndael) 暗号化Node.js Decrypt in PHP での AES 暗号化を見てきました。失敗。、私は自分の問題をもう少しよく理解していると思います。

私が学んだことは、ノード側で DEC が使用するキー派生を模倣する必要があるということです。暗号化側を上書きしたり変更したりすることはできません..既にあるものを使用する必要があります。

私の質問は次のとおりです: DEC で使用されるキー派生 (キーと iv を指定) 標準ですか、それとも DEC ライブラリでのみ使用されるものですか? 標準の場合、同じ入力が与えられた場合、DECの関数と同じ出力を生成するJavaScriptコードを見た人はいますか?

キー導出シーケンスの一部にキーのハッシュが含まれていることがわかります (この場合、RipeMD-256 でハッシュされた 32 バイトのキー)。さらに、キー導出プロセスの一環として、キーのサイズが 32 バイトから 16 バイトに縮小されていることがわかります。Delphi コードでつまずいたのは、DEC がキーと iv を使用して、実際に復号化に使用されるキーを導出する方法です。

必要なコードでこれを編集できてうれしいです。DEC ライブラリと javascript / node.js に詳しい人が正しい方向に向けてくれることを願っています。

===編集===

そのため、さらに掘り下げた後、crypto モジュールを使用する代わりに、この AES 用の Javascript コードを見つけました。作成者は CIV 値を暗号化されたテキストの最初の 8 バイトと見なすので、次のようにします。

var encryptedData='B6F03982E2F6303ACA7313'; // プレーン テキストは 'Hello There' です
var key='01234567890123456789012345678901';
var hashedKey=hash('ripemd256',key);
var civ='549621EEF38647BE';
var decryptedData='';

var charEncryptedData=hex2a(encryptedData);
var charKey=hex2a(hashedKey);
var charCiv=hex2a(civ);

decryptedData=Aes.Ctr.decrypt(charCiv+charEncryptedData,hashedKey,128);

console.log('復号化されたデータ:'+decryptedData);

しかし、結局のところ、このライブラリのキーの派生が DEC のキーの派生と同じかどうか疑問に思っています。

=== 編集 ===

コメントへの回答では、いいえ、同じキーと civ 値が与えられた場合、2 つの実装は同じ暗号化されたデータを計算しないようです。通話中

var reEncryptedData=Aes.Ctr.encrypt('hello there', charKey, 128, charCiv);

これは、暗号化されたテキストに CIV を付加することを考慮しても、まだ Delphi 側からの出力よりも 8 バイト長いです。

===編集===

Aes.Ctr コード ライブラリ (上記) は CTR モードを使用しており、デルファイ側で CBC を実行しています。-はぁ-

再度、感謝します。

4

2 に答える 2

1

それがすべての答えではないと確信していますが、その一部です。

heinob によってこの質問に提出されたものを含む、さまざまな Javascript AES 実装を比較すると、それらと Delphi バージョンの間にいくつかの違いがあることがわかりました。特に、事前計算された値の一部で。

そのため、2 つの選択肢がありました。Delphi ライブラリでコードを再開発するか、Delphi ライブラリから DLL をビルドしてドット ネット アプリから呼び出すかです。ドット ネット ルートに進むことにしました。Delphi ライブラリで復号化ルートを呼び出す dll をビルドします。

他の誰かがこのルートに行く場合は、いくつかのヒントを伝えます。

私の関数の署名は次のとおりです。

function decrypt(encryptedData, key, iv: PAnsiChar): PAnsiChar; StdCall; Export;

C# では、関数のシグネチャは次のとおりです。

public static extern IntPtr decrypt(string encryptedData, string key, string iv);

呼び出した後、IntPtr を ansi 文字列にマーシャリングします。

于 2013-02-28T00:30:55.883 に答える
0

アルゴリズムを次の 2 つの JavaScript ライブラリと比較できます。

どちらも間違いなく正しく暗号化された出力を生成します。

ところで: 最初のものは、ファイル暗号化のために MEGA (KimDotCom) によって使用されます。

于 2013-02-27T16:40:40.197 に答える