Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2013, 14:59   #1
Ko$
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 91
Вопрос Шифр Вернама

Здравствуйте на просторах интернета нашел код Шифрования Вернама
http://zetblog.ru/programming/200812...0/#comment-924
только он не работает Incompatible types: 'String' and 'Integer' ругается на строку:
shStr[i]:=oStr[i] xor key[i];
пишу так то же самое:
shstr:=((StrToInt(ostr[i])) xor (StrToInt(key[i])));
сам шифр
Код:
procedure shifr_Vernam;

var

  oStr, key, shStr :string;

  i:integer;

begin

  oStr:='Holo word!';  //определяем открытый текст

  randomize; //Необходимая функция для функции random, чтобы последняя каждый раз выдавала случайные значения

//генерируем случайный ключ длиной равной длине открытого текста

  for i:=1 to length(oStr) do

    key[i]:=Chr(random(255)); //генерируем случайное число из диапозона от 0 до 255, и полученное число переводим в символ;

//собственно само шифрование

  for i:=1 to length(oStr) do

    shStr[i]:=oStr[i] xor key[i];

//для наглядности выведем на экран результат работы

  lbl1.Caption:=('Otkrytyi text: ',oStr);

  lbl2.Caption:=('Zashifrovanyi text: ',shStr);

end;
и как сделать чтоб можно было шифровать больше 255 символов???
Ko$ вне форума Ответить с цитированием
Старый 04.06.2013, 15:09   #2
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
По умолчанию

Делай Memo или TStrings и обрабатывай построчно. А лучше засунуть это во временный файл и обработать его побайтово.
hon вне форума Ответить с цитированием
Старый 04.06.2013, 15:10   #3
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Сделай так
Ord(oStr[i]) xor Ord(key[i])
FaTaL вне форума Ответить с цитированием
Старый 04.06.2013, 15:19   #4
Ko$
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 91
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Сделай так
Ord(oStr[i]) xor Ord(key[i])
всё равно не работает


Цитата:
Делай Memo или TStrings и обрабатывай построчно. А лучше засунуть это во временный файл и обработать его побайтово.
файл есть, пример проги прилагается
Вложения
Тип файла: rar Shifr.rar (484.2 Кб, 41 просмотров)
Ko$ вне форума Ответить с цитированием
Старый 04.06.2013, 16:29   #5
Ko$
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 91
По умолчанию

Люди помогите !!!
Ko$ вне форума Ответить с цитированием
Старый 04.06.2013, 17:27   #6
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Невнимательность.
Замени
Код:
shstr:=Ord(oStr[i]) xor Ord(key[i]);
на
Код:
shstr[i]:=Char(Ord(oStr[i]) xor Ord(key[i]));
Работать будет в большинстве случаев, но обращаю внимание на возможную потерю данных:
мы используем function Ord(X: Ordinal): Byte; (на выходе получаем 8 бит)
Char с недавних пор равен WideChar (16 бит),
String с тех же пор UnicodeString (каждый символ = 2 байта = 16 бит).

Таким образом при входе мы шифруем каждый символ = 16 бит и получаем на промежуточном этапе 8 бит (старший байт машет нам ручкой и уходит в небытие), затем функция Char опять раздувает его до 16 бит (тип на выходе WideChar).

Вывод: строками выше нельзя кодировать текст в юникоде.

Последний раз редактировалось zetrix; 04.06.2013 в 17:37.
zetrix вне форума Ответить с цитированием
Старый 04.06.2013, 18:38   #7
Ko$
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 91
Злость

Цитата:
Сообщение от zetrix Посмотреть сообщение
Невнимательность.
Замени
Код:
shstr:=Ord(oStr[i]) xor Ord(key[i]);
на
Код:
shstr[i]:=Char(Ord(oStr[i]) xor Ord(key[i]));
Работать будет в большинстве случаев, но обращаю внимание на возможную потерю данных:
мы используем function Ord(X: Ordinal): Byte; (на выходе получаем 8 бит)
Char с недавних пор равен WideChar (16 бит),
String с тех же пор UnicodeString (каждый символ = 2 байта = 16 бит).

Таким образом при входе мы шифруем каждый символ = 16 бит и получаем на промежуточном этапе 8 бит (старший байт машет нам ручкой и уходит в небытие), затем функция Char опять раздувает его до 16 бит (тип на выходе WideChar).

Вывод: строками выше нельзя кодировать текст в юникоде.
[Warning] Unit1.pas(55): Unsafe code 'String index to var param'

Пишет
Ko$ вне форума Ответить с цитированием
Старый 04.06.2013, 18:55   #8
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Ko$, я предупреждал, IDE вас предупреждает (правда немного в другом: "можете выбежать за пределы строки. Будь осторожен!").
Длину строки shstr необходимо задать равной строке oStr (а то писать действительно будем в никуда). После этого и предупреждение должно исчезнуть.

Последний раз редактировалось zetrix; 04.06.2013 в 18:59.
zetrix вне форума Ответить с цитированием
Старый 04.06.2013, 19:06   #9
Ko$
Пользователь
 
Регистрация: 21.12.2010
Сообщений: 91
По умолчанию

Нажимеш кнопку Шифровать выдаёт ошибку и повисает
Ko$ вне форума Ответить с цитированием
Старый 04.06.2013, 19:37   #10
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Размер у shstr какой? Если в начале шифрования у вас написано shstr := ''; то естественно писать будет некуда.Первое же обращение shstr[i] приведёт к ошибке.
Исправленный код процедуры шифрования опубликуйте тут.
zetrix вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифр SYSSI Безопасность, Шифрование 4 13.05.2011 19:00
Шифр? KoBRaAndrey Работа с сетью в Delphi 0 12.12.2009 16:16
Шифр Progs1024 Паскаль, Turbo Pascal, PascalABC.NET 9 12.10.2009 19:51
Шифр Razora Свободное общение 10 26.06.2007 15:52