使用DCPcrypt的Delphi程序在升级到XE2后不会从PHP解密
我有一个在Delphi 2007中开发的应用程序,其中一个值由
PHP加密并在应用程序中解密.加密算法是RIJNDAEL 128.当我移动XE2并安装最新版本的DCPcrypt时,应用程序运行但不再能够从PHP解密加密的字符串.结果看起来像中文字符,所以我想知道我是否需要修改我对加密密钥,向量或加密字符串的处理,以解释XE2使用Unicode字符的事实.
PHP加密由以下内容执行: 这两个相关的Delphi函数在这里: function PadWithZeros(const str : string; size : integer) : string; var origsize,i : integer; begin Result := str; origsize := Length(Result); if ((origsize mod size) <> 0) or (origsize = 0) then begin SetLength(Result,((origsize div size)+1)*size); for i := origsize+1 to Length(Result) do Result[i] := #0; end; end; procedure TfrmMain.btnDecryptClick(Sender: TObject); var Cipher : TDCP_rijndael; Data,Key,IV : string; begin // Pad Key and IV with zeros as appropriate Key := PadWithZeros(boxKey.Text,KeySize); IV := PadWithZeros(boxIV.Text,BlockSize); // Decode the Base64 encoded string Data := Base64DecodeStr(boxCipherTextIn.Text); // Create the cipher and initialise according to the key length Cipher := TDCP_rijndael.Create(Self); if Length(boxKey.Text) <= 16 then Cipher.Init(Key[1],128,@IV[1]) else if Length(boxKey.Text) <= 24 then Cipher.Init(Key[1],192,@IV[1]) else Cipher.Init(Key[1],256,@IV[1]); // Decrypt the data Cipher.DecryptCBC(Data[1],Data[1],Length(Data)); // Free the cipher and clear sensitive information Cipher.Free; FillChar(Key[1],Length(Key),0); // Display the result boxPlainTextOut.Text := Data; end; 解决方法
该问题与字符编码有关,但并不是DCPCrypt无法处理UTF-16.
PHP字符串是UTF-8.因此,您将密码(‘Key’)从PHP传递给Dephi作为base64编码的字符串.奇怪的是,您将解码的密钥存储在UTF-16LE字符串中.更合适的是rawbytestring或TBytes或TMemoryStream. Key的有效载荷的二进制布局现在与编码方面的二进制布局不同,因为它被键入为UTF16-LE(在不正确的Delphi术语中,’unicode字符串’ – 微软和Embarcadero malapropism). 由于显而易见的原因,这行代码在’unicode'(原文如此)编译器中是错误的… FillChar(Key[1],0); 边注 我是TurboPower LockBox 3的作者,我在论坛中遇到的头号问题源于ansistrings,utf-8字符串和utf-16le字符串之间的混淆.很多人认为PHP理解密码’abc’,与Delphi 2010中的’abc’密码相同.密码库使用的密码字符串是由字符串编码产生的二进制有效负载,而不是其语义意思是一个字符串. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |