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

标签 delphi unicode delphi-2009 encryption

我最近从 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?

解密后的密码为: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 数据字段中的无效代码点,则可能会遇到一些有趣的错误。

关于delphi - 为什么升级到 Delphi 2007 之后我的加密不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8507785/

相关文章:

rest - 如何强制 TRESTRequest.ContentType 为 ctAPPLICATION_JSON

ios - 在 StringGrid 中输入值时是否可以设置键盘类型?

Delphi 2009 在 RAD Studio 命令提示符中使用 MSBuild F1026 文件未找到

delphi - 在 DevExpress 网格中根据提示显示单元格内容

c++ - 使用固定编码的字符串到字节序列的转换,最好是 UTF-8

delphi - 在 Delphi 2009 中编译 Delphi 5 代码

sql - 如何在没有安装 SQL native 客户端 2008 的情况下部署 dbExpress 数据库应用程序?

delphi - 如何使用 dbExpress 执行 SQL 脚本?

c# - 如何从字符串中删除 unicode.OtherSymbol

unicode - 如何确定 UTF-16 字符的字节宽度?