Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.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“;_Php_Delphi_Function - Fatal编程技术网

功能“;德尔福;至;PHP“;

功能“;德尔福;至;PHP“;,php,delphi,function,Php,Delphi,Function,我需要在PHP中创建一个函数,从Delphi中的函数返回相同的结果。在PHP中,用“/”注释的摘录函数中有我无法替代的行,它们返回相同的结果 Delphi代码: function Crypt_(Action, Src: String): String; Label Fim; var KeyLen : Integer; KeyPos : Integer; OffSet : Integer; Dest, Key : String; SrcPos : Integer; SrcAsc

我需要在PHP中创建一个函数,从Delphi中的函数返回相同的结果。在PHP中,用“/”注释的摘录函数中有我无法替代的行,它们返回相同的结果

Delphi代码:

function Crypt_(Action, Src: String): String;
Label Fim;
var KeyLen : Integer;
  KeyPos : Integer;
  OffSet : Integer;
  Dest, Key : String;
  SrcPos : Integer;
  SrcAsc : Integer;
  TmpSrcAsc : Integer;
  Range : Integer;
begin
  if (Src = '') Then
  begin
    Result:= '';
    Goto Fim;
  end;
  Key :=
'YUQL23KL23DF90WI5E1JAS467NMCXXL6JAOAUWWMCL0AOMM4A4VZYW9KHJUI2347EJHJKDF3424SKL K3LAKDJSL9RTIKJ';
  Dest := '';
  KeyLen := Length(Key);
  KeyPos := 0;
  SrcPos := 0;
  SrcAsc := 0;
  Range := 256;
  if (Action = UpperCase('C')) then
  begin
    Randomize;
    OffSet := Random(Range);
    Dest := Format('%1.2x',[OffSet]);
    for SrcPos := 1 to Length(Src) do
    begin
      SrcAsc := (Ord(Src[SrcPos]) + OffSet) Mod 255;
      if KeyPos < KeyLen then KeyPos := KeyPos + 1 else KeyPos := 1;
      SrcAsc := SrcAsc Xor Ord(Key[KeyPos]);
      Dest := Dest + Format('%1.2x',[SrcAsc]);
      OffSet := SrcAsc;
    end;
  end
  Else if (Action = UpperCase('D')) then
  begin
    OffSet := StrToInt('$'+ copy(Src,1,2));
    SrcPos := 3;
  repeat
    SrcAsc := StrToInt('$'+ copy(Src,SrcPos,2));
    if (KeyPos < KeyLen) Then KeyPos := KeyPos + 1 else KeyPos := 1;
    TmpSrcAsc := SrcAsc Xor Ord(Key[KeyPos]);
    if TmpSrcAsc <= OffSet then TmpSrcAsc := 255 + TmpSrcAsc - OffSet
    else TmpSrcAsc := TmpSrcAsc - OffSet;
    Dest := Dest + Chr(TmpSrcAsc);
    OffSet := SrcAsc;
    SrcPos := SrcPos + 2;
  until (SrcPos >= Length(Src));
  end;
  Result:= Dest;
  Fim:
end;
<?php
function Crypt_($Action, $Src) {
  $Key    = 'YUQL23KL23DF90WI5E1JAS467NMCXXL6JAOAUWWMCL0AOMM4A4VZYW9KHJUI2347EJHJKDF3424SKL K3LAKDJSL9RTIKJ';
  $KeyLen = strlen($Key);
  $KeyPos = 0;
  if ($Action == 'C') {
    $OffSet = rand(0,256);
//  Dest := Format('%1.2x',[OffSet]); //I tried to replace the function "sprintf", but the result is null
    $SrcPos = 1;
    while ($SrcPos <= strlen($Src)) {
      $SrcAsc = (ord($Src[$SrcPos]) + $OffSet) % 255;
      if ($KeyPos < $KeyLen) $KeyPos = $KeyPos + 1; else $KeyPos = 1;
      $SrcAsc = $SrcAsc xor ord($Key[$KeyPos]);
//    Dest := Dest + Format('%1.2x',[SrcAsc]); //I tried to replace the function "sprintf", but the result is null
      $OffSet = $SrcAsc;
      $SrcPos = $SrcPos + 1;
    }
  } else {
//  OffSet := StrToInt('$'+ copy(Src,1,2));
    $Dest   = '';
    $SrcPos = 3;
    while ($SrcPos >= strlen($Src)) {
//    SrcAsc := StrToInt('$'+ copy(Src,SrcPos,2));
      if ($KeyPos < $KeyLen) $KeyPos = $KeyPos + 1; else $KeyPos = 1;
      $TmpSrcAsc = $SrcAsc xor ord($Key[$KeyPos]);
      if ($TmpSrcAsc <= $OffSet) $TmpSrcAsc = 255 + $TmpSrcAsc - $OffSet;
      else $TmpSrcAsc = $TmpSrcAsc - $OffSet;
      $Dest = $Dest + chr($TmpSrcAsc);
      $OffSet = $SrcAsc;
      $SrcPos = $SrcPos + 2;
    }
  }
  return $Dest;
}
?>
函数Crypt(Action,Src:String):String;
标签职能指令手册;
var-KeyLen:整数;
KeyPos:整数;
偏移量:整数;
Dest,Key:String;
SrcPos:整数;
SrcAsc:整数;
tmpsrcac:整数;
范围:整数;
开始
如果(Src=''),则
开始
结果:='';
转到Fim;
结束;
关键:=
“YUQL23KL23DF90WI5E1JAS467NMCXXL6JAOAUWWMCL0AOMM4A4VZYW9KHJUI2347EJJKDF3424SKL K3LAKDJSL9RTIKJ”;
目标:='';
KeyLen:=长度(键);
KeyPos:=0;
SrcPos:=0;
SrcAsc:=0;
范围:=256;
如果(Action=大写('C')),那么
开始
随机化;
偏移量:=随机(范围);
Dest:=格式('%1.2x',[OffSet]);
对于SrcPos:=1到长度(Src)do
开始
SrcAsc:=(Ord(Src[SrcPos])+偏移量)模块255;
如果KeyPos
PHP代码:

function Crypt_(Action, Src: String): String;
Label Fim;
var KeyLen : Integer;
  KeyPos : Integer;
  OffSet : Integer;
  Dest, Key : String;
  SrcPos : Integer;
  SrcAsc : Integer;
  TmpSrcAsc : Integer;
  Range : Integer;
begin
  if (Src = '') Then
  begin
    Result:= '';
    Goto Fim;
  end;
  Key :=
'YUQL23KL23DF90WI5E1JAS467NMCXXL6JAOAUWWMCL0AOMM4A4VZYW9KHJUI2347EJHJKDF3424SKL K3LAKDJSL9RTIKJ';
  Dest := '';
  KeyLen := Length(Key);
  KeyPos := 0;
  SrcPos := 0;
  SrcAsc := 0;
  Range := 256;
  if (Action = UpperCase('C')) then
  begin
    Randomize;
    OffSet := Random(Range);
    Dest := Format('%1.2x',[OffSet]);
    for SrcPos := 1 to Length(Src) do
    begin
      SrcAsc := (Ord(Src[SrcPos]) + OffSet) Mod 255;
      if KeyPos < KeyLen then KeyPos := KeyPos + 1 else KeyPos := 1;
      SrcAsc := SrcAsc Xor Ord(Key[KeyPos]);
      Dest := Dest + Format('%1.2x',[SrcAsc]);
      OffSet := SrcAsc;
    end;
  end
  Else if (Action = UpperCase('D')) then
  begin
    OffSet := StrToInt('$'+ copy(Src,1,2));
    SrcPos := 3;
  repeat
    SrcAsc := StrToInt('$'+ copy(Src,SrcPos,2));
    if (KeyPos < KeyLen) Then KeyPos := KeyPos + 1 else KeyPos := 1;
    TmpSrcAsc := SrcAsc Xor Ord(Key[KeyPos]);
    if TmpSrcAsc <= OffSet then TmpSrcAsc := 255 + TmpSrcAsc - OffSet
    else TmpSrcAsc := TmpSrcAsc - OffSet;
    Dest := Dest + Chr(TmpSrcAsc);
    OffSet := SrcAsc;
    SrcPos := SrcPos + 2;
  until (SrcPos >= Length(Src));
  end;
  Result:= Dest;
  Fim:
end;
<?php
function Crypt_($Action, $Src) {
  $Key    = 'YUQL23KL23DF90WI5E1JAS467NMCXXL6JAOAUWWMCL0AOMM4A4VZYW9KHJUI2347EJHJKDF3424SKL K3LAKDJSL9RTIKJ';
  $KeyLen = strlen($Key);
  $KeyPos = 0;
  if ($Action == 'C') {
    $OffSet = rand(0,256);
//  Dest := Format('%1.2x',[OffSet]); //I tried to replace the function "sprintf", but the result is null
    $SrcPos = 1;
    while ($SrcPos <= strlen($Src)) {
      $SrcAsc = (ord($Src[$SrcPos]) + $OffSet) % 255;
      if ($KeyPos < $KeyLen) $KeyPos = $KeyPos + 1; else $KeyPos = 1;
      $SrcAsc = $SrcAsc xor ord($Key[$KeyPos]);
//    Dest := Dest + Format('%1.2x',[SrcAsc]); //I tried to replace the function "sprintf", but the result is null
      $OffSet = $SrcAsc;
      $SrcPos = $SrcPos + 1;
    }
  } else {
//  OffSet := StrToInt('$'+ copy(Src,1,2));
    $Dest   = '';
    $SrcPos = 3;
    while ($SrcPos >= strlen($Src)) {
//    SrcAsc := StrToInt('$'+ copy(Src,SrcPos,2));
      if ($KeyPos < $KeyLen) $KeyPos = $KeyPos + 1; else $KeyPos = 1;
      $TmpSrcAsc = $SrcAsc xor ord($Key[$KeyPos]);
      if ($TmpSrcAsc <= $OffSet) $TmpSrcAsc = 255 + $TmpSrcAsc - $OffSet;
      else $TmpSrcAsc = $TmpSrcAsc - $OffSet;
      $Dest = $Dest + chr($TmpSrcAsc);
      $OffSet = $SrcAsc;
      $SrcPos = $SrcPos + 2;
    }
  }
  return $Dest;
}
?>

我还想知道“xor”、“ord”和“chr”PHP是否会产生与Delphi相同的结果

谢谢大家的关注

德尔菲 带有参数
%x
Format
函数将整数转换为字符串十六进制表示形式;在本例中,是一个字节。例如,168被转换为
'A8'

参数以
“$”开头的stroint函数执行反向转换,从
“$A8”
返回168

PHP 在PHP中,通过调用和函数可以获得相同的结果


考虑到hexdec调用不需要前缀
“$”

格式
->
sprintf()
。软件安全101:编写自己的加密例程是个坏主意。我接受在这种情况下,您必须做到与现有程序兼容,但真正重要的是要理解,此代码以任何有意义的方式获得安全性的几率绝对为零。PHP和Delphi都内置了非常好的加密库,如果您指定相同的算法,它们应该是兼容的。你有什么理由不能使用它们吗?不回答你的问题,但是
如果(Action=UpperCase('C'))那么
就是愚蠢的
大写('C')
'C'
。这意味着
如果(大写字母(Action)='C'),那么可能是
?如果是这样,也许您应该改变在PHP中执行比较的方式。@SDC,正如您所提到的,我需要在PHP中使用相同的函数,因为它已经在Delphi中随我的系统分发。实际上,PHP和Delphi都有加密功能,但大多数都是单向的,您无法对它们进行解密。函数base_encode64 PHP太糟糕了,因为加密时总是得到与我所做的相反的结果。@carlos:base64不是加密。这是一种编码格式。获取8位数据并转换为6位格式,以便通过损坏8位数据的系统进行安全传输。朋友感谢您的回复,帮助很大。另一个让我困惑的问题。在同一个函数中,使用“xor”进行拉伸,但在PHP中总是给出不同的结果。Delphi代码:SrcAsc:=SrcAsc Xor Ord(键[KeyPos])PHP代码:
$SrcAsc=$SrcAsc xor ord($Key[$KeyPos-1])@carlos输入了什么?你得到了什么?你期望得到什么?。这看起来像是一个毫无疑问的问题,或者可能是另一个问题。@carlos por cierto,sería bueno poder hablar en español,不是吗?:德尔菲:
SrcAsc:=(Ord(Src[SrcPos])+偏移量)255模//el valor recibido:54
SrcAsc:=SrcAsc Xor Ord(键[KeyPos])//埃尔·瓦洛·雷西比多:111(德本·德本·雷西比尔·米斯莫·瓦洛的一方)
PHP:
$SrcAsc=(ord($Src[$SrcPos])+$OffSet)%255//el valor recibido:54
$SrcAsc=$SrcAsc xor ord($Key[$KeyPos])//勇敢的西恩多·埃尔米斯莫:54,坎多·德贝里亚·瑟尔111)
。这是一个很好的替代方案。作为完美的功能。“谢谢!