我正在尝试在PHP和Delphi之间进行加密和解密。
我的PHP代码是;
<?php
error_reporting(E_ALL);
$key = "5y';syhl0ngl4st1ngdfvt5tt";
function decrypt1($string, $key){
$y = 1;
for ($x = 1;$i < strlen($string); $i++) {
$a = (ord($string[$x]) and 0x0f) ^ (ord($key[$y]) and 0x0f);
$string[$x] = chr((ord($string[$x]) and 0xf0) + $a);
$y++;
if ($y > strlen($key)) $y = 1;
}
return $string;
}
echo decrypt1(base64_decode("cWx0fw=="),$key);
?>
My Delphi is;
function Decrypt1(Str : String; Key: string): AnsiString;
var
X, Y : Integer;
A : Byte;
begin
Y := 1;
for X := 1 to Length(Str) do
begin
A := (ord(Str[X]) and $0f) xor (ord(Key[Y]) and $0f);
Str[X] := char((ord(Str[X]) and $f0) + A);
Inc(Y);
If Y > length(Key) then Y := 1;
end;
Result := Str;
end;
function Encrypt(Str : String; Key: string): String;
begin
result:= Decrypt1(str,key);
result:= EncodeBase64(result);
end;
加密/解密不起作用。当试图解码编码值从Delphi在PHP中,我得到了一堆垃圾。
我有一种感觉,这可能与字符编码有关?
这里有几个问题:
- PHP中的字符串索引是从零开始的,而不是像代码中假设的那样基于一。
- Delphi字符串(在现代Delphi中)是UTF-16编码的。您的代码假定了一些未指定的8位编码。
- 加密/解密操作二进制数据而不是文本,您无法识别这一点。
你应该这样加密:
- 以特定的、定义良好的编码对文本进行编码。例如,UTF-8。这给出了一个字节数组。在Delphi中是
TBytes
。 - 加密此字节数组以产生另一个字节数组。
- 使用base64编码字节数组以获得文本表示。
解密只是将这些步骤颠倒过来。要注意的关键是加密/解密操作的是二进制数据而不是文本。
我将在这里猜测,并说您正在使用Delphi版本,其中字符串是UnicodeString
。PHP通常使用一些可以配置的ANSI编码。处理这个问题的最佳方法是将Delphi代码保存为UTF-8并从UTF-8加载,并确保PHP从UTF-8加载。统一统一的编码,这样就不会出现这样的问题了。