[英]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.