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。问题是,我是否也需要将生成的IV传输到PHP脚本中?或者仅仅知道密钥就足够了,就像ECB一样?