gpt4 book ai didi

php - 使用Rijndael的不同Delphi/PHP加密-解密

转载 作者:行者123 更新时间:2023-12-03 18:36:08 24 4
gpt4 key购买 nike

我正在尝试使用Rijndael从php到Delphi并返回来加密/解密字符串。

如果我解密来自Delphi的PHP字符串,则效果很好。

如果我使用Delphi加密字符串,则结果字符串可以,但更短

为了测试,我使用了一个62个字符的字符串。用delphi加密的字符串比PHP长4个字符

这些字符串...最后一个字符:

PHP:GyLWj1anBJRmE8mBsaO5cvTrcbvvA ==

德尔福:GyLWj1anBJRmE8mBsaO5cvTrcbv

感谢您的任何建议

我使用此源代码示例:

PHP:

function encrypt ($key, $value)
{
$padSize = 16 - (strlen ($value) % 16) ;
$value = $value . str_repeat (chr ($padSize), $padSize) ;
$output = mcrypt_encrypt (MCRYPT_RIJNDAEL_128, $key, $value, MCRYPT_MODE_CBC, 'xxxxxxx') ;
return base64_encode ($output) ;
}


Delphi加密:

function EncryptData3(Data: string; AKey: AnsiString; AIv: AnsiString): string;
var
cipher: TDCP_rijndael;
key, iv, src, dest, b64: TBytes;
index, slen, bsize, pad: integer;
begin
//key := Base64DecodeBytes(TEncoding.UTF8.GetBytes(AKey));
//iv := Base64DecodeBytes(TEncoding.UTF8.GetBytes(AIv));
key := TEncoding.ASCII.GetBytes(AKey);
iv := TEncoding.ASCII.GetBytes(AIv);

src := TEncoding.ascii.GetBytes(Data);

cipher := TDCP_rijndael.Create(nil);
try
cipher.CipherMode := cmCBC;
// Add padding.
// Resize the Value array to make it a multiple of the block length.
// If it's already an exact multiple then add a full block of padding.
slen := Length(src);
bsize := (cipher.BlockSize div 8);
pad := bsize - (slen mod bsize);
Inc(slen, pad);
SetLength(src, slen);

for index := pad downto 1 do
begin
src[slen - index] := pad;
end;

SetLength(dest, slen);
cipher.Init(key[0], 256, @iv[0]); // DCP uses key size in BITS not BYTES
cipher.Encrypt(src[0], dest[0], slen);

b64 := Base64EncodeBytes(dest);
result := TEncoding.Default.GetString(b64);
finally
cipher.Free;
end;
end;


Delphi解密...不起作用:

function DecryptData3(Data: string; AKey: AnsiString; AIv: AnsiString): string;
var
key, iv, src, dest: TBytes;
cipher: TDCP_rijndael;
slen, pad: integer;
begin
//key := Base64DecodeBytes(TEncoding.UTF8.GetBytes(AKey));
//iv := Base64DecodeBytes(TEncoding.UTF8.GetBytes(AIv));
key := TEncoding.ASCII.GetBytes(AKey);
iv := TEncoding.ASCII.GetBytes(AIv);

src := Base64DecodeBytes(TEncoding.UTF8.GetBytes(Data));

cipher := TDCP_rijndael.Create(nil);
try
cipher.CipherMode := cmCBC;
slen := Length(src);
SetLength(dest, slen);
cipher.Init(key[0], 256, @iv[0]); // DCP uses key size in BITS not BYTES
cipher.Decrypt(src[0], dest[0], slen);
// Remove the padding. Get the numerical value of the last byte and remove
// that number of bytes
pad := dest[slen - 1];
SetLength(dest, slen - pad);

// Base64 encode it
result := TEncoding.Default.GetString(dest);
finally
cipher.Free;
end;
end;

最佳答案

我不知道我是否使用了正确的方法...但是如果我将String转换为Bytes值,并且在此链接中使用了Base64Encode:

Simple code to encrypt an .INI file string using a password

现在我正确加密了。这是示例:

SetString(stringValue, PAnsiChar(@dest[0]), slen); 
result := Base64Encode2(stringValue);

关于php - 使用Rijndael的不同Delphi/PHP加密-解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28412966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com