Почему мое шифрование не работает после обновления после Delphi 2007? - PullRequest
4 голосов
/ 14 декабря 2011

Недавно я взял некоторый код из 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: в выражении фильтра записи обнаружен неподдерживаемый оператор.

Даже если мы фильтруем по тому же имени, выполняющему тот же код,Может быть проблема с базой данных?

Ответы [ 3 ]

7 голосов
/ 14 декабря 2011

Попробуйте сделать порт из 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 вашей БД, у вас могут быть забавные ошибки.

1 голос
/ 14 декабря 2011

Ваша проблема заключается в том, что 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.Строка в кодировке ANSI, которую предыдущие версии Delphi называли AnsiString.Точно так же Chr() генерирует 16, но WideChar символ, но вам нужен AnsiChar, 8-битный символьный тип ANSI.


Однако, безусловно, будет ряд других проблем, которые необходимо решить.Я предлагаю вам прочитать документ Марко Канто по Delphi и Unicode .Перед тем, как продолжить работу с портом, вам действительно следует разобраться с проблемами, подробно описанными в этом документе.

0 голосов
/ 14 декабря 2011

Первое, что я хотел бы сделать, - это записать информацию о входах / выходах ваших функций.

Это действительно звучит так, как будто значение в TableUser.FieldByName ("Password") не соответствует ожидаемому в обоих случаях.

Еще одна вещь, на которую я хотел бы обратить внимание, это сопоставление базы данныхиспользуется с обеими машинами.Я предполагаю, что базовая база данных отличается между двумя вашими тестами;или, по крайней мере, информация строки подключения имеет различные значения для сопоставления.Это, безусловно, может скинуть дешифрование.

...