我们有一个Delphi 2007例程,用于加密表中的密码。该例程最初是从十年或更久前的CompuServe帖子中获取的,并且使用此例程加密的大量数据存在。
原始例程的核心是这个:
chr(ord(Str[I]) xor not(ord(Id[I mod length(Id) + 1])));
我知道将代码转换为Delphi XE会存在问题,因为涉及Unicode,所以我将该代码拆分成一个函数,并在备忘录中显示每个计算步骤:
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 步骤中它会崩溃。我认为这与对 (Wide) Char 执行 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
),在处理原始二进制数据时通常不是很好。但也许你已经意识到了这一点,并且只是按正确的方式执行任务? - Andreas Rejbrandarray of byte
而不是字符串。C#没有与AnsiChar和AnsiString等效的东西。一旦我有了Delphi的array of byte
,我会切换到C#的byte[]
。这个部分应该很简单。 - David Heffernan