Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post 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.

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Добавил разделение закодированной строки на строки заданной ширины (var maxLineWidth = 75;, можно установить в -1 для отключения).

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Infocatcher
0) На вскидку, да, там AES. Проверить точно можно только сравнив результаты с эталоном. Судя по источнику - он, на википедии в принципе есть ещё несколько примеров реализации(в том числе и этот, а также от NIST)
1) Вместо AkelPad.InputBox берете из других скриптов реализацию какого-нибудь модального диалога, и модернизируете её так, что бы Edit-контролу пароля дополнительно дали стиль ES_PASSWORD
2) Для тестирования эффективности шифров мы на третьем курсе брали "NIST Statistical Test Suite" (через гугл исходники скачать можно)
3) Алгоритмы блочных шифров основную массу своего времени ксорят, остальную - выбирают по индексу из массивов(у АЕС их особенно много) Потому лучше делать это нативно - на ассемблере/С ну в крайнем случае JIT-ом. Попробуйте порыть в сторону CryptoAPI
( Вставлю от себя 4: А он Вам нужен этот AES и юридические проблемы с ним? Да и его взломоустойчивость не радует. Я больше доверяю алгоритмам построенных на сети Фейстеля )

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

1) Вместо AkelPad.InputBox берете из других скриптов реализацию какого-нибудь модального диалога, и модернизируете её так, что бы Edit-контролу пароля дополнительно дали стиль ES_PASSWORD
Я надеялся на какую-нибудь системную возможность. Ну да ладно, муторно, но посмотрим.
Потому лучше делать это нативно - на ассемблере/С ну в крайнем случае JIT-ом.
Вот в Firefox 3.5 и выше – JIT, оно, вероятно, и проявилось у автора на тестах. А нам он пока не светит, вроде как.
А если писать самому, то если только на С, да и то выходит не особо с соотношением затраты/необходимость.
( Вставлю от себя 4: А он Вам нужен этот AES и юридические проблемы с ним? Да и его взломоустойчивость не радует. Я больше доверяю алгоритмам построенных на сети Фейстеля )
Ok, но тогда хорошо бы готовую реализацию. :D На AES я не настаиваю.
Мне скорее для удовлетворения личной паранойи. :D А то получается обидно, если пароль хороший, а сам алгоритм шифрования – нет. Лучше пусть слабым местом будет только пароль и тот, кто его знает.
Last edited by Infocatcher on Sun Nov 28, 2010 8:35 pm, edited 1 time in total.

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Ok, но тогда хорошо бы готовую реализацию
Как я уже говорил, "Попробуйте порыть в сторону CryptoAPI" т.е

Code: Select all

AkelPad.SystemFunction().Call("advapi32::CryptAquireContextW",....) // и дальше по учебнику
на МСДН есть законченый пример.

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

на МСДН есть законченый пример.
Или я не то нашел, или там на С.
Мне пока больше понравилось вот это: http://www.freevbcode.com/ShowCode.asp?ID=804, там хотя бы портировать проще. И то не совсем понятно, что там с доступными алгоритмами – нужна же и стойкость, и чтобы на разных машинах было доступно.

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Там на С. И исключительно на С нужно искать использование WINAPI что-бы его можно было портировать сюда.(Ну или COM).
Насчет наличия алгоритмов - есть некий общий набор алгоритмов доступный для всей линейки NT(начиная 2000). Я, честно, использовал только RC4. Думаю для Вашей паранойи его хватит. ;) Поищите, может быть какой-то COM-объект найдете.

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Я, честно, использовал только RC4. Думаю для Вашей паранойи его хватит.
С него-то все и началось: viewtopic.php?p=7802#p7802
Не хватило. :lol:
Думаю для Вашей паранойи его хватит. ;)
Плохо знаете мою паранойю. :D

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

Ну раз RC4 для паранойи мало, то используйте DES(поддерживается начиная с 2000) либо AES(которого в 2000 нету).
Microsoft AES Cryptographic Provider

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post 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 почему-то не вышло. Или не так использовал.

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post 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*/);

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

FeyFre
GetWindowLong я тоже пробовал, но без особого успеха.
3. Читаем RTFM по контролу, в поисках сообщения хоть как-то связанного с нашей темой. Находим единственную пару EM_GET/SETPASSWORDCHAR.
Бубново. :D Я такое находил, но не догнал, зачем менять 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");

Offline
Posts: 1
Joined: Tue Nov 30, 2010 9:42 pm

Post by Sidelong »

подумал вот бы в текстовом редакторе шифровать можно было, зашёл прочитать про format прочитал и наткнулся на эту тему =) так то в формате не устраивает то что алго рц4, пароль за звёздами не видно и что на выходе hextext а не base64, aescrypt вверху страницы как раз то что нужно, aescrypt-test не шифрует.

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

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post 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 соотв. ошибку ставил(библиотека не найдена, символ не найден, пр).

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

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