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