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 を実行しています。-はぁ-
再度、感謝します。