PHP函数到Delphi函数

Jef*_*eff 1 php delphi encryption

我正在尝试创建一个PHP脚本,以及一个与它"交谈"的Delphi程序.为了保证安全,我想加密来自双方的传出文本,因此它在两端使用相同的加密功能.

这是我为PHP找到的功能:

function convert($str,$ky=''){
  if($ky=='')return $str;
  $ky=str_replace(chr(32),'',$ky);
  if(strlen($ky)<8)exit('key error');
  $kl=strlen($ky)<32?strlen($ky):32;
  $k=array();
  for($i=0;$i<$kl;$i++){
    $k[$i]=ord($ky{$i})&0x1F;
  }
  $j=0;
  for($i=0;$i<strlen($str);$i++){
    $e=ord($str{$i});
    $str{$i}=$e&0xE0?chr($e^$k[$j]):chr($e);
    $j++;
    $j=$j==$kl?0:$j;
  }
  return $str;
} 
Run Code Online (Sandbox Code Playgroud)

我似乎无法将其转换为Delphi.帮助很大!谢谢,杰夫

Rob*_*edy 8

它是一个接收两个字符串并返回另一个字符串的函数.我将在注释中包含变量声明,因为它们已在代码中引入; 把它们放在功能的顶部.

function convert(str: AnsiString; const key: AnsiString = ''): AnsiString;
Run Code Online (Sandbox Code Playgroud)

如果键为空,那么结果就是str:

begin
  if key = '' then
    Exit(str);
Run Code Online (Sandbox Code Playgroud)

第一个参数是要"加密"的值,第二个参数是用于加密的密钥.密钥需要至少八个非空格字符长; 超过32的任何东西都被忽略 如果密钥太短,PHP脚本将终止; 我们将使用Delphi的Assert语句,因为如果密钥错误,代码应该永远不会执行.(脚本终止不是用户期望修复的可恢复错误.)PHP代码使用?:运算符为长度选择所需的值,但Delphi的Min函数(来自Math单元)更清楚地表达了期望值.

  // var ky: AnsiString;
  ky := StringReplace(key, ' ', '', [rfReplaceAll]);
  Assert(Length(ky) >= 8, 'key error');
  // var kl: Integer;
  kl := Min(Length(ky), 32);
Run Code Online (Sandbox Code Playgroud)

该数组k用于保存表示密钥中每个字符的低五位的数字.在PHP中,数组将根据所使用的索引自动增长到所需的任何大小.在Delphi中,我们需要提前分配空间.因为它设置在遍历键的每个字符的循环中,所以我们知道数组的长度是相同的.

  // var k: array of Byte;
  SetLength(k, kl);
  // var i: Integer;
  for i := 0 to Pred(kl) do
    k[i] := Ord(ky[i+1]) and $1f;
Run Code Online (Sandbox Code Playgroud)

接下来,根据k数组中的每个连续字节修改字符串中具有其第七位集的每个字符.该j变量跟踪其关键字节,我们将在下次使用.

  // var j: Integer;
  j := 0;
  for i := 1 to Length(str) do begin
    // var e: Byte;
    e := Ord(str[i]);
    if (e and $e0) <> 0 then
      str[i] := AnsiChar(e xor k[j]);
    Inc(j);
    if j = kl then
      j := 0;
    // The previous three lines can also be written j := (j + 1) mod kl
  end;
Run Code Online (Sandbox Code Playgroud)

最后,我们返回以下新值str:

  Result := str;
end;
Run Code Online (Sandbox Code Playgroud)

  • @Jeff不接受,投票!慷慨,罗伯花了相当多的时间,并解释了他在做什么.首先,你抱怨它没有编译.然后你开了一个关于病毒的笑话.真的,如果你表示一点感激,那么它会鼓励人们帮助你.我只是想自己建设性的帮助,因为我知道你还年轻且易受影响. (4认同)
  • @Jeff @Chris @Rob没有我得到它,我将在一秒内编辑正确,它是指定k [i]的行.基于0的数组和基于1的字符串的经典案例,一个Delphi设计决定,我确信Embarcadero的每个人都希望他们能够借助时间机器进行反转! (2认同)