当前位置: 首页 > 知识库问答 >
问题:

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

柴晔
2023-03-14

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

如果我从Delphi解密PHP字符串…工作正常。

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

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

这些是琴弦...最后的字符:

PHP: GyLWj1anBJRmE8mBsaO5cvTrcbvvA==

Delphi:gylwj 1 anbjb rme 8 mbsao 5 cvtrcbv

感谢您的任何建议

我使用以下源代码示例:

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) ;
}

德尔福加密:

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;

共有1个答案

佴英奕
2023-03-14

我不知道我是否使用了正确的方法……但如果我将字节值转换为字符串,并在此链接中使用Base64Encode:

使用密码加密. INI文件字符串的简单代码

现在我加密正确。这是一个例子:

SetString(stringValue, PAnsiChar(@dest[0]), slen); 
result := Base64Encode2(stringValue);
 类似资料:
  • ===编辑=== 作为对注释的回答,no,这两个实现似乎不计算相同的加密数据,给定相同的密钥和civ值。呼叫 产生一个完全不同的加密字符串,即使考虑到CIV对加密文本的预置,它仍然比delphi端的输出长8个字节。 再次感谢。

  • 我的德尔福应用程序使用 TurboPower 密码箱 3 使用 AES 256 加密纯文本信息。我现在想使用PHP解密这些信息。但是涡轮增压锁盒3有一些互操作性问题。 有关详细信息,请查看LockBox 3作者的帖子: http://lock box . seanbdurkin . id . au/tiki-view _ forum _ thread . PHP?comments_parentId

  • 问题内容: 更新 我已经对C#代码进行了更改,因此它使用的块大小为256。但是现在,您好世界看起来像这样http://pastebin.com/5sXhMV11,我无法弄清楚应该使用rtrim()获得什么一团糟的最后。 另外,当您说IV应该是随机的时,您的意思是不要再使用一次相同的IV,否则我编码的方式错误吗? 再次感谢! 你好 我正在尝试使用在C#中加密的PHP解密字符串。我似乎无法让PHP使用

  • 我曾在互联网上寻找解决问题的有效方法,但我尝试的一切都不奏效。我在两种语言之间得到了不同的结果。 在PHP中,我有以下代码: 和C#中的以下代码: 我有另一个CalcMd5函数,它接受一个byte[](与上面的函数类似,但没有GetBytes部分)。 需要加密的密钥和字符串在PHP和C#中都是相同的: 键:“24ACD2FCC7B20B8BD33FF45176F03061A09B729487E10

  • 我必须用Twofish/CBC算法在Delphi中加密字符串,将其发送到服务器并在那里解密。我已经测试了下面的代码,B64编码/解码过程有效,但是我被困在密码加密/解密上。 我正在使用DEC 5.2用于德尔福。 以下是进行加密的德尔菲代码: 和应该解密发送数据的PHP函数: 我相信我必须对salt和初始化向量做更多的改动,但是我不知道怎么做。据我所知,KDFx()函数使SHA1从用户密码和salt

  • 我需要用'rijndael-128-cbc'算法解密php加密的数据。 现在我有一个将php代码转换为ruby代码的问题。ruby OpenSSL::Cipher不支持rijndael-128-cbc,所以我使用“aes-128-cbc”。我听说AES是基于Rijndael密码的,所以我想我可以用Rijndael-128-cbc将解密转换为AES-128-cbc。 它的产量是16 然而,在php中