C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Проблемы при гаммировании, в алгоритме шифрования данных
R@kot
  Отправлено: 19.04.2005, 00:58


Дежурный стрелочник

Группа: Участник
Сообщений: 32



Требуется реализовать алгоритм шифрования данных.
Одной из частей придуманного алгоритма является так называемое "гаммирование", т.е. на изначальный текст накладывается "гамма" на основе введённого пользователем ключа:
например, начальный текст "это начальный текст" и ключ "!". Символы преобразуются в численные коды этих символов, а затем "складываются по модулю 2" (операция XOR, она же "^") с ключом. Т.е. код символа "э" (253) складывается по модулю 2 с кодом символа "!" (33) (в результате получается число 220, а это код символа "Ь"), затем код символа "т" складывается по модулю 2 с кодом символа "!" и т.д.. Таким образом, после шифрования вместо фразы "это начальный текст" получается что-то типа "Ь..... и т.д.". Полученный зашифрованный текст отображается в Edit'е на форме, чтобы его можно было скопировать и куда-нибудь передать.

А вот в чём заключается проблема: если символ ключа совпадает с одним из символов открытого текста (например, ключ "э"), тогда при сложении по модулю 2 двух одинаковых чисел получается "0". А "0" — то это код символа окончания строки ('\0'). А он не только не отображается в Edit'е, но и глушит все символы, идущие после него.

Вопрос, как обойти эту проблему и сделать так, чтобы зашифрованный текст можно было бы отобразить?
AVC
Отправлено: 19.04.2005, 08:34


Ветеран

Группа: Модератор
Сообщений: 1583



Можно так — если результат = 0 то xor не применяется.
Treumer
Отправлено: 19.04.2005, 09:34


Станционный диспетчер

Группа: Участник
Сообщений: 92



QUOTE (R@kot @ 19/04/2005, 00:58)
Требуется реализовать алгоритм шифрования данных.
Одной из частей придуманного алгоритма является так называемое "гаммирование", т.е. на изначальный текст накладывается "гамма" на основе введённого пользователем ключа:
например, начальный текст "это начальный текст" и ключ "!". Символы преобразуются в численные коды этих символов, а затем "складываются по модулю 2" (операция XOR, она же "^") с ключом. Т.е. код символа "э" (253) складывается по модулю 2 с кодом символа "!" (33) (в результате получается число 220, а это код символа "Ь"), затем код символа "т" складывается по модулю 2 с кодом символа "!" и т.д.. Таким образом, после шифрования вместо фразы "это начальный текст" получается что-то типа "Ь..... и т.д.". Полученный зашифрованный текст отображается в Edit'е на форме, чтобы его можно было скопировать и куда-нибудь передать.

А вот в чём заключается проблема: если символ ключа совпадает с одним из символов открытого текста (например, ключ "э"), тогда при сложении по модулю 2 двух одинаковых чисел получается "0". А "0" — то это код символа окончания строки ('\0'). А он не только не отображается в Edit'е, но и глушит все символы, идущие после него.

Вопрос, как обойти эту проблему и сделать так, чтобы зашифрованный текст можно было бы отобразить?

Очень рекомендую переводить результат гаммирования в BASE64.
Гарантированое отсутствие нечитаемых символов!

Отредактировано Treumer — 19/04/2005, 09:35
R@kot
Отправлено: 19.04.2005, 14:37


Дежурный стрелочник

Группа: Участник
Сообщений: 32



Treumer, а можно поподробнее насчёт перевода в этот самый BASE64?
Boyko
Отправлено: 19.04.2005, 16:34


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (R@kot @ 18/04/2005, 23:58)

Вопрос, как обойти эту проблему и сделать так, чтобы зашифрованный текст можно было бы отобразить?

А так делают криптологи:

Set1 — хорошие символы, которые могуть печататься.
Set2 — плохие символы, которые не могуть печататься.
берем хороший символ, например "А",

шифрование:

гаммируем,
эсли результат из Set1-{A} — все в порядке,
эсли результат из Set2+{A} — то резултат = А и гаммируем тот же самый символ снова следующим байтом гаммы

дешифрование:

эсли символ = А, отбрасываем его, отбрасываем 1 байт гаммы
эсли символ != А, гаммируем...
*Treumer
Отправлено: 19.04.2005, 17:25


Не зарегистрирован







QUOTE (R@kot @ 19/04/2005, 14:37)
Treumer, а можно поподробнее насчёт перевода в этот самый BASE64?

http://www.acnet.ge/networking/applic_l/fo...rmat/base64.htm

Вернуться в Вопросы программирования в C++Builder