微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

升级到Delphi 2007之后,为什么我的加密不起作用?

我最近从Delphi 2007中获取了一些代码并将其升级到Delphi 2009.这可能与也可能不相关.

但是,当我在计算机上运行代码时,密码的解密不能正确解密.这是代码.

Seed := GenerateIntFromString('usercode');

// Check if a password already exists
if Tableuser.FieldByName('PASSWORD').Asstring <> '' then
begin
    EncodedPassword := Tableuser.FieldByName('PASSWORD').Asstring;
    DecodedPassword := EncryptDecrypt(EncodedPassword,Seed);
//etc.. And the function

function TlogonForm.EncryptDecrypt(Input: string; Seed: integer) : string;
var
i : integer;
Output : string;
begin
    RANDSEED := Seed;
    Output := '';
    for i := 1 to Length(Input) do
        Output := Output + Chr(Ord(Input[i]) XOR (RANDOM(254) + 1));
    Result := Output;
end;

所以,如果我的用户代码是TD
我的密码是’JOEJOE’

加密密码是:ì?Âp?

解密的passowrd是:JìEJùE

它应该明显解密为JOEJOE.踢球者,如果我构建代码并将exe发送给另一个用户,它就会解密.这让我相信代码并没有什么问题,而是我的电脑有些异常.会是什么呢?

你可以对此表示不满,因为它可能与此无关.我只提到它,因为它是另一种情况,一台计算机上的东西工作正常而另一台计算机没有.

但是也有一种情况是在尝试设置过滤器时

Tableuser2.Filter := FilterString;

它适用于我,但其他用户收到错误.

Tableuser2:错误3106:在记录筛选器表达式中找到不支持的运算符.

即使我们使用相同的名称过滤相同的代码.也许是数据库问题?

解决方法

尝试从Ansi到Unicode的端口,如下所示:

function TlogonForm.EncryptDecrypt(Input: AnsiString; Seed: integer) : AnsiString;
var
i : integer;
Output : AnsiString;
begin
    RANDSEED := Seed;
    Output := '';
    for i := 1 to Length(Input) do
        Output := Output + AnsiChar(Ord(Input[i]) XOR (RANDOM(254) + 1));
    Result := Output;
end;

我最好的猜测是,由于AnsiChar和UnicodeChar之间的区别,预期的结果是不同的.如果您设法生成一些无法存储在数据库的非unicode数据字段中的无效代码点,则可能会出现一些有趣的错误.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐