Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP函数到Delphi函数_Php_Delphi_Encryption - Fatal编程技术网

PHP函数到Delphi函数

PHP函数到Delphi函数,php,delphi,encryption,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(

我正在尝试创建一个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;
} 
函数转换($str,$ky=''){
如果($ky='')返回$str;
$ky=str_替换(chr(32),“”,$ky);

如果(strlen($ky)我认为你真的需要桥接你的应用程序,那么看看这个,因为这里的解释有点复杂。实际上,通过桥接集成应用程序PHP/Java是有用的,但我认为通过桥接集成PHP/Delphi也是有意义的


我认为你真的需要桥接你的应用程序,然后看看这个,因为这里的解释有点复杂。实际上,通过桥接集成应用程序PHP/Java是有用的,但我认为通过桥接集成PHP/Delphi也是有意义的


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

function convert(str: AnsiString; const key: AnsiString = ''): AnsiString;
如果键为空,则结果仅为
str

begin
  if key = '' then
    Exit(str);
  Result := str;
end;
第一个参数是要“加密”的值第二个是用于加密的密钥。密钥长度必须至少为8个非空格字符;超过32的任何字符都将被忽略。如果密钥太短,PHP脚本将终止;我们将使用Delphi的
Assert
语句,因为很明显,如果密钥错误,代码甚至不应该执行。(脚本终止不是用户希望修复的可恢复错误。)PHP代码使用
?:
运算符为长度选择所需的值,但Delphi的
Min
函数(来自数学单元)更清楚地表达了所需的值

  // var ky: AnsiString;
  ky := StringReplace(key, ' ', '', [rfReplaceAll]);
  Assert(Length(ky) >= 8, 'key error');
  // var kl: Integer;
  kl := Min(Length(ky), 32);
数组
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;
接下来,根据
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;

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

function convert(str: AnsiString; const key: AnsiString = ''): AnsiString;
如果键为空,则结果仅为
str

begin
  if key = '' then
    Exit(str);
  Result := str;
end;
第一个参数是要“加密”的值第二个是用于加密的密钥。密钥长度必须至少为8个非空格字符;超过32的任何字符都将被忽略。如果密钥太短,PHP脚本将终止;我们将使用Delphi的
Assert
语句,因为很明显,如果密钥错误,代码甚至不应该执行。(脚本终止不是用户希望修复的可恢复错误。)PHP代码使用
?:
运算符为长度选择所需的值,但Delphi的
Min
函数(来自数学单元)更清楚地表达了所需的值

  // var ky: AnsiString;
  ky := StringReplace(key, ' ', '', [rfReplaceAll]);
  Assert(Length(ky) >= 8, 'key error');
  // var kl: Integer;
  kl := Min(Length(ky), 32);
数组
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;
接下来,根据
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;

有一个小例子展示了如何让PHP和Delphi加密一起工作。

有一个小例子展示了如何让PHP和Delphi加密一起工作。

到目前为止,你得到了什么?你具体遇到了哪些行的问题?看起来第一步:格式化代码,使其可读。在每个分号后换行,在“if”和“for”内缩进块,围绕二进制运算符的空格。@Rob,我在阅读您的评论之前对代码进行了格式化。@Rob,这就是我找到的代码。@David,sarcasm?:P@webbiedave,数组部分。到目前为止,您得到了什么?您具体遇到了哪些行的问题?这看起来非常安全。第一步:格式化代码,使其可读。行break在每个分号后,在“if”和“for”内缩进块,围绕二进制运算符的空格。@Rob,我在阅读您的评论之前对代码进行了格式化。@Rob,这就是我找到的代码。@David,sarcasm?:P@webbiedave,数组部分。-1.我看不出这是一个多么有用的答案。如果您真的认为它回答了问题,请编辑您的答案,使其更清楚“桥接”是什么应用程序意味着以及为什么Zend Server会允许Jeff这么做。还要解释他将如何在他的Delphi程序中使用它。你基本上已经告诉他“桥接应用程序”,而他基本上已经在问如何做了。“我该如何系鞋带?”“系鞋带”我只想把这个函数转换成Delphi。如果我能再次投票否决你的“算计”备注,我会的。回答有关堆栈溢出的问题的目的是帮助其他人解决问题。如果你对此不感兴趣,那么我建议你找点别的事情做。我不明白为什么这么多人在下面重复这个答案。他只是想帮点忙…-1.我看不出这是一个多么有用的答案