【问题标题】:Delphi <> PHP XOR EncryptionDelphi <> PHP XOR 加密
【发布时间】:2014-10-11 22:28:34
【问题描述】:

我正在尝试在 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);
?>

我的 Delphi 是;

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;

加密/解密不起作用。当试图从 PHP 中的 Delphi 解码编码值时,我得到了一堆垃圾。

我感觉这可能与字符编码有关?

【问题讨论】:

  • Delphi 使用 Ansi 或从 D2009 开始使用 UTF16 和 PHP 使用 UTF8。您必须确保使用相同的编码。
  • 第一步是停止使用字符串来保存字节数组。使用TBytes。这是我们遇到的关于加密的最大误解。加密对二进制数据而不是文本进行操作。

标签: php delphi encryption delphi-xe6


【解决方案1】:

我在这里猜测一下,假设您使用的是 Delphi 版本,其中 string 是 UnicodeString。 PHP 一般使用一些 ANSI 编码,which can be configured。处理这个问题的最好方法是将你的 Delphi 代码保存为 UTF-8 并从 UTF-8 加载,并确保你的 PHP 从 UTF-8 加载。全面标准化一种编码,这样的问题就不会发生。

【讨论】:

  • 我实际上使用的是Delphi XE6,所以我假设它是Ansi?
  • @Tom:任何 D2009 或更高版本(包括整个 XE 行)都是 Unicode。
  • 那么如何让 Delphi 和 PHP 编码兼容呢?
  • @Tom:完全按照我说的去做。使用标准编码。例如,当您写出数据时,请使用 UTF8String 而不是 string。
  • 我已经试过了,在 PHP 中我仍然得到不同的结果
【解决方案2】:

这里有几个问题:

  • PHP 中的字符串索引是从零开始的,而不是您的代码假设的从一开始的。
  • Delphi 字符串(嗯,在现代 Delphi 中)是 UTF-16 编码的。您的代码采用一些未指定的 8 位编码。
  • 加密/解密对二进制数据而不是文本进行操作,您无法识别这一点。

你应该像这样加密:

  1. 以明确定义的特定编码对文本进行编码。例如,UTF-8。这给出了一个字节数组。在德尔福是TBytes。
  2. 加密此字节数组以生成另一个字节数组。
  3. 使用 base64 对该字节数组进行编码以获得文本表示。

解密只是颠倒这些步骤。要吸收的关键是加密/解密对二进制数据而不是文本进行操作。

【讨论】:

    猜你喜欢
    • 2013-09-07
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2011-10-09
    • 2019-03-11
    • 1970-01-01
    相关资源
    最近更新 更多