Pull to refresh

Comments 61

Удобная идея. Я бы попользовал.

Для удобства еще бы добавил в контектное меню textarea пункт «вставить локальную картинку». Запускать проводник и насиловать drag&drop не всегда удобно.
Интересненько. До такого я не додумался.
Учтено.
пункт «вставить локальную картинку»

Только чтоб в вылезшем окошке можно было выделит не один файл на добавление, а несколько.
Если все так, как на видео, то все отлично. Свою функцию оно отлично делает. В «планах» все замечания есть. В ЖЖ конечно удобней всего писать через Semagic, и ему точно не хватает такого плагина.
Раньше пользовался Semagic, но постить фотографии замучился :-)

Перешел на Plain text режим + плагин Livejournal addons (https://addons.mozilla.org/ru/firefox/addon/4536)

По функциям не хуже семаджика.

PS: Семаджик умеет загружать фотки, но немного по другому. (Журнал -> Изображения)
Загружает он их великолепно и очень удобно, таким же drag&drop, только нужно нам(а в данном случае Я.Фоток), там нет.
Согласен. Но мне хотелось такой функционал на только в рамках ЖЖ :-)

Разработку веду по 1 часу в день, поэтому сложно большими скачками все разрабатывать.

После основного этапа программирования выложу XPI, а потом приступлю к реинжинирингу кода.
encrypt — это да. Вчера тоже повозился с ним. Теперь вот думаю, как перенести сайтик на GAE. Вариант с удаленным шифрованием мне не нравится.

Если портируете утилиту на какой-нибудь скриптовый язык — пните, пожалуйста. :)
на php не удалось портировать. очень сложно сопоставлять типы данных.
Красивее делать не буду. И так весь вечер убил, чтобы понять че там к чему в этих сях.

#-*- coding:utf-8 -*-

import sys, copy

if __name__ == '__main__':
  if len(sys.argv) != 3 : print "usage: python %s <public-key> <text>" % sys.argv[0]; sys.exit()
  NSTR,ESTR = sys.argv[1].split("#")
  DATA_ARR = [ord(x) for x in sys.argv[2]]
  N,E,STEP_SIZE = int(NSTR,16),int(ESTR,16), len(NSTR)/2-1
  
  prev_crypted = [0]*STEP_SIZE
  
  hex_out = ""
  for i in range(0,(len(DATA_ARR)-1)/STEP_SIZE+1):
    tmp = DATA_ARR[i*STEP_SIZE:(i+1)*STEP_SIZE]
    tmp = [tmp[i] ^ prev_crypted[i] for i in range(0,len(tmp))]
    tmp.reverse()
    plain = 0
    for x in range(0,len(tmp)): plain+= tmp[x]*pow(256, x, N)
    hex_result = "%x" % pow(plain,E,N)
    if len(hex_result) % 2 == 1: hex_result = "0" + hex_result
    for x in range(0,min(len(hex_result),len(prev_crypted)*2),2):
      prev_crypted[x/2] = int(hex_result[x:x+2],16)
    hex_out += ("0" if len(tmp) < 16 else "") + ("%x" % (len(tmp)*256)) + "4000" + hex_result
  
  print hex_out.decode("hex").encode("base64").replace("\n","")


> чтобы понять че там к чему в этих сях

всмысле что там яндекс понаписал, а не вообще язык :)

Кстати мой код будет работать (наверное) только с текущей длиной ключа. Если изменится, то нужно будет мелочь пофиксить.
Спасибо большое! Сегодня завтра попробую на практике. :)
Спасибо, авось получится под JS переписать =)
Получится. Взять внешние библиотеки BigInt, Base64 и переписать
Хм. Вы про обычный javascript? Браузерный? :)
Именно на него хочу.

Сейчас завис на создании Ord функции по JS :-)
Для русским символов из полученного кода вычитать 848 нужно.
Тогда результат Python/PHP oct функции Будет равен результату JS функции charCodeAt.
Насколько я понимаю в данной задаче появление русских символов исключено )
Ошибаетесь. Пароль с русскими символами может быть.
Мне почему-то не удалось сменить пароль на русский. Как и зарегистрировать аккаунт с русскими буквами в пароле.
Ладно. Не важно это. Делайте как нравится — так даже правильнее будет. Надежнее
Примите мои извинения. Действительно запрещено русские символы в пароле использовать :-)
А чем Вам не нравится браузерный JS? Язык как язык.
Вполе нравится, просто уточнял. Если удастся портировать — это ведь будет замечательно. Не придется даже отправлять логин с паролем на сервер.
В рамках данного блога портирование именно на JS планируется, дабы не завязываться на конкретную платформу.
Ура, все работает! :-)
Спасибо!
Вам удалось портировать на другой язык?
Нет, я пока добрался только до GAE, о портировании еще не задумывался. Да и если буду портировать, разве что только на Tcl, других языков не знаю совсем. :(
Что эта строчка делает? ЧТО-то не очень понимаю =)?
tmp = [tmp[i] ^ prev_crypted[i] for i in range(0,len(tmp))]
Побитный XOR с результатами, полученными на предыдущем шаге. Для первого шага с нулем
Вау =))) А я понять не мог, как возведение в степень ноль дает тоже самое число :-)))
тяжко Пайтон скрипт переделывать на JS :-) Производительность при замене pow(256, x, N) на (pow(256, x)%N) падает раз в 10-20 :-)
НЕ НАДО делать такую замену — это ниразу не равнозначные алгоритмы! 10-20 раз это вам повезло.

www.leemon.com/crypto/BigInt.js

В этой и других библиотеках для реализации bigint есть специальная встроенная функция.
Вкрадце разница:

pow(256,x,N) все промежуточные вычисления приводит к остатку по модулю N. Соответственно всегда манипулирует числами меньше N

pow(256, x) тупо вычисляет степень. При этом ему придется манипулировать целыми числами длинной в несколько тысяч/миллионов знаков.
Почти дописал… Дошел до этапа
 print hex_out.decode("hex").encode("base64").replace("\n","")


Строка hex_out из JS и Py скрипта совпадает.

Но, скрипт для декодирования из HEX и последующим кодированием в BAse64 не могу нормальный найти.

Тут взял функцию для декодирования hex: farhadi.ir/works/hex
Тут для Base64: farhadi.ir/works/base64

Результат JS и Py различный получается :/
Сорри.
Нижний регистр решил проблему :)

base64Encode(hexDecode(hex_out.toLowerCase()))

Портировал Ваш скрипт на JS :-)

Завтра почищу его и выложу.
Теперь портирование на PHP не кажется таким страшным? )
Признаюсь, не вижу практического смысла от портировании на PHP.

Во вторых, Вы сами сказали:
>Кстати мой код будет работать (наверное) только с текущей длиной ключа. Если изменится, то нужно будет мелочь пофиксить.

Поэтому, создавать то, что нужно будет поддерживать в плане доработки, но использоваться мной не будет — не очень хочется.

PHP это скорее серверный язык. И даже более логично портировать на просто Java, чем на PHP. Из PHP я в данный момент запускаю exec('encrypt key str') и доволен.

JS вариант я с радостью буду поддерживать. Думаю надо на code.google разместить его будет.
Да я просто вспомнил ваше сообщение

> на php не удалось портировать. очень сложно сопоставлять типы данных.

и решил подколоть.

По поводу длинны ключа — единственное, что может понадобиться изменить — строчку:
hex_out += («0» if len(tmp) < 16 else "") + ("%x" % (len(tmp)*256)) + «4000» + hex_result
Было лень вводить лишние константы.
256 это длина ключа, которая в данный момент используется. Я прав?
Вообще длина ключа 512. Но тут выяснилась проблема — запустил тест, запрашивающий ключи с яндекса и сравнивающий вывод моего скрипта и яндексовского encrypt.
На 1000 ключей нашлось 4 несовпадения. Где-то не учел что-то. Буду править.
Надо бы мой JS аналог прогнать и сравнить результаты потом :-)

У Вас случайно не сохранились эти ключи?
Надо бы мой JS аналог прогнать и сравнить результаты потом :-)

У Вас случайно не сохранились эти ключи?
Ключ
81DA1AD21759F9B8160F737E717482C56AB7BBCA2A9280B223FD8283C5CCD286E7CAF4F765954B0B4BD0746DB040CD226E444E50567AF6563F964006A9A81D9F#10001

Строка
6dc8373faa9a424988341d3f2

В питон варианте для лечения бага заменил строку
if len(hex_result) % 2 == 1: hex_result = "0" + hex_result
на
hex_result = "".join(['0']*( len(NSTR)- len(hex_result))) + hex_result

Потестил ключи длиннее — работает вроде (только «4000» заменил на соответствующее вычисление этой костанты). Косяки с ключами короче текущего, что ожидаемо — я не копировал алгоритм яндекса, а пытался его воспроизвести с использованием стандартных для всех языков типов «строка» и «число» — мог где-то и не учесть варианты для других длин ключа.
упс. строка была «6dc8373faa9a424988341d3f25ffeaec». Обрезалась при копировании из putty
Благодарю. :-) Внес соответствующие правки.

А где-то исходник вашего актуального скрипта можно посмотреть? Думаю себе тоже 4000 заменить на вычисляемое число :-)
#-*- coding:utf-8 -*-

import sys, copy

if __name__ == '__main__':
  if len(sys.argv) != 3 : print "usage: python %s <public-key> <text>" % sys.argv[0]; sys.exit()
  NSTR,ESTR = sys.argv[1].split("#")
  DATA_ARR = [ord(x) for x in sys.argv[2]]
  N,E,STEP_SIZE = int(NSTR,16),int(ESTR,16), len(NSTR)/2-1
  
  prev_crypted = [0]*STEP_SIZE
  
  hex_out = ""
  for i in range(0,(len(DATA_ARR)-1)/STEP_SIZE+1):
    tmp = DATA_ARR[i*STEP_SIZE:(i+1)*STEP_SIZE]
    tmp = [tmp[i] ^ prev_crypted[i] for i in range(0,len(tmp))]
    tmp.reverse()
    plain = 0
    for x in range(0,len(tmp)): plain+= tmp[x]*pow(256, x, N)
    hex_result = "%x" % pow(plain,E,N)
    hex_result = "".join(['0']*( len(NSTR)- len(hex_result))) + hex_result

    for x in range(0,min(len(hex_result),len(prev_crypted)*2),2):
      prev_crypted[x/2] = int(hex_result[x:x+2],16)
      
    hex_out += ("0" if len(tmp) < 16 else "") + ("%x" % len(tmp)) + "00" # current size
    ks = len(NSTR)/2
    hex_out += ("0" if ks < 16 else "") + ("%x" % ks) + "00" # key size
    hex_out += hex_result

  print hex_out.decode("hex").encode("base64").replace("\n","")


Может напишешь пост про свой скрипт?
Лучше ты пиши про свой — он сложнее (ввиду отсутствия базовой поддержки больших чисел в js, base64 и тд). Мне лень. Мой можешь вставлять и использовать как хочешь.
Понял почему, не работает для более мелких ключей. У яндекса библиотека с альтернативной математикой.

Для мелких чисел периодически библиотека яндекса вычисляет неверно:

Например:
p = 3486775
e = 65537
n = 2279134640

По мнению яндекса (p^e) mod n будет равно 1853620120

По мнению всего остального человечества это равно 361606135.

На больших числах вроде ошибок не было.

Так что я могу воспроизвести алгоритм шифрации (и воспроизвел), но воспроизводить ошибки я не хочу.
Рома, ты как всегда гениален: о)
Это написали за меня. Жду готового xpi.
Пожелания:
1. Выложить код на GitHub для социального кодинга.
2. При вставке картинки html прописывать пустой alt и высоту с шириной.
С ГитХаб что-то у меня непонимание. Зарегистрировался, но там только команды для юниксов. про виндовс клиент ни слова )
Нужен ли паблик репозиторий — нет. Достаточно самого расширения.
Нужен ли проект — очень.
Я стараюсь как могу.

Альфа версия готова.
Но, в ней не работает определение шаблонов по адресам сйатов. т.е. нужно будет в альфе выбирать самоум шаблон :-)

Сегодня в течение дня загружу на мозилу =)
так где взять плагин что бы потестить?
Новое сообщение про плагин:
Sign up to leave a comment.

Articles