首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi <> PHP加密

Delphi <> PHP加密
EN

Stack Overflow用户
提问于 2014-08-18 22:22:31
回答 2查看 1K关注 0票数 0

我试图在PHP和Delphi之间进行加密和解密。

我的PHP代码是;

代码语言:javascript
复制
<?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);
?>

我的德尔菲是;

代码语言:javascript
复制
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中解码编码值时,我得到了一堆垃圾。

我有预感这可能和字符编码有关吗?

EN

回答 2

Stack Overflow用户

发布于 2014-08-19 15:04:53

这里有几个问题:

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

你应该像这样加密:

  1. 用特定的、定义良好的编码对文本进行编码。例如,UTF-8。这就提供了一个字节数组。在德尔菲,这是TBytes
  2. 加密此字节数组以产生另一个字节数组。
  3. 使用base64对字节数组进行编码以获得文本表示形式。

解密只会逆转这些步骤。需要吸收的关键是加密/解密是在二进制数据而不是文本上进行的。

票数 4
EN

Stack Overflow用户

发布于 2014-08-18 22:48:09

我将在这里猜测一下,您使用的是Delphi版本,其中字符串UnicodeString。PHP通常使用一些ANSI编码,which can be configured。处理这一问题的最佳方法是将Delphi代码保存到UTF-8,并从UTF-8加载,并确保您的PHP负载来自UTF-8。对一种编码进行全面标准化,这样的问题就不会发生。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25372962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档