簡體   English   中英

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

[英]Why doesn't my encryption work after I upgrade beyond 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數據字段中的無效代碼點,則可能會出現一些有趣的錯誤。

您的問題是Delphi 2009的文本使用Unicode而不是ANSI。 這是一個重大的突破性變化,需要大量的移植工作。 您不僅需要處理代碼中的編碼問題,還需要升級您使用的任何第三方組件。

您可以恢復此特定函數的先前行為,如下所示:

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;

在Delphi 2009中, string數據類型是UTF-16編碼的字符串。 以前版本的Delphi命名為AnsiString的ANSI編碼字符串。 類似地, Chr()生成一個16但是WideChar字符,但是你想要一個8位ANSI字符類型的AnsiChar


但是,肯定還有許多其他問題需要解決。 我建議你閱讀MarcoCantù關於Delphi和Unicode的白皮書。 在繼續進一步使用端口之前,您真的應該掌握本文中詳述的問題。

我要做的第一件事是在函數的輸入/輸出周圍進行一些記錄。

聽起來似乎TableUser.FieldByName(“Password”)中的值可能沒有傳遞您在兩種情況下的預期。

我要注意的另一件事是與兩台機器一起使用的數據庫整理。 我假設你的兩個測試用例之間的底層數據庫是不同的; 或者,至少,連接字符串信息具有不同的整理值。 這肯定會摒棄解密。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM