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


Написал небольшую программу для хранения паролей. Прикрутил самодельный алгоритм кодирования. Программа написана на 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[link1]
/faq/kriptografijaobschievoprosy#h37247-13[link2]
/faq/kriptografijaobschievoprosy[link3]
— GuardCat (19/01/2011 16:52)   
Возвращаемая строка — получившийся шифр.
В чём прикол: интересно, насколько стойким может быть такой алгоритм.
За ссылки спасибо!
— unknown (19/01/2011 17:00)   
А как оценить?
сильное утверждение.
алгоритм увеличивает размер данных, которые кодирует. Раз в четыре-пять. Однако, учитывая, что хранятся в программе текстовые данные, а не видео или музыка

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


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

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

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

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

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

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

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

— Migel (19/01/2011 19:48, исправлен 19/01/2011 19:55)   
Вернуть на выход то, что получилось. А получится что-то вроде: «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)   
Спасибо за подробный разбор полётов.

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

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)   
http://www.schneier.com/crypto.....10.html#cipherdesign[link4]

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

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

  • 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)   

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


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


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


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


Ссылки
[link1] https://www.pgpru.com/faq/kriptografijaobschievoprosy#h37247-12

[link2] https://www.pgpru.com/faq/kriptografijaobschievoprosy#h37247-13

[link3] https://www.pgpru.com/faq/kriptografijaobschievoprosy

[link4] http://www.schneier.com/crypto-gram-9810.html#cipherdesign