Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Насколько криптоустойчив XOR ? небольшая функция :-) 
:(
    Опции темы
ReFrehH
Дата 6.1.2008, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Код

    public static String Crypt(String s, String Password) {
        String res = "";
        for (int t = 0; t < s.length(); t++) {
            char tmp = ' ';
            for (int i = 0; i < Password.length(); i++) {
                int code = Password.codePointAt(i);
                tmp = (char) ((byte) (s.charAt(t)) ^ code);
            }
            res += tmp;
        }
        return res;
    }


ЗЫ: Функция вернет шифрованное значение строки s по паролю Password при первом вызове, и разшифрованное при повторном, если передать результат первоначального вызова функции и тот же Password.
PM MAIL   Вверх
nornad
Дата 6.1.2008, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Цитата(ReFrehH @  6.1.2008,  07:05 Найти цитируемый пост)
Очень будет любопытно узнать мнения

Ну, примерно на уровне того, как и устойчивость логина/пароля admin/admin smile
К тому же, как я тебе уже сказал в другой теме, ты теряешь часть данных при криптовании:
Код

tmp = (char) ((byte) (s.charAt(t)) ^ code);



--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Alexandr87
Дата 6.1.2008, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



ReFrehH, 

Да хоть сколько большая - все равно используешь лишь последний символ. (Вскрывается в течении нескольких секунд)

А вообще: 
1. не пойму - почему на выходе строка (там будет набор из всех 255 значений для одного байта), лучше выдавать byte[]. Да и вообще оперировать бинарными операциями для символов как-то, имхо не очень.
2. xor - это не функция шифрования, это просто обратимая операция, которая используется для наложения шифро гаммы на открытый текст. Она используется практически во всех современных блочных симметричных алгоритмах шифрования.
3. даже если и сделать так, чтобы гаммирование проходило нормально (накладывался не последний символ password, а последовательно все) все зависит от переданного значения password. Но, что то я сомневаюсь что все коды символов этого password будут равномерно и случайно распределены, что password будет при каждой передаче данных новый и что его длина будет большой. -> система имеет плохую криптостойкость.

Советывал бы в топку.

Это сообщение отредактировал(а) Alexandr87 - 6.1.2008, 07:18
PM Jabber   Вверх
nornad
Дата 6.1.2008, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Цитата(Alexandr87 @  6.1.2008,  10:14 Найти цитируемый пост)
чтобы гаммирование проходило нормально (накладывался не последний символ password

Кстати, да. В приведённом коде для каждого символа строки выполняется цикл "шифрования" по каждому символу пароля. Но! Из-за 
Код

tmp = (char) ((byte) (s.charAt(t)) ^ code);
 происходит потеря результата всех итераций, кроме последней. В общем, алгоритм можно сильно ускорить (особенно на длинных паролях) за счёт исключения второго цикла. smile


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
maxim1000
Дата 6.1.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



если длина пароля не меньше длины передаваемого сообщения, то это, в некотором смысле, - идеальный шифр, окторый не взламывается (ну разве что перебором, но это - все равно, что перебрать все сообщения такой длины)

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

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

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

Добавлено через 51 секунду
P.S.
код не смотрел, всё, что написал, относится к корректной реализации smile


--------------------
qqq
PM WWW   Вверх
Alexandr87
Дата 6.1.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



Цитата(maxim1000 @  6.1.2008,  16:19 Найти цитируемый пост)
если длина пароля не меньше длины передаваемого сообщения, то это, в некотором смысле, - идеальный шифр, окторый не взламывается (ну разве что перебором, но это - все равно, что перебрать все сообщения такой длины)

ну тут уже нужно рассматривать генератор, с помощью которого была сгенерированна шифр-гамма.

+ повторное использование данной шифр-гаммы становится невозможным.
PM Jabber   Вверх
ReFrehH
Дата 6.1.2008, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(nornad @ 6.1.2008,  05:49)
Цитата(ReFrehH @  6.1.2008,  07:05 Найти цитируемый пост)
Очень будет любопытно узнать мнения

Ну, примерно на уровне того, как и устойчивость логина/пароля admin/admin smile
К тому же, как я тебе уже сказал в другой теме, ты теряешь часть данных при криптовании:
Код

tmp = (char) ((byte) (s.charAt(t)) ^ code);

да, спасибо, вариант с int решил проблему).
PM MAIL   Вверх
ReFrehH
Дата 6.1.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Alexandr87,

Цитата

Да хоть сколько большая - все равно используешь лишь последний символ. (Вскрывается в течении нескольких секунд)

Точно, как я мог не заметить))
Цитата

А вообще: 
1. не пойму - почему на выходе строка (там будет набор из всех 255 значений для одного байта), лучше выдавать byte[]. Да и вообще оперировать бинарными операциями для символов как-то, имхо не очень.

Дело в том что работать приходится со строками.
Цитата

2. xor - это не функция шифрования, это просто обратимая операция, которая используется для наложения шифро гаммы на открытый текст. Она используется практически во всех современных блочных симметричных алгоритмах шифрования.

Да, под функцией я не имел ввиду операцию xor, а именно последовательное наложение всех символов password'a, то что ты упоминаешь в след. пункте...
Цитата

3. даже если и сделать так, чтобы гаммирование проходило нормально (накладывался не последний символ password, а последовательно все) все зависит от переданного значения password. Но, что то я сомневаюсь что все коды символов этого password будут равномерно и случайно распределены, что password будет при каждой передаче данных новый и что его длина будет большой. -> система имеет плохую криптостойкость.

а если предположить:
последовательное наложение с учетом позиции каждого символа в password'е;
случайную генерацию password'a при каждом новом сеансе связи;
длинну password'a меньше длинны сообщения - ?

при использовании, например, таким образом : 
Код

    public static String Crypt(String s, String Password) {
        String res = "";
        for (int t = 0; t < s.length(); t++) {
            char tmp = s.charAt(t);
            for (int i = 0; i < Password.length(); i++) {
                int code = Password.codePointAt(i);
                tmp = (char) ((short) tmp ^ (code*i));
            }
            res += tmp;
        }
        return res;
    }


Это сообщение отредактировал(а) ReFrehH - 6.1.2008, 16:09
PM MAIL   Вверх
Alexandr87
Дата 6.1.2008, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



Цитата(ReFrehH @ 6.1.2008,  18:55)
а если предположить:
последовательное наложение с учетом позиции каждого символа в password'е;
случайную генерацию password'a при каждом новом сеансе связи;
длинну password'a меньше длинны сообщения - ?

при использовании, например, таким образом : 
Код

    public static String Crypt(String s, String Password) {
        String res = "";
        for (int t = 0; t < s.length(); t++) {
            char tmp = s.charAt(t);
            for (int i = 0; i < Password.length(); i++) {
                int code = Password.codePointAt(i);
                tmp = (char) ((short) tmp ^ (code*i));
            }
            res += tmp;
        }
        return res;
    }

эквивалентно простой замене.
вскрывается за несколько секунд с любой длиной password`а

Я не понимаю, что вы хотите изобрести?


Это сообщение отредактировал(а) Alexandr87 - 6.1.2008, 16:36
PM Jabber   Вверх
ReFrehH
Дата 6.1.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Alexandr87 @ 6.1.2008,  16:34)
эквивалентно простой замене.
вскрывается за несколько секунд с любой длиной password`а


Можно чуть подробнее? я чего то явно недопонимаю. :(

Цитата

Я не понимаю, что вы хотите изобрести?


Небольшую функцию, дающей более менее стойкий шифр для "домашнего" использования smile.
PM MAIL   Вверх
nornad
Дата 6.1.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Цитата(maxim1000 @  6.1.2008,  16:19 Найти цитируемый пост)
кроме того, может оказаться, что есть надёжный канал для генерации пароля, но нет для передачи сообщения

Хотелось бы услышать пример такой ситуации.

Цитата(ReFrehH @  6.1.2008,  18:55 Найти цитируемый пост)
а если предположить:последовательное наложение с учетом позиции каждого символа в password'е;

А ради чего каждый символ строки криптуется всеми символами пароля? Ну, стал алгоритм чуть сложнее и явно медленнее, но криптостойкость увеличилась ненамного. Скажем, на одну миллирдную  smile 
От пользователя защитит, а если дать хакеру - раскусит довольно быстро и даже огорчится от этого. smile

Вообще я хочу спросить:
Для чего тебе риптование?
Насколько важные данные?
Что важнее - не дать расшифровать вообще или не дать расшифровать быстро? (первое в принципе неосуществимо для обратимого шифрования, а необратимое вряд ли кому-то нужно smile ).
От кого криптуешь?
Каков усреднённый объём данных?

Добавлено через 7 минут и 21 секунду
Цитата(ReFrehH @  6.1.2008,  19:48 Найти цитируемый пост)
Небольшую функцию, дающей более менее стойкий шифр для "домашнего" использования

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


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Alexandr87
Дата 6.1.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



Цитата(nornad @  6.1.2008,  19:50 Найти цитируемый пост)
А ради чего каждый символ строки криптуется всеми символами пароля? Ну, стал алгоритм чуть сложнее и явно медленнее, но криптостойкость увеличилась ненамного. Скажем, на одну миллирдную

скажем так. Криптостойкость не увеличилась, а уменьшилась. Вернее стойкости не осталось.

Цитата(ReFrehH @  6.1.2008,  19:48 Найти цитируемый пост)
Можно чуть подробнее? я чего то явно недопонимаю. :(

Попробуйте зашифровать в вашей программе строку "abcabc"  с любым ключом. Думаю многое станет ясным. 

Если не стало:
в каждом цикле у вас делается следующее
message[i] ^ key[0] ^ key[1] ^ ... ^ key[n]

Как видите key[0] ^ key[1] ^ ... ^ key[n] есть постоянно.
Каждый символ строки вы ксорите с одним и тем же числом. В результате одинаковым символам открытого текста соответствуют одинаковые "символы" шифртекста. Разным - разные. Далее - частотный анализ на закрытый текст и получаете открытый текст.

ЗЫ. ну и совет - не стоит парить себе моск. Возьмите готовые реализации шифров.

Это сообщение отредактировал(а) Alexandr87 - 6.1.2008, 17:03
PM Jabber   Вверх
ReFrehH
Дата 6.1.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(nornad @ 6.1.2008,  16:50)
А ради чего каждый символ строки криптуется всеми символами пароля? 

в попытке повысить стойкость, но видимо ... 

Цитата

Ну, стал алгоритм чуть сложнее и явно медленнее, но криптостойкость увеличилась ненамного. Скажем, на одну миллирдную  smile 

От пользователя защитит, а если дать хакеру - раскусит довольно быстро и даже огорчится от этого. smile

не очень удачная мысль smile

Цитата

Вообще я хочу спросить:
Для чего тебе риптование?

для передачи данных  по сетке
Цитата

Насколько важные данные?

Не сказал бы что очень, но хотелось бы шифровать достаточно стойко.
Цитата

Что важнее - не дать расшифровать вообще или не дать расшифровать быстро? (первое в принципе неосуществимо для обратимого шифрования, а необратимое вряд ли кому-то нужно smile ).

smile, согласен, но чтоб расшифровка заняла время больше и пока инфа, например, потеряет актуальность...
Цитата

От кого криптуешь?

сложный вопрос smile
Цитата

Каков усреднённый объём данных?

В среднем строка длинной 200-300 символов.
PM MAIL   Вверх
nornad
Дата 6.1.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Если
Цитата(ReFrehH @  6.1.2008,  20:04 Найти цитируемый пост)
От кого криптуешь?сложный вопрос 

то
Цитата(Alexandr87 @  6.1.2008,  20:02 Найти цитируемый пост)
ЗЫ. ну и совет - не стоит парить себе моск. Возьмите готовые реализации шифров.

smile
Зачем изобретать очередной велосипед с квадратными колёсами если их и в нете полно?

Это сообщение отредактировал(а) nornad - 6.1.2008, 17:16


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
ReFrehH
Дата 6.1.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Alexandr87 @ 6.1.2008,  17:02)
Попробуйте зашифровать в вашей программе строку "abcabc"  с любым ключом. Думаю многое станет ясным. 

Если не стало:
в каждом цикле у вас делается следующее
message[i] ^ key[0] ^ key[1] ^ ... ^ key[n]

Как видите key[0] ^ key[1] ^ ... ^ key[n] есть постоянно.
Каждый символ строки вы ксорите с одним и тем же числом. В результате одинаковым символам открытого текста соответствуют одинаковые "символы" шифртекста. Разным - разные. Далее - частотный анализ на закрытый текст и получаете открытый текст.

ЗЫ. ну и совет - не стоит парить себе моск. Возьмите готовые реализации шифров.

Спасибо за объяснение; совет конешно дельный, только я не смог найти java реализацию свободного для использования алгоритма, может что то порекомендуете  ? (тольк не применяя javax.crypto.*, т.к. работать приходица с J2ME)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

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


 




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


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

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