PHP函数到Delphi函数
我正在尝试创建一个PHP脚本和一个Delphi程序来“对话”。为了保证它的安全性,我想对从两侧传出的文本进行加密,因此在两端使用相同的加密功能 这是我为PHP找到的函数: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(
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.我看不出这是一个多么有用的答案