Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

Аномальные явления в функциях шифрации/дешифрации строк   Найти похожие ветки 

 
Dr. Genius   (2006-09-11 08:39) [0]

Здравствуйте!

Привожу ниже текст модуля шифрации/дешифрации строк. Пробую зашифровать с помощью функции 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 10:14) [1]


> Пробую зашифровать с помощью функции Encrypt строку ‘Это
> строка’, но функция шифрует только слово ‘Это’.

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


 
Наиль ©   (2006-09-11 10:21) [2]

> Вообще подобную картину я встречаю во всех функциях шифрации
> строк, которые мне попадаются

Код проверки этих функций помог бы больше, чем код самих функций.


 
Рамиль ©   (2006-09-11 10:35) [3]

При шифровании появляются символы #0, которые означают конец строки. Соот. дешифруется только до первого #0.


 
Elen ©   (2006-09-11 10:36) [4]


> Dr. Genius

У меня работает правильно. (WinXP). Как вы вызываете шифровку\дешифровку?


 
Elen ©   (2006-09-11 10:37) [5]


> Рамиль ©

Это влияло бы будь тип результата pchar


 
Elen ©   (2006-09-11 10:38) [6]


> Dr. Genius

А в принципе стоит на всякий случай проверять в цикле на наличие chr(0)


 
MBo ©   (2006-09-11 10:42) [7]

>Рамиль ©   (11.09.06 10:35) [3]
Это не так.
Символы #0 не мешают дешифрованию, т.к. не влияют на Length.
А вот при выводе на экран зашифрованной строки это может сказаться.


 
Наиль ©   (2006-09-11 10:46) [8]

Наконец и до меня дошло.
Дело действительно в #0.
Скорее всего проверка делается следующим образом:
Edit1.Text:=Encrypt(...);

Прежде чем вывести текст на экран Windows преобразует строку к PChar.
На этом этапе и возникает потеря текста.
Чтобы в этом убедиться достаточно результат сохранить в файл и просмотреть его любым вьювером (Hex-редактором).


 
Рамиль ©   (2006-09-11 11:03) [9]


> Символы #0 не мешают дешифрованию, т.к. не влияют на Length.
>
> А вот при выводе на экран зашифрованной строки это может
> сказаться.

Угу, не проснулся я еще:)


 
Dr. Genius   (2006-09-11 11:29) [10]

Проверяю я это способом Edit1.Text:=Encrypt(...), а потом пытаюсь делать Decrypt полученной шифрованной строки.


 
umbra ©   (2006-09-11 11:39) [11]

Dr. Genius   (11.09.06 11:29) [10]

Вам уже тут все рассказали. В приведенном Вами примере третий символ шифрованной строки  - \0, а половина других - непечатные, поэтому в эдите Вы ее не увидите. Лучше хранить шифрованную строку в отдельной строковой переменной и эту переменную передавать Decrypt. Типа

var
 encrypted: string;
{.......................................}
encrypted := Encrypt(...);
Edit1.Text := Decrypt(...);



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.014 c
2-1158073633
-Федя-
2006-09-12 19:07
2006.10.01
Комбо Бокс


15-1157874177
Сергуня
2006-09-10 11:42
2006.10.01
Так к слову


2-1157577757
PPartition
2006-09-07 01:22
2006.10.01
Корректна ли такая конструкция ?


15-1157999740
Евгений Р.
2006-09-11 22:35
2006.10.01
Нарисовать звездочку


9-1136609402
Cash
2006-01-07 07:50
2006.10.01
10000 кубиков





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский