[英]Converting Delphi 2007 string encryption routine to Delphi XE
我们有一个 Delphi 2007 例程用于加密表中的密码。 该例程最初是从十年或更长时间前的 CompuServe 帖子中获取的,并且存在大量使用此例程加密的数据。
原套路的核心是这样的:
chr(ord(Str[I]) xor not(ord(Id[I mod length(Id) + 1])));
我知道转换到 Delphi XE 会因为 Unicode 出现问题,所以我将该代码分解为 function,在备忘录中显示计算的每个步骤:
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 步骤中它分崩离析。 我认为这与在(宽)字符上执行 Ord 有关,但这是我能得到的最接近的。
非常感谢任何建议。
已编辑
这是原始 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 的前端。
简单的方法本质上如下:
string
更改为AnsiString
。Char
更改为AnsiChar
。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 需求不是必需的,但对我来说感觉更自然!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.