如何使用dcpcrypt在delphi和php之间同步加密
发布时间:2020-12-15 10:12:39 所属栏目:大数据 来源:网络整理
导读:我正在使用Delphi 2009,我在这里看到的大多数答案都是针对2010年的 我试图将加密(delphi)同步到解密(php)并失败. 在delphi中生成加密的字符串: program Project4;{$APPTYPE CONSOLE}uses SysUtils,DCPcrypt2,DCPsha1,DCPblockciphers,DCPdes,EncdDecd;var d
|
我正在使用Delphi 2009,我在这里看到的大多数答案都是针对2010年的
我试图将加密(delphi)同步到解密(php)并失败. 在delphi中生成加密的字符串: program Project4;
{$APPTYPE CONSOLE}
uses
SysUtils,DCPcrypt2,DCPsha1,DCPblockciphers,DCPdes,EncdDecd;
var des: tdcp_des;
enc,dec: ansistring;
begin
try
des:=tdcp_des.Create(nil);
des.InitStr('test',tdcp_sha1);
enc:=encodestring(des.EncryptString('this is a test'));
des.Free;
des:=tdcp_des.Create(nil);
des.InitStr('test',tdcp_sha1);
dec:=des.DecryptString(decodestring(enc));
des.Free;
writeln(enc);
writeln(dec);
except
on E:Exception do
Writeln(E.Classname,': ',E.Message);
end;
end.
在php中解密: <?php
function decrypt($str,$key)
{
$size = mcrypt_get_iv_size(MCRYPT_DES,MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size,MCRYPT_DEV_RANDOM);
$data = base64_decode($str);
$block = mcrypt_get_block_size('des','ecb');
$k = substr(sha1($key),$block);
$str = mcrypt_decrypt(MCRYPT_DES,$k,$data,MCRYPT_MODE_CBC,$iv);
$pad = ord($str[($len = strlen($str)) - 1]);
return substr($str,strlen($str) - $pad);
}
$enc = 'TW5mbVFhODUyR2FoOTA2WWJIOD0=';
$dec = decrypt($enc,'test');
echo "$decn";
?>
解决方法
我认为有几个问题:-)
> des.InitStr()在内部从8个空字节创建一个IV然后加密.您需要在PHP中使用相同的IV. 基于我以前的答案here – 这是我的建议: function EncryptStringDES: string;
var
des: TDCP_des;
src,enc,b64: TBytes;
index,slen,bsize,padsize: integer;
begin
des:=tdcp_des.Create(nil);
try
des.InitStr(AnsiString('test'),tdcp_sha1);
src := TEncoding.UTF8.GetBytes('this is a test');
slen := Length(src);
// Add padding
bsize := des.BlockSize div 8;
padsize := bsize - (slen mod bsize);
Inc(slen,padsize);
SetLength(src,slen);
for index := padsize downto 1 do
begin
src[slen - index] := padsize;
end;
SetLength(enc,slen);
des.EncryptCBC(src[0],enc[0],slen);
result := EncdDecd.EncodeBase64(@enc[0],Length(enc));
finally
des.Free;
end;
end;
function DecryptStringDES(ASource: string): string;
var
des: TDCP_des;
key,src,dec,b64: TBytes;
pad,slen: integer;
begin
des := TDCP_des.Create(nil);
try
des.InitStr(AnsiString('test'),tdcp_sha1);
src := EncdDecd.DecodeBase64(AnsiString(ASource));
slen := Length(src);
SetLength(dec,slen);
des.DecryptCBC(src[0],dec[0],slen);
// Remove padding
pad := dec[slen - 1];
SetLength(dec,slen - pad);
result := TEncoding.UTF8.GetString(dec);
finally
des.Free;
end;
end;
和PHP: <?php
function decrypt_SO($str,$key)
{
//$ivsize = mcrypt_get_iv_size(MCRYPT_DES,MCRYPT_MODE_CBC);
//$blocksize = mcrypt_get_block_size(MCRYPT_DES,MCRYPT_MODE_CBC);
$keysize = mcrypt_get_key_size(MCRYPT_DES,MCRYPT_MODE_CBC);
// Need to use the SAME IV as the Delphi function. By default
// this is (0,0) encrypted using ECB mode and gives the
// following bytes:
$ivbytes = array(72,163,99,62,219,111,114);
$iv = implode(array_map("chr",$ivbytes));
$enc = base64_decode($str);
$k = mhash(MHASH_SHA1,$key);
$dec = mcrypt_decrypt(MCRYPT_DES,substr($k,$keysize),$enc,$iv);
$pad = ord($dec[strlen($dec) - 1]);
return substr($dec,strlen($dec) - $pad);
}
$enc = 'WRaG/8xlxqqcTAJ5UAk4DA==';
$dec = decrypt_SO($enc,'test');
echo "$decn";
?>
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
