Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шифр Вернама 
:(
    Опции темы
KPEHDEL
Дата 19.11.2012, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Здравствуйте. делаю шифр вернама.
Есть два метода:

Генерирует ключ:
Код

static void Rand_key()
        {
            Random rand = new Random();
            for( int i = 0; i < str.Length; i++ ) {
                key[i] = (char)(rand.Next() % 255);
            }
        }


Зашифровывает:
Код

static string Vernam_cipher(char[] str, char[] key)
        {
            string str_code = "";

            for (short i = 0; i < str.Length; i++)
            {
                str_code += (char)(str[i] ^ key[i]);
            }

            return str_code;
        }


Если шифрую сообщение, получаю шифр. По идее, если вбить теперь шифр в качестве сообщения, должна появитcя расшифровка. Но происходит новая шифровка.
Скорей всего неправильно генерирую ключ, подскажите, как правильно?
PM MAIL WWW ICQ   Вверх
SKrivosein
Дата 19.11.2012, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



Немного переделал твою програмку
Код

namespace ConsoleAppVerman
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "In cryptography, the one-time pad (OTP) is a type of encryption which has been proven to be impossible to crack if used correctly.";
            char[] key = RandKey(str);

            string strCode = VernamCipher(str.ToCharArray(), key);
            string strEncode = VernamCipher(strCode.ToCharArray(), key);

            Console.Write(strEncode);
            Console.ReadLine();
        }

        static char[] RandKey(string str)
        {
            char[] key = new char[str.Length];

            Random rand = new Random();
            for (int i = 0; i < str.Length; i++)
            {
                key[i] = (char)(rand.Next() % 255);
            }

            return key;
        }
        static string VernamCipher(char[] str, char[] key)
        {
            StringBuilder builder = new StringBuilder();

            for (short i = 0; i < str.Length; i++)
            {
               builder.Append((char)(str[i] ^ key[i]));
            }

            return builder.ToString();
        }
    }
}

и все работает нормально. Вопрос, где храниш ключ между шифровкой и разшифровкой? Если ты не теряеш ключ, а потом не генерируеш новый?

А также не используй это -> str_code += , при длине 1000 знаков ты перекопируеш в памяти string 1000 раз.


Это сообщение отредактировал(а) SKrivosein - 19.11.2012, 14:15


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
KPEHDEL
Дата 19.11.2012, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Цитата

static void Main(string[] args)
        {
            string str = "In cryptography, the one-time pad (OTP) is a type of encryption which has been proven to be impossible to crack if used correctly.";
            char[] key = RandKey(str);
            string strCode = VernamCipher(str.ToCharArray(), key);
            string strEncode = VernamCipher(strCode.ToCharArray(), key);
            Console.Write(strEncode);
            Console.ReadLine();
        }

Дык, нет ведь)

Ключ должен уничтожаться после шифрования, а при расшифровки должен генерироваться новый ключ.
В виженере ведь соль не в ключе, а в алгоритме генерации ключа.

Надо вот так:
Код

char[] key = RandKey(str);
string strCode = VernamCipher(str.ToCharArray(), key);
char[] key = RandKey(str);
string strEncode = VernamCipher(strCode.ToCharArray(), key);

И при этом, чтобы расшифровало)
PM MAIL WWW ICQ   Вверх
SKrivosein
Дата 19.11.2012, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



Извини, где ты такое взял!
Цитата

На практике можно один раз физически передать носитель информации с длинным истинно случайным ключом, а потом по мере необходимости пересылать сообщения. На этом основана идея шифроблокнотов: шифровальщик при личной встрече снабжается блокнотом, каждая страница которого содержит ключ. Такой же блокнот есть и у принимающей стороны. Использованные страницы уничтожаются.

Кроме того, если есть два независимых канала, в каждом из которых вероятность перехвата низка, но отлична от нуля, шифр Вернама также полезен: по одному каналу можно передать зашифрованное сообщение, по другому — ключ. Для того чтобы расшифровать сообщение, перехватчик должен прослушивать оба канала.

Шифр Вернама может применяться, если есть односторонний защищённый канал: ключ передаётся в одну сторону под защитой канала, сообщения в другую сторону защищаются ключом.


Твой код и будет работать
Код

char[] key = RandKey(str);
string strCode = VernamCipher(str.ToCharArray(), key);
char[] key = RandKey(str);
string strEncode = VernamCipher(strCode.ToCharArray(), key);

потому что Windows генерирует один и тотже Random для str, но зачем тебе разшифровка если ты уже знаеш str?
И абсолютно нулевая защита против того кто знает твой алгоритм.

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

Это сообщение отредактировал(а) SKrivosein - 19.11.2012, 15:52


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
KPEHDEL
Дата 19.11.2012, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Товарищ. Я с вами не согласен. 

Цитата

Извини, где ты такое взял!

В википедии как минимум)

Код

На практике можно один раз физически передать носитель информации с длинным истинно случайным ключом
или
Вся фишка Вермана что обе стороны должны иметь одинаковый одноразовый ключ, и в этом его слабость на практике.


Если бы было так, это было обычное XOR шифрование.

Цитирую из википедии:
Цитата

При этом ключ должен обладать тремя критически важными свойствами:
быть истинно случайным;
совпадать по размеру с заданным открытым текстом;
применяться только один раз.(ключевой момент)


Цитата

И абсолютно нулевая защита против того кто знает твой алгоритм.


ну как бы да, потому-что алгоритм знает только тот, кто дешифрует.

Цитата

 но зачем тебе разшифровка если ты уже знаеш str?

Утверждая это, ты отталкиваешься от своего примера. Это не верно.

Для простоты, представь. У тебя два отдельных метода, шифратор и дешифратор(на самом деле метод один и тот же, т. к. метод Вернама принадлежит типу зеркального шифрования).
Суть в том, что ты вводишь сообщение.
Генерируется случайный ключ по какому-то алгоритму, известному только тому кто шифрует и тому кто дешифрует.
Далее происходит шифрование операцией XOR символ строки и ключа.

При дешифровании нам само собой не известен ключ и исходное сообщение. Есть только шифр. Генерируется случайный ключ, тем же алгоритмом, что и при шифровании.
Затем, происходит всё то же, что и при шифровании и должны получить исходное сообщение.

Я вижу это так. Если же передавать ключ, чем это будет отличатсья от обычного XOR шифрования?
Вопрос мой остаётся прежнем, мне не понятно как правильно генерировать ключ, на основе какого-то алгоритма, чтобы потом взаимообратно шифровать/дешифровать.

Это сообщение отредактировал(а) KPEHDEL - 19.11.2012, 22:08
PM MAIL WWW ICQ   Вверх
SKrivosein
Дата 19.11.2012, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



Товарищ
Цитата

На практике можно один раз физически передать носитель информации с длинным истинно случайным ключом

Oбрати внимание на: физически передать носитель информации
Цитата

потому-что алгоритм знает только тот, кто дешифрует

В современной криптографии все алгоритмы известны и в основном открыты. Сила крипто-системы определяется степенью надежности при известном алгоритме и неизвестном ключе.
Проверь в интернете: AES, DES, ГОСТ 28147-89.
А ты пытаешся написать систему где дешифровщику неизвестен ключ, а сила (тайна) шифрования зависит от какого то алгоритма, то есть другой стороне достаточно узнать твой алгоритм создания ключа и вся система идет к ч.... Так же никаких алгоритмов не хватит.

Цитата

Генерируется случайный ключ, тем же алгоритмом, что и при шифровании.

Как может быть истинно случайным по определению ключ который можно повторить алгоритмом? 
Кстати Random к сожалению не является истинно случайным ключом. Microsoft MSDN: Represents a pseudo-random number generator, a device that produces a sequence of numbers that meet certain statistical requirements for randomness. 
Создать истинный генератор случайных чисел на машине очень сложно, для этого используют какой то природный инициализатор генератора, например случайные паразитные электрические помехи в компютере.

Цитата

При дешифровании нам само собой не известен ключ

Зачем тогда эта вещь называется ключ? Еще раз прочти внимательно:
Цитата

На этом основана идея шифроблокнотов: шифровальщик при личной встрече снабжается блокнотом, каждая страница которого содержит ключ. Такой же блокнот есть и у принимающей стороны. Использованные страницы уничтожаются.

это с Википидии. Заметь в целой статье на Вики нечего не говорится о каком то специальном алгоритме ключа.
Ключ используется один раз для зашифровки, один раз для расшифровки и уничтожается. В следующий раз используется другой уникальный ключ.

Не знаю как ещё тебя убедить.
Прочити пожалуйста, товарищ, ещё один источник: Шифр Вернама

Это сообщение отредактировал(а) SKrivosein - 20.11.2012, 23:54


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
KPEHDEL
Дата 27.11.2012, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 31.3.2010

Репутация: нет
Всего: нет



Спасибо за разъяснение.
У меня последнее уточнение связанное с различием обычного шифра XOR и Вернама.
Если ключ размером с сообщение и каждый символ ключа одинаково случайный, то это шифр Вернама.
Если ключ цикличный, ввели ключ ab, сообщение abcd, ключ будет abab. То это обычный шифр XOR.
Я правильно понял?
PM MAIL WWW ICQ   Вверх
SKrivosein
Дата 28.11.2012, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



Мы достаточно далеко ушли от программирования .NET  и модератор нас сейчас перекинет в раздел криптография  smile 

Если я правильно понял 
Цитата

Если ключ цикличный, ввели ключ ab, сообщение abcd, ключ будет abab. То это обычный шифр XOR.
то да. При ключе "ab" на сообщение "absd" ключ будет применен два раза "abab". Поэтому будут возникать циклические закономерности которые при достаточной длине шифрованнего текста можно анализировать и ключ проломить. Причём чем длинней ключ, тем закономерности будут реже и анализ сложнее... но все же. 
В современных алгоритмах таких как DESГОСТ_28147-89 вместе с XOR применяется блочное преобразование по типу сети Фейцтеля перемешивающее и распределяющее эти циклические закономерности до такой степени, что крипто-анализ становится бесперспективным.

В шифре Вернама условия ключ всегда равен побитовой длине текста и ключ всегда используется только один раз фактически создают бесконечно длинный случайный ключ и бесконечно длинный без циклических закономерностей зашифрованный текст. 
Это единственный способ у которого математически доказана абсолютная крипто стойкость, но из за правил создания и передачи ключа очень ограниченное применение.

P.S. Для серьёзного занятия современной криптографией и создания практически применимых систем шифрования  кроме программирования к сожалению необходима ещё одна маленькая вещь: "кандидат физико-математических наук" минимально  smile 

Это сообщение отредактировал(а) SKrivosein - 28.11.2012, 19:48


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0775 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.