![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Аномальные явления в функциях шифрации/дешифрации строк [D6, 95/98]
Dr. Genius © (2006-09-11 08:39:00)Здравствуйте!
Привожу ниже текст модуля шифрации/дешифрации строк. Пробую зашифровать с помощью функции Encrypt строку ‘Это строка’, но функция шифрует только слово ‘Это’. Вообще подобную картину я встречаю во всех функциях шифрации строк, которые мне попадаются. Некоторые строки отлично шифруются/дешифруются, но другие почему-то нет (шифруются, а следовательно и дешифруются не полностью). Почему так происходит? Можно ли это исправить?
unit Crypt32;
interface
const
StartKey = 981; { Start default key }
MultKey = 12674; { Mult default key }
AddKey = 35891; { addd default key }
function Encrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;
function Decrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;
implementation
{$R-}
{$Q-}
function Encrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;
var
I : Integer;
begin
Result := '';
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));
StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey;
end;
end;
function Decrypt(const InString:string; StartKey,MultKey,AddKey:Integer): string;
var
I : Integer;
begin
Result := '';
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));
StartKey := (Byte(InString[I]) + StartKey) * MultKey + AddKey;
end;
end;
{$R+}
{$Q+}
end.
Мне нужна нормальная функция шифрации/дешифрации строк. Чтобы работала со всеми строками, и чтобы можно было самому задавать ключи. Кто может поделиться такой?
umbra (2006-09-11 11:39:00) [1]Dr. Genius (11.09.06 11:29) [10]
Вам уже тут все рассказали. В приведенном Вами примере третий символ шифрованной строки - \0, а половина других - непечатные, поэтому в эдите Вы ее не увидите. Лучше хранить шифрованную строку в отдельной строковой переменной и эту переменную передаватьDecrypt. Типа
var
encrypted: string;
{.......................................}
encrypted := Encrypt(...);
Edit1.Text := Decrypt(...);
Dr. Genius (2006-09-11 11:29:00) [2]Проверяю я это способом Edit1.Text:=Encrypt(...), а потом пытаюсь делать Decrypt полученной шифрованной строки.
Рамиль (2006-09-11 11:03:00) [3]
> Символы #0 не мешают дешифрованию, т.к. не влияют на Length.
>
> А вот при выводе на экран зашифрованной строки это может
> сказаться.
Угу, не проснулся я еще:)
Наиль (2006-09-11 10:46:00) [4]Наконец и до меня дошло.
Дело действительно в #0.
Скорее всего проверка делается следующим образом:
Edit1.Text:=Encrypt(...);
Прежде чем вывести текст на экран Windows преобразует строку к PChar.
На этом этапе и возникает потеря текста.
Чтобы в этом убедиться достаточно результат сохранить в файл и просмотреть его любым вьювером (Hex-редактором).
MBo (2006-09-11 10:42:00) [5]>Рамиль © (11.09.06 10:35) [3]
Это не так.
Символы #0 не мешают дешифрованию, т.к. не влияют на Length.
А вот при выводе на экран зашифрованной строки это может сказаться.
Elen (2006-09-11 10:38:00) [6]
> Dr. Genius
А в принципе стоит на всякий случай проверять в цикле на наличие chr(0)
Elen (2006-09-11 10:37:00) [7]
> Рамиль ©
Это влияло бы будь тип результата pchar
Elen (2006-09-11 10:36:00) [8]
> Dr. Genius
У меня работает правильно. (WinXP). Как вы вызываете шифровку\дешифровку?
Рамиль (2006-09-11 10:35:00) [9]При шифровании появляются символы #0, которые означают конец строки. Соот. дешифруется только до первого #0.
Наиль (2006-09-11 10:21:00) [10]> Вообще подобную картину я встречаю во всех функциях шифрации
> строк, которые мне попадаются
Код проверки этих функций помог бы больше, чем код самих функций.
umbra (2006-09-11 10:14:00) [11]
> Пробую зашифровать с помощью функции Encrypt строку ‘Это
> строка’, но функция шифрует только слово ‘Это’.
А как Вы это определили?