id: Гость   вход   регистрация
текущее время 13:23 19/04/2024
Автор темы: GuardCat, тема открыта 19/01/2011 15:56 Печать
Категории: криптография, криптоанализ, алгоритмы, симметричное шифрование, управление ключами, атаки
https://www.pgpru.com/Форум/Криптография/ОценитеКустарныйАлгоритмШифрованияТекста
создать
просмотр
ссылки

Оцените кустарный алгоритм шифрования текста


Написал небольшую программу для хранения паролей. Прикрутил самодельный алгоритм кодирования. Программа написана на HTA(VBS)т.е. исполняемый файл по сути является листингом программы. Взять можно здесь: http://code.google.com/p/guard-cat-password-manager/


В программу вшита справка с описанием алгоритма. Может и сама программа кому-то покажется интересной для повседневного использования =).


Об алгоритме:
GC3+.Простой алгоритм кодирования текста. Оценка сложности и надёжности алгоритма не проводилась, однако автор программы сам не сможет расшифровать данные, не имея правильного пароля. Предупреждение: алгоритм увеличивает размер данных, которые кодирует. Раз в четыре-пять. Однако, учитывая, что хранятся в программе текстовые данные, а не видео или музыка, то это будет плюс-минус пять килобайт что не слишком повлияет на портабельность программы. Логика кодирования:


1. Взять первый символ шифруемого текста и первый символ пароля.


2. К ASCII-коду текущего символа текста прибавить код текущего символа пароля.


3. Прибавить к получившемуся среднее арифметическое (не совсем оно, но близко, если интересно — см. листинг программы) кодов всех символов пароля.


4. Полученное число добавить к возвращаемой строке и приписать разделитель.


5. Если код текущего символа пароля чётный, то добавить код, похожий на результат кодирования реального символа (ложный код) и приписать разделитель. Повторить столько раз, чему равна вторая цифра ASCII-кода текущего символа пароля. Считаю, что этот пункт делает сложным выведение формулы.


6. Взять следующий символ текста и следующий символ пароля.


7. Если достигнут конец пароля, перейти к его началу и взять первый символ.


8. Повторять, начиная с пункта 2, вплоть до конца кодируемого текста.


9. Вернуть на выход то, что получилось. А получится что-то вроде: «330/414/288/278/353/366/281/265/265/292/148/346/143/354/353/249/291»


 
Комментарии
— Гость (19/01/2011 16:38)   <#>
Полученное число добавить к возвращаемой строке и приписать разделитель.
What is "возвращаемая строка"? Дальше пока не смотрел, качать ничего не буду.
— Гость (19/01/2011 16:46)   <#>
В чём прикол писать кустарный алгоритм, когда есть масса стандартных криптобиблиотек на любой вкус и цвет?

FAQ приносит плоды :)
/faq/kriptografijaobschievoprosy#h37247-12
/faq/kriptografijaobschievoprosy#h37247-13
/faq/kriptografijaobschievoprosy
— GuardCat (19/01/2011 16:52)   профиль/связь   <#>
комментариев: 4   документов: 1   редакций: 0
Возвращаемая строка — получившийся шифр.
В чём прикол: интересно, насколько стойким может быть такой алгоритм.
За ссылки спасибо!
— unknown (19/01/2011 17:00)   профиль/связь   <#>
комментариев: 9796   документов: 488   редакций: 5664
А как оценить?
сильное утверждение.
алгоритм увеличивает размер данных, которые кодирует. Раз в четыре-пять. Однако, учитывая, что хранятся в программе текстовые данные, а не видео или музыка

То можно было бы использовать и AES на скриптовом языке — скорости то не важны.
Алгоритм не рэндомизирован — одинаковые сообщение будут давать одинаковые шифртексты, а случайные дописывания из пункта "5" будут торчать, как ослиные уши. Среднее арифметическое пароля предсказуемо, ну усложнили его как-то.


Вот п.4 неясен. Если он не вносит чего-то принципиального, то получается, что шифрование зависит только от пароля, а не от шифруемого текста. То есть из пароля получается гамма неизвестной длины, которая складывается с текстом. С таким же успехом можно было бы использовать многократный XOR одного и того же ключа вместо шифрования.
— GuardCat (19/01/2011 17:22)   профиль/связь   <#>
комментариев: 4   документов: 1   редакций: 0
Алгоритм не рэндомизирован

Пункт 5 рэндомизирован. Остальное нет. Однако, при смене даже одного символа пароля, один и тот же текст даст разные варианты, потому "ослиные уши" окажутся несколько припудрены =).

можно было бы использовать и AES на скриптовом языке
Похоже, это действительно наилучший вариант. Спасибо за разбор и советы.
— unknown (19/01/2011 17:29, исправлен 19/01/2011 17:33)   профиль/связь   <#>
комментариев: 9796   документов: 488   редакций: 5664

Речь шла про смену текста при одном и том же пароле.

можно было бы использовать и AES на скриптовом языке

Похоже, это действительно наилучший вариант.

Про режимы шифрования посмотрите, пароль ещё нужно хэшировать.

— Migel (19/01/2011 19:48, исправлен 19/01/2011 19:55)   профиль/связь   <#>
комментариев: 90   документов: 0   редакций: 0
Вернуть на выход то, что получилось. А получится что-то вроде: «330/414/288/278/353/366/281/265/265/292/148/346/143/354/353/249/291»

О mod слышал? похоже что нет.


далее – это просто шифр виженера с добавлением сл. данных.
Такой шифр – не стойкий.


Например,


допустим пароль 12334


текст
11111-11111
плочим
23[423534600]445[12344500]-2[32534500]344[342432400]5


текст
22222-22222
плочим
34[423534600]556[32300]-3[35544300]455[33200]6


текст
33333-33333
плочим
45[423534600]667[56600]-4[34554500]566[76700]7


Первые символы 2->3->4... Уличная магия.


— GuardCat (21/01/2011 16:25)   профиль/связь   <#>
комментариев: 4   документов: 1   редакций: 0
Спасибо за подробный разбор полётов.

А если модифицировать вот так:

1. Рассчитать xor сумму ascii-кодов всех символов пароля (XorSum).
2. Сделать текущим первый символ пароля и первый символ текста.
3. К ASCII-коду текущего символа текста прибавить по Xor код текущего символа пароля.
4. Прибавить к получившемуся (по Xor) XorSum.
5. Полученное число добавить к результату кодирования и приписать разделитель.
6. Добавить к результату кодирования код, похожий на результат кодирования реального символа (лишний символ), полученный рандомно и приписать разделитель. Повторить столько раз, чему равна вторая цифра ASCII-кода текущего символа пароля.
7. Взять следующий символ текста и следующий символ пароля.
8. Если достигнут конец пароля, перейти к его началу и взять первый символ.
9. Повторять, начиная с пункта 3, вплоть до конца кодируемого текста.
10. Вернуть результат кодирования.

Этакий усложнённый вариант Xor-шифрования с добавлением мусорных символов.
— unknown (21/01/2011 17:08)   профиль/связь   <#>
комментариев: 9796   документов: 488   редакций: 5664
http://www.schneier.com/crypto.....10.html#cipherdesign

Сейчас, по мере ещё большей формализации в создании алгоритмов, эта заметка Шнайера должна быть наполнена ещё более жёсткими аргументами.
— Migel (21/01/2011 21:01)   профиль/связь   <#>
комментариев: 90   документов: 0   редакций: 0
Большая просьба всем:
если выкладываете алгоритм – приведите развернутый пример шифрования короткого текста, скажем "00000000".

Так как по туманному описанию сложно что-то говорить, и 90% времени уходит не на собственно анализ, а на перевод творения в читабельный вид.


Собственно по алгоритму ( без формул, максимально доступным языком):
Допустим есть текст, "00000000".
Пароль "1234"

1. Рассчитать xor сумму ascii-кодов всех символов пароля (XorSum).

допустим она равна 5 (лень считать).

2. Сделать текущим первый символ пароля и первый символ текста.

сделали.


3. К ASCII-коду текущего символа текста прибавить по Xor код текущего символа пароля.

сделали, допустим получили "0" XOR "1" = "1".



4. Прибавить к получившемуся (по Xor) XorSum.

Прибавили, получили 1+5=6.

Но

если допустим взять пасс "6789" и не использовать XorSum получим тот же шифр текст.

Другими словами,

1+1+1+1+1+10=15
5+10=15
15=15. :)

Никто не будет находить (хотя его и можно найти) пасс 1234, будет найден 6789 и расшифровано сообщение.



5. Полученное число добавить к результату кодирования и приписать разделитель.
Что за разделитель? ","?
Возвращайся к моему преведущему посту и прочитай еще раз.


6. Добавить к результату кодирования код, похожий на результат кодирования реального символа (лишний символ), полученный рандомно и приписать разделитель. Повторить столько раз, чему равна вторая цифра ASCII-кода текущего символа пароля.

Тоесть если вторая цифра пароля 2 то к каждому символу добавлять 2?

Если шифртекст после ХОR скажем 5555 то на выходе получим?-
5[45]5[26]5[13]5[66]

И опять же что это нам даст? Кроме несколькократного увеличения текста на выходе?
Для первого символа получим ту же цепочку 5-6-7-8-9...
Далее перебирая возможные значения второго символа пароля, а он не сможет быть более некоторой псих-границы, отбрасываем мусор, и снова выходим на шифр виженера.

Кстати, а если второй символ пароля будет 9?))) в 9 ть раз увеличим шифр текст?
на входе 8
на выходе 134,32,342,35,5,67,6778,54,3524,12432,34,54?

Макс Клаузен наверное бы сошел сума. задолго до того как его взяли япошки.


Я уже молчу о РТА...и д.р.
— GuardCat (24/01/2011 10:34, исправлен 24/01/2011 10:56)   профиль/связь   <#>
комментариев: 4   документов: 1   редакций: 0

Привожу пример шифротекста при том, что текст последовательно равен:

  • 222222
  • 111111
  • 000000

Ключ во всех случаях равен 1234.


7/6/6/5/5/5/3/4/3/1/4/5/0/2/0/1/7/0/0/5/3/0/5/3/6/1/4
4/2/0/3/0/3/2/2/0/2/7/6/5/1/0/0/4/3/0/2/3/3/2/0/1/1/7
5/1/4/4/1/3/3/3/3/4/6/7/5/0/0/0/5/3/1/2/3/2/2/0/0/0/6


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


Например, семисимвольный пароль Cba-123 и последовательно меняющийся текст:

  • 222222222222
  • 111111111111
  • 000000000000

Дают три таких варианта:
"44/9/15/26/12/33/28/5/13/9/9/2/1/10/5/6/5/14/11/7/11/13/0/12/10/66/7/55/0/23/55/94/22/18/78/55/73/45/40/57/42/93/92/46/44/27/27/41/29/18/25/10/13/8/1/9/3/1/0/0/1/14/8/12/9/13/12/12/12/66/1/4/41/2/59/94/70/77/90/84/64/49/54/12/4"
"47/17/36/6/32/34/21/1/14/8/11/6/7/8/5/10/13/13/7/0/10/0/2/9/3/65/45/32/11/59/37/93/35/20/83/48/8/64/83/43/62/94/95/4/47/43/22/33/45/6/3/21/14/5/0/11/13/10/11/3/8/13/3/0/9/0/9/6/11/65/63/38/23/27/34/93/86/50/44/74/8/38/8/52/26"
"46/0/35/22/32/32/32/39/15/5/8/7/5/9/12/1/2/12/8/3/11/9/0/1/0/64/59/5/38/1/5/92/35/63/11/83/64/54/10/13/59/95/94/4/46/2/30/19/4/7/36/34/15/14/0/14/4/5/13/6/0/12/10/4/5/1/7/3/5/64/57/18/57/55/61/92/30/21/68/2/35/61/82/37/89"


Как вы полагаете, очевидно ли какие символы реальные, а какие мусорные? Если интересно, привожу реальные символы для текста равного двенадцати нулям (последняя строка) и пароля Cba-123. 46/15/12/64/92/95/94/46/15/12/64/92


Кстати, а если второй символ пароля будет 9?))) в 9 ть раз увеличим шифр текст?

Второй символ кода текущего символа пароля (например, символ
пробел. Его код 32. 2 ложных символа.) Ага. В 9 раз и увеличим, нуачо?

Я уже молчу о РТА...и д.р.

Не молчите. Дайте нубу ссылку на статьи, буду очень благодарен. Также и о mod, упоминавшемся в предыдущем вашем посте.

— Гость (24/01/2011 12:20)   <#>
46/15/12/64/92/95/94/ и опять 46/15/12/64/92
и так для каждого текста.

При том расстояние между первм 46 и вторм 46, и между 15 и 15 будет равнм.

Если длина сообщения будет равня нескольким периодам –
виделить текст исходя из повторений – не составит никакого труда.
— Migel (24/01/2011 19:58, исправлен 24/01/2011 23:03)   профиль/связь   <#>
комментариев: 90   документов: 0   редакций: 0

Для первого примера, не случайные данные:
7 4 5
4 7 6
7 4 5
4 7 6


При том что я даже не смотрел что там за пароль.


о mod: "mod число" в гугле.


О PТА – рановато тебе.

Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3