Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Аномальные явления в функциях шифрации/дешифрации строк [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 строку ‘Это
> строка’, но функция шифрует только слово ‘Это’.

А как Вы это определили?


Наверх

Титульная страница Поиск, карта сайта Написать письмо