加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

将Delphi 2007字符串加密例程转换为Delphi XE

发布时间:2020-12-15 09:33:26 所属栏目:大数据 来源:网络整理
导读:我们有一个Delphi 2007例程用于加密表中的密码.该例程最初是在十年或更久以前从CompuServe帖子中获取的,并且存在大量使用此例程加密的数据. 原始例程的核心是: chr(ord(Str[I]) xor not(ord(Id[I mod length(Id) + 1]))); 我知道由于Unicode的原因,转换为De
我们有一个Delphi 2007例程用于加密表中的密码.该例程最初是在十年或更久以前从CompuServe帖子中获取的,并且存在大量使用此例程加密的数据.

原始例程的核心是:

chr(ord(Str[I]) xor not(ord(Id[I mod length(Id) + 1])));

我知道由于Unicode的原因,转换为Delphi XE会有问题,因此我将该代码分解为一个函数,该函数在备忘录中显示计算的每个步骤:

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的前端.

解决方法

简单的方法实质上如下:

>从Delphi 2007代码开始.
>将字符串更改为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需求所必需的,但对我来说感觉更自然!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读