У нас есть процедура Delphi 2007, используемая для шифрования pa мечи в таблице. Процедура была первоначально взята из публикации 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 он разваливается. Я думаю, что это как-то связано с выполнением Ord на (Wide) Char, но это самое близкое, что я могу получить.
Любой совет очень признателен.
Отредактировано
Вот исходный код 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 # для нового веб-интерфейса.