Форум: "Начинающим";
Текущий архив: 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.47 MB
Время: 0.014 c