功能“;德尔福;至;PHP“;
我需要在PHP中创建一个函数,从Delphi中的函数返回相同的结果。在PHP中,用“/”注释的摘录函数中有我无法替代的行,它们返回相同的结果 Delphi代码:功能“;德尔福;至;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
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)
。这是一个很好的替代方案。作为完美的功能。“谢谢!