gpt4 book ai didi

delphi - 将 Delphi 2007 字符串加密例程转换为 Delphi XE

转载 作者:行者123 更新时间:2023-12-03 15:08:41 24 4
gpt4 key购买 nike

我们有一个 Delphi 2007 例程,用于加密表中的密码。该例程最初是从十多年前的 CompuServe 帖子中获取的,并且存在使用该例程加密的大量数据。

原始例程的核心是这样的:

chr(ord(Str[I]) xor not(ord(Id[I mod length(Id) + 1])));

我知道由于 Unicode,转换为 Delphi XE 会出现问题,因此我将该代码分解为一个函数,该函数在备忘录中显示计算的每个步骤:

function TfrmMain.EncodeDecode(AString: string): string;
const
Hash: string = '^%12h2DBC3f41~~#6093fn7mY7eujEhbFD3DZ|R9aSDVvUY@dk79*7a-|- Q';
var
I: Integer;
IMod: Integer;
HMod: Char;
OMod: Integer;
AStrI: Char;
OStrI: Integer;
ResultStr: string;
XOrNot: Integer;
ChrXN: AnsiChar;
begin
Memo1.Clear;
Memo1.Lines.Add ('AStrI' + TAB + 'IMod' + TAB + 'HMod' +
TAB + 'OMod' + TAB + 'OStrI' + TAB + 'XOrNot' + TAB + 'ChrXN');

for I := 1 to Length (AString) do
begin
IMod := I mod Length (Hash) + 1;
HMod := Hash [IMod];
OMod := Ord (HMod);
AStrI := AString[I];
OStrI := Ord (AStrI); // This is where things go south
XOrNot := OStrI xor not OMod;
ChrXN := AnsiChar (XOrNot);
ResultStr := ResultStr + ChrXN;

Memo1.Lines.Add (AStrI + TAB +
IntToStr (IMod) + TAB +
HMod + TAB +
IntToStr (OMod) + TAB +
IntToStr (OStrI) + TAB +
IntToStr (XOrNot) + TAB +
ChrXN);
end;
Memo1.Lines.Add (ResultStr);
Result := ResultStr;
end;

与 ROT13 一样,加密和解密使用相同的例程。如果我向它提供像“ABCDEFGHI”这样的字符串,Delphi 2007 版本可以获取生成的加密字符串,通过相同的例程运行它,并返回原始字符串。然而,Delphi XE 中的版本并不能完全工作。我做了一些调整(包括在上面)来改进它,但是在 OstrI 步骤上它崩溃了。我认为这与在(宽)字符上执行命令有关,但这是我能得到的最接近的结果。

非常感谢任何建议。

<小时/>

已编辑

这里是原始的 Delphi 2007 代码:

function EncodeDecode(Str: string): string;
const
Id: string = '^%12h2DBC3f41~~#6093fn7mY7eujEhbFD3DZ|R9aSDVvUY@dk79*7a-|- Q';
var
I: Integer;
begin
for I := 1 to Length (Str) do
Str[I] := chr (ord (Str[I]) xor not (ord (Id[I mod Length (Id) + 1])));
Result := Str;
end;

实际上,我们不仅必须将其转换为 Delphi XE 以用于现有软件的新版本,还必须将其转换为 C# 以用于新的基于 Web 的前端。

最佳答案

简单的方法本质上如下:

  1. 从 Delphi 2007 代码开始。
  2. string 更改为 AnsiString
  3. Char 更改为 AnsiChar
  4. 可以将 Chr() 更改为 AnsiChar()

您的代码可能有更多细微差别。理想情况下,我希望看到代码的原始 Delphi 2007 版本。

<小时/>

发布原始代码后,我认为您应该可以在 XE 中使用此例程:

function EncodeDecode(const Str: AnsiString): AnsiString;
const
Id: AnsiString = '^%12h2DBC3f41~~#6093fn7mY7eujEhbFD3DZ|R9aSDVvUY@dk79*7a-|- Q';
var
I: Integer;
begin
Result := Str;
for I := 1 to Length(Result) do
Result[I] := AnsiChar(ord(Result[I]) xor not (ord(Id[I mod Length (Id) + 1])));
end;

请注意,我更改了代码,将输入作为 const 字符串,并使用 Result 作为工作缓冲区。这对于您的 ANSI/Unicode 需求来说不是必需的,但对我来说感觉更自然!

关于delphi - 将 Delphi 2007 字符串加密例程转换为 Delphi XE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6615750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com