Page 38 of 97
Posted: Sun Nov 28, 2010 12:08 am
by Infocatcher
Тут вдруг вспомнилось, что я
давно хотел шифрование каким-нибудь AES-256.
Вот, на скорую руку, на основе
http://www.movable-type.co.uk/scripts/aes.html:
AESCrypt.js
Чего не хватает: 0) чтобы кто-нибудь проверил, правда ли, что там какой-то AES-256, 1) сокрытия паролей за звездочками, желательно отключаемого, 2) тестирования, 3) быстродействия.
[Upd]
Добавлен пункт 3):
Speed: as mentioned, this is not an optimised implementation – on a 2GHz Intel Core 2 machine, this implementation processes around 6kB/sec using IE7, and 30kB/sec using FF3(!) (one page of text at a standard 250 words is about 1.5kB). The 128-bit version is some 25% faster than the 256-bit version.
Posted: Sun Nov 28, 2010 4:46 pm
by Infocatcher
Добавил разделение закодированной строки на строки заданной ширины (var maxLineWidth = 75;, можно установить в -1 для отключения).
Posted: Sun Nov 28, 2010 5:17 pm
by FeyFre
Infocatcher
0) На вскидку, да, там AES. Проверить точно можно только сравнив результаты с эталоном. Судя по источнику - он, на википедии в принципе есть ещё несколько примеров реализации(в том числе и этот, а также от NIST)
1) Вместо AkelPad.InputBox берете из других скриптов реализацию какого-нибудь модального диалога, и модернизируете её так, что бы Edit-контролу пароля дополнительно дали стиль ES_PASSWORD
2) Для тестирования эффективности шифров мы на третьем курсе брали "NIST Statistical Test Suite" (через гугл исходники скачать можно)
3) Алгоритмы блочных шифров основную массу своего времени ксорят, остальную - выбирают по индексу из массивов(у АЕС их особенно много) Потому лучше делать это нативно - на ассемблере/С ну в крайнем случае JIT-ом. Попробуйте порыть в сторону CryptoAPI
( Вставлю от себя 4: А он Вам нужен этот AES и юридические проблемы с ним? Да и его взломоустойчивость не радует. Я больше доверяю алгоритмам построенных на сети Фейстеля )
Posted: Sun Nov 28, 2010 5:43 pm
by Infocatcher
1) Вместо AkelPad.InputBox берете из других скриптов реализацию какого-нибудь модального диалога, и модернизируете её так, что бы Edit-контролу пароля дополнительно дали стиль ES_PASSWORD
Я надеялся на какую-нибудь системную возможность. Ну да ладно, муторно, но посмотрим.
Потому лучше делать это нативно - на ассемблере/С ну в крайнем случае JIT-ом.
Вот в Firefox 3.5 и выше – JIT, оно, вероятно, и проявилось у автора на тестах. А нам он пока не светит, вроде как.
А если писать самому, то если только на С, да и то выходит не особо с соотношением затраты/необходимость.
( Вставлю от себя 4: А он Вам нужен этот AES и юридические проблемы с ним? Да и его взломоустойчивость не радует. Я больше доверяю алгоритмам построенных на сети Фейстеля )
Ok, но тогда хорошо бы готовую реализацию.

На AES я не настаиваю.
Мне скорее для удовлетворения личной паранойи.

А то получается обидно, если пароль хороший, а сам алгоритм шифрования – нет. Лучше пусть слабым местом будет только пароль и тот, кто его знает.
Posted: Sun Nov 28, 2010 6:10 pm
by FeyFre
Ok, но тогда хорошо бы готовую реализацию
Как я уже говорил, "Попробуйте порыть в сторону CryptoAPI" т.е
Code: Select all
AkelPad.SystemFunction().Call("advapi32::CryptAquireContextW",....) // и дальше по учебнику
на МСДН есть законченый пример.
Posted: Sun Nov 28, 2010 7:55 pm
by Infocatcher
на МСДН есть законченый пример.
Или я не то нашел, или там на С.
Мне пока больше понравилось вот это:
http://www.freevbcode.com/ShowCode.asp?ID=804, там хотя бы портировать проще. И то не совсем понятно, что там с доступными алгоритмами – нужна же и стойкость, и чтобы на разных машинах было доступно.
Posted: Sun Nov 28, 2010 8:34 pm
by FeyFre
Там на С. И исключительно на С нужно искать использование WINAPI что-бы его можно было портировать сюда.(Ну или COM).
Насчет наличия алгоритмов - есть некий общий набор алгоритмов доступный для всей линейки NT(начиная 2000). Я, честно, использовал только RC4. Думаю для Вашей паранойи его хватит.

Поищите, может быть какой-то COM-объект найдете.
Posted: Sun Nov 28, 2010 9:08 pm
by Infocatcher
Я, честно, использовал только RC4. Думаю для Вашей паранойи его хватит.
С него-то все и началось:
viewtopic.php?p=7802#p7802
Не хватило.
Думаю для Вашей паранойи его хватит.

Плохо знаете мою паранойю.

Posted: Mon Nov 29, 2010 10:05 am
by FeyFre
Ну раз RC4 для паранойи мало, то используйте DES(поддерживается начиная с 2000) либо AES(которого в 2000 нету).
Microsoft AES Cryptographic Provider
Posted: Tue Nov 30, 2010 8:27 pm
by Infocatcher
либо AES(которого в 2000 нету)
Так кого там его взломоустойчивость не радует?
1) Вместо AkelPad.InputBox берете из других скриптов реализацию какого-нибудь модального диалога, и модернизируете её так, что бы Edit-контролу пароля дополнительно дали стиль ES_PASSWORD
И правда очень муторно. Что-то я не пойму, как переключить этот ES_PASSWORD, чтобы показать пароль.
AESCrypt-test.js
Code: Select all
case IDC_SHOWPASS:
var showPass = AkelPad.SendMessage(hWndShowPass, 240 /*BM_GETCHECK*/, 0, 0);
oSys.Call("user32::ShowWindow", hWndPass2Label, !showPass);
oSys.Call("user32::ShowWindow", hWndPass2, !showPass);
А дальше что? С user32::SetWindowStyle почему-то не вышло. Или не так использовал.
Posted: Tue Nov 30, 2010 10:23 pm
by FeyFre
Infocatcher, значит ликбез

1. SetWindowStyle - такой функции в библиотеке user32.dll нету. Стиль это просто значение типа LONG_PTR хранящееся в ассоциированной с окном внутренней структуре ОС. Доступ к этому значению(а также ко многим другим) осуществляется с помощью системных вызовов:
Code: Select all
LONG GetWindowLong(HWND hwnd, int index)
LONG SetWindowLong(HWND hwnd, int index, LONG value)
//+ A/W суффикс
или точнее сказать:
Code: Select all
LONG_PTR GetWindowLongPtr(HWND hwnd, int index)
LONG_PTR SetWindowLongPtr(HWND hwnd, int index, LONG_PTR value)
// + A/W суффикс
- 32/64, битная версия(без Ptr - считается устаревшей и существует для поддержки 16-битных приложений. 64-ый Platform SDK компилятор материт старый вариант функции).
Нас интересует index = GWL_STYLE
2. ВАЖНО: Установка этого значения - это только установка этого значения. Никто не гарантирует что все окна будут принимать к сведению стиль(или значения других индексов) немедленно, и будут ли вообще туда смотреть. Т.е. эти значения в большинстве случаев(не во всех) индикаторы.
Потому действует негласное правило: если окну(контролу, диалогу, рамке, любому) нужно поменять стиль, это должен сделать тот, кто гарантирует что окно будет отображаться(и вообще реагировать на окружающую среду) в соответствии с этим стилем, т.е это должна сделать оконная процедура. А какой единственный способ заставить оконную процедуру сделать что-то? Правильно, отправить окну сообщение.
3. Читаем RTFM по контролу, в поисках сообщения хоть как-то связанного с нашей темой. Находим единственную пару EM_GET/SETPASSWORDCHAR. EM_SETPASSWORDCHAR принимает код символа, которые скрывает текст. Если код == 0, текст не скрывается, при этом стиль ES_PASSWORD снимается, иначе символы скрываются указанным символом, и выставляется стиль ES_PASSWORD. Какраз то что искали.
Итого получаем код:
Code: Select all
var showPass = AkelPad.SendMessage(hWndShowPass, 240 /*BM_GETCHECK*/, 0, 0);
AkelPad.SendMessage(hWndPass, 0x00CC/*EM_SETPASSWORDCHAR*/, (showPass)?0:0x002A/* asterisk in both ANSI and UCS2*/, 0);
oSys.Call("user32::InvalidateRect", hWndPass, 0, 1/*TRUE*/);
Posted: Tue Nov 30, 2010 11:32 pm
by Infocatcher
FeyFre
GetWindowLong я тоже пробовал, но без особого успеха.
3. Читаем RTFM по контролу, в поисках сообщения хоть как-то связанного с нашей темой. Находим единственную пару EM_GET/SETPASSWORDCHAR.
Бубново.

Я такое находил, но не догнал, зачем менять password char.
Видимо, лучше сначала прочитать символ по умолчанию, а то у меня там вообще шарики, а не звездочки:
Code: Select all
var passChar = showPass
? 0
: AkelPad.SendMessage(hWndPass2, 0x00D2/*EM_GETPASSWORDCHAR*/, 0, 0) || 0x002A /*asterisk in both ANSI and UCS2*/;
AkelPad.SendMessage(hWndPass, 0x00CC/*EM_SETPASSWORDCHAR*/, passChar, 0);
Спасибо за ликбез.
P.S. Вообще, довольно неожиданное поведение:
Code: Select all
AkelPad.SystemFunction().Call("wtf::wtf");
Posted: Wed Dec 01, 2010 1:40 am
by Sidelong
подумал вот бы в текстовом редакторе шифровать можно было, зашёл прочитать про format прочитал и наткнулся на эту тему =) так то в формате не устраивает то что алго рц4, пароль за звёздами не видно и что на выходе hextext а не base64, aescrypt вверху страницы как раз то что нужно, aescrypt-test не шифрует.
Infocatcher, я вот не пойму что ты со скриптами возишься? не легче плагин написать? готовых реализаций разных алгоритмов полно, запихал несколько функций шифрования в длл, форму с вводом пароля и выбором алгоритма прикрутил и всё, плюс быстродействие да и со звёздами проблем не будет.
Posted: Wed Dec 01, 2010 11:08 am
by FeyFre
Видимо, лучше сначала прочитать символ по умолчанию, а то у меня там вообще шарики, а не звездочки:
RTFM читали? Там черным по белому написано: если реализация EDIT-контрола загружается из библиотеки USER32.DLL то отображаются звездочки, если же реализация из comctl32.dll - отображаются черные кружки.
If the edit control is from user32.dll, the default password character is an asterisk. However, if the edit control is from comctl32.dll version 6, the default character is a black circle.
P.S. Вообще, довольно неожиданное поведение:
лучше так, чам мат без конца от неотлаженного скрипта. В принципе Инструктор поступил аналогично как поступает система в случае получения неизвестного оконного сообщения - возвращает 0(он же NULL, он же FALSE), и отправитель как правило реагирует алгоритмом недоступности функциональности. Такой себе компромисс. Можете попросить Инструктора что-бы в GetLastError соотв. ошибку ставил(библиотека не найдена, символ не найден, пр).
Posted: Wed Dec 01, 2010 2:59 pm
by FeyFre
Sidelong, напишите

Infocatcher делает скрипты для себя и по доброте душевно делится с нами. Также и остальные скрипто- и плагино писатели-. Для написания скрипта дополнительных материальных затрат не нужно(Windows+AkelPad), точно также и для плагинов(Windows+AkelPad+(PlatformSDK+VS2003ToolKit)/(MinGW32))