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.帮助很大!谢谢,杰夫
它是一个接收两个字符串并返回另一个字符串的函数.我将在注释中包含变量声明,因为它们已在代码中引入; 把它们放在功能的顶部.
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)
| 归档时间: |
|
| 查看次数: |
870 次 |
| 最近记录: |