簡體   English   中英

將 Delphi 2007 字符串加密例程轉換為 Delphi XE

[英]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 的前端。

簡單的方法本質上如下:

  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 需求不是必需的,但對我來說感覺更自然!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM