Программистическое...
May. 12th, 2012 11:11 pmПока Россия еще спит, а америка уже пьяная, самое время написать небольшой пост который все равно будет не интересен никому.
На работе случилась приятная необходимость привинтить немного шифрования. Мне больше всего нравится RSA, потому, что теория чисел, которую я люблю, Джон Нэш по которому снят "Бютифул Майнд", простите за мой английский, ну и прочая математическая романтика.
Пошарившись немного в интернете, нашел конечно большие библиотеки с RSA. Но там настолько ужасный старый С-ишный код, времен первых Керниганов-Ричи, что мне стало тоскливо их привинчивать или выдирать оттуда. Ведь все, что мне надо - это буквально пару классов: BigInt и RSA. Самое страшное это были библиотеки EMC. Один простой пример генерирования ключа состоял из нескольких библиотек и полтора десятка файлов и бесконечно унылым С-кодом. В стиле _ДЫР_БУЛ_ЩИЛ* _пир_да_мон. От этих обрубков унылого коммерческого кодирования буквально сразу начиналась икота и мигрень. OpenSSL тоже что-то ужасное и отталкивающее. Вообще С++ придумали конечно что бы как-то скрасить это убогий ужас старого С.
Наверное я как-то неправильно искал. Но короче я нашел то что было мне нужно - два класса и ничего лишнего. Но это было написано каким-то наверное постдоком университета в Сараево. Все там работало, но было написано не программистом, а математическим гуманитарием. Работало примерно в 1000 раз медленнее, чем должно было.
И мне почему-то страшно захотелось все переписать самому, чем прикручивать ужасный куски чужого кода. Последние несколько дней я развлекался тем что написал BigInt с хранением не в смешных десятичных цифрах, что меня так смешило и умиляло, а машинных словах, которые можно естественно настроить на 32 и 64 разрядные платформы, а нам это придется делать.
Писать длинное сложение, вычитание и умножение - это умилительный экскурс в уроки устного счета при церковной приходской школе с мухами и ковырянием в носу. Это я сделал быстро. Хотя подумал конечно о Карацупе. Но некогда, да и чиселки маленькие все равно.
Зато деление немного доставило. Оригинальный смешной алгоритм с предиктор-корретором я улучшил наверное в 10000 раз на 1024 битных числах. Собственно я сразу все выкинул и поразвлекался написав свой предиктор-корректор. Получилось раз в 100 быстрее. Потом посмотрев на идиотский корректор понял, что если предиктор плохой, то корректор окончательно гробит алгоритм.
Тогда я написал один просто смешной предиктор основанный просто на количестве бит. Самое смешное, что с с ним отпала необходимость в корректоре и он заработал еще в 10 раз быстрее. Это меня повеселило. Тогда я понял, что мусолить биты это конечно достойное занятие для программиста в песочнице с соской и слюнявчиком и я подправил оригинальный предиктор, чтобы обойтись без корректора, по принципу скрипач не нужен, если умеешь танцевать. И бинго - оно заработало еще в 10 раз быстрее.
Самое интересное в этом казалось бы скучном программировании - это когда программист не имеет право на ошибку. Одно неверное движение и все складывается как карточный домик. Очень удобное в этом деле - это утыкать код assert-ами. Чтобы комар носу не подточил. Это все равно что ввести слона по лабиринту с электрической изгородью, пока он не научится безошибочно ходить точно как надо.
Получилось очень "чистенько", я погонял тесты на случайных числах. Оно шарашит теперь примерно 20 тысяч делений 1024 битных чисел в секунду на 32 разрядных словах и даже работает на 64 разрядных словах в пару раз быстрее на домашнем компе. За час пока я гулял у океана оно нафигачило 100 миллионов таких тестов без ошибочки.
Теперь чуть отполировать encoding-decoding и будет штучка. Если не найду ничего лучше готового, наверное попробую использовать, потому, что шифровать нам надо не большой объем данных, а скрыть кое какую технологию от гляделок любопытных и ручек загребущих. Ну и конечно поразвлекаться в шифровании и любимые детские игры в шпионов и разведчиков... :)
На работе случилась приятная необходимость привинтить немного шифрования. Мне больше всего нравится RSA, потому, что теория чисел, которую я люблю, Джон Нэш по которому снят "Бютифул Майнд", простите за мой английский, ну и прочая математическая романтика.
Пошарившись немного в интернете, нашел конечно большие библиотеки с RSA. Но там настолько ужасный старый С-ишный код, времен первых Керниганов-Ричи, что мне стало тоскливо их привинчивать или выдирать оттуда. Ведь все, что мне надо - это буквально пару классов: BigInt и RSA. Самое страшное это были библиотеки EMC. Один простой пример генерирования ключа состоял из нескольких библиотек и полтора десятка файлов и бесконечно унылым С-кодом. В стиле _ДЫР_БУЛ_ЩИЛ* _пир_да_мон. От этих обрубков унылого коммерческого кодирования буквально сразу начиналась икота и мигрень. OpenSSL тоже что-то ужасное и отталкивающее. Вообще С++ придумали конечно что бы как-то скрасить это убогий ужас старого С.
Наверное я как-то неправильно искал. Но короче я нашел то что было мне нужно - два класса и ничего лишнего. Но это было написано каким-то наверное постдоком университета в Сараево. Все там работало, но было написано не программистом, а математическим гуманитарием. Работало примерно в 1000 раз медленнее, чем должно было.
И мне почему-то страшно захотелось все переписать самому, чем прикручивать ужасный куски чужого кода. Последние несколько дней я развлекался тем что написал BigInt с хранением не в смешных десятичных цифрах, что меня так смешило и умиляло, а машинных словах, которые можно естественно настроить на 32 и 64 разрядные платформы, а нам это придется делать.
Писать длинное сложение, вычитание и умножение - это умилительный экскурс в уроки устного счета при церковной приходской школе с мухами и ковырянием в носу. Это я сделал быстро. Хотя подумал конечно о Карацупе. Но некогда, да и чиселки маленькие все равно.
Зато деление немного доставило. Оригинальный смешной алгоритм с предиктор-корретором я улучшил наверное в 10000 раз на 1024 битных числах. Собственно я сразу все выкинул и поразвлекался написав свой предиктор-корректор. Получилось раз в 100 быстрее. Потом посмотрев на идиотский корректор понял, что если предиктор плохой, то корректор окончательно гробит алгоритм.
Тогда я написал один просто смешной предиктор основанный просто на количестве бит. Самое смешное, что с с ним отпала необходимость в корректоре и он заработал еще в 10 раз быстрее. Это меня повеселило. Тогда я понял, что мусолить биты это конечно достойное занятие для программиста в песочнице с соской и слюнявчиком и я подправил оригинальный предиктор, чтобы обойтись без корректора, по принципу скрипач не нужен, если умеешь танцевать. И бинго - оно заработало еще в 10 раз быстрее.
Самое интересное в этом казалось бы скучном программировании - это когда программист не имеет право на ошибку. Одно неверное движение и все складывается как карточный домик. Очень удобное в этом деле - это утыкать код assert-ами. Чтобы комар носу не подточил. Это все равно что ввести слона по лабиринту с электрической изгородью, пока он не научится безошибочно ходить точно как надо.
Получилось очень "чистенько", я погонял тесты на случайных числах. Оно шарашит теперь примерно 20 тысяч делений 1024 битных чисел в секунду на 32 разрядных словах и даже работает на 64 разрядных словах в пару раз быстрее на домашнем компе. За час пока я гулял у океана оно нафигачило 100 миллионов таких тестов без ошибочки.
Теперь чуть отполировать encoding-decoding и будет штучка. Если не найду ничего лучше готового, наверное попробую использовать, потому, что шифровать нам надо не большой объем данных, а скрыть кое какую технологию от гляделок любопытных и ручек загребущих. Ну и конечно поразвлекаться в шифровании и любимые детские игры в шпионов и разведчиков... :)
no subject
Date: 2012-05-13 06:33 am (UTC)Тем белее, что люди очень редко так легко и радостно пишут о своей работе - всё больше ядом плюются)))
no subject
Date: 2012-05-13 11:45 am (UTC)