私は、Delphi 7でデータを暗号化し、私はmcryptの(とそれを解読していますPOSTを介して、PHPスクリプトに送信する12月3.0ライブラリ(Delphi Encryption Compedium Part I)を使用しようとしていますRIJNDAEL_256、ECBモード)。デルファイ12月ライブラリ(ラインダール)暗号化
Delphiの一部:
uses Windows, DECUtil, Cipher, Cipher1;
function EncryptMsgData(MsgData, Key: string): string;
var RCipher: TCipher_Rijndael;
begin
RCipher:= TCipher_Rijndael.Create(KeyStr, nil);
RCipher.Mode:= cmECB;
Result:= RCipher.CodeString(MsgData, paEncode, fmtMIME64);
RCipher.Free;
end;
PHPの一部:
function decryptMsgContent($msgContent, $sKey) {
return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sKey, base64_decode($msgContent), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND));
}
問題はPHPからの復号化が動作しないということで、出力が実際のデータと異なる、ちんぷんかんぷんです。
もちろん、Delphi Key
とPHP $Key
は同じ24文字の文字列です。
DEC 3.0は古くて時代遅れで、私は暗号化の専門家ではなく、実装が実際にRijndael 256であるかどうかはわかりません。誰かがこの実装がPHPのmcrypt w/RIJNDAEL_256。多分、鍵の大きさやブロックサイズは違うかもしれませんが、コードからは分かりません。ここでCipher1.pasからの抜粋です:
const
{ don’t change this }
Rijndael_Blocks = 4;
Rijndael_Rounds = 14;
class procedure TCipher_Rijndael.GetContext(var ABufSize, AKeySize, AUserSize: Integer);
begin
ABufSize := Rijndael_Blocks * 4;
AKeySize := 32;
AUserSize := (Rijndael_Rounds + 1) * Rijndael_Blocks * SizeOf(Integer) * 2;
end;
サイド質問:
私はECBモードが推奨されていません知っていると私はできるだけ早く私はECBの作業を取得としてCBCを使用します。問題は、Delphiで生成されたIVをPHPスクリプトにも送信する必要があるということですか? ECBのように、キーが十分であることを知っていますか?
これは非常にばかげた質問かもしれません。しかし、あなたは暗号化されたデータを復号化できるのですか?ああ、この質問への答えは役に立ちます:http://stackoverflow.com/q/8313992/41338 – RobS
あなたはmcrypt_create_iv()を呼び出します。 Delphiで使用したIVは何ですか? –
@ldsandon:talereaderはECBモードを使用しています。 IVはありません。 –