Преобразование подпрограммы шифрования строки Delphi 2007 в Delphi XE - PullRequest
5 голосов
/ 07 июля 2011

У нас есть подпрограмма 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 он разваливается.Я думаю, что это как-то связано с выполнением орда на (широкоугольном) символе, но это самый близкий из всех, что я могу получить.

Любой совет, который очень ценится.

Вот оригинальный код 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 # для нового веб-интерфейса.конец.

1 Ответ

8 голосов
/ 07 июля 2011

Простой подход, по сути, заключается в следующем:

  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, но для меня это более естественно!

...