шифрование строки по ключу
Доброго времени суток.
Никак не могу найти библиотеку реализующий что-то в роде: var str = "some string"; var k = "some key"; var tmp = encrypt(str, k); str == decrypt(tmp, k); Но мне нужно что бы была реализация на javascript и php. Особых требований к безопасности нет. Вот пример только javascript Заранее благодарен! |
Просто, больно не хочется эту мутатень на php переводить
c64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''), l64 = {}; for (i=0; i<64; i++) l64[c64[i]] = i; function alphar(s) { // I only pray--let me be ready. var i; // s must contain only base-64 characters! s = s.replace(/[^0-9A-Za-z+\/]+/g, ''); s = s.split(''); // preparse k into n-series for (i=0; i<s.length; i++) s[i] = l64[s[i]]; return s; } // circular--acraw(acraw(a, k, r, sec), k, r, sec) == a function acraw(s, k, r, seed) { /* seed is a sec feature; read some papers about non-repeated initializations */ var i; s = s.split(''); // isn't it thrilling? for (i=0; i<s.length; i++) s[i] = c64[l64[s[i]] ^ k[i%k.length] ^ r[i%r.length] ^ seed]; return s.join(''); // yahoo! } function alphac(s, k, r, on) { /* encrypt = on | off */ // get read, get set var d, i; k=alphar(k), r=alphar(r); // dump empty stuff if (r.length == 0 || k.length == 0 || s.length == 0) return s; // split s into bunches of base-64/non-base-64 s = s.match(/[^0-9A-Za-z+\/]+|[0-9A-Za-z+\/]+/g); i = /[0-9A-Za-z+\/]/.test(s[0]) ? 0 : 1; // give a 1-2 punch! go! if (on) for (; i<s.length; i+=2) d = c64[Math.floor(Math.random()*64)], s[i] = acraw(s[i], k, r, l64[d])+d; /* si + d, Sidney Hall */ else for (; i<s.length; i+=2) d = s[i].length-1, s[i] = acraw(s[i].substring(0, d), k, r, l64[s[i].charAt(d)]); // finished! return s.join(''); } |
Разве нет готовых функций в PHP для Base64?
|
|
Ага. То есть вы предлагаете передавать в функцию значение это-го ключа var b64 = "ABCDEFGHIJKLMNOPQRSTUVWX... + строку ?
|
Я просто в криптографии как рыба на сковородке :)
|
Это не ключ, и не шифрование. Это base64 алгоритм. Читать тут
Где Вы вообще хотите кодировать? На сервере или на клиенте? |
В том то и проблема, что кодировать на сервере а декодировать на стороне клиента. b64 ключ, ось или что там еще. Но я думаю, что можно безопасно поменять последовательность и получить рабочий код генерирующий качественный хеш ?
На всякий случай уточню: Есть две строки "А" и "Б" . Из них на сервере делаем третью "С". Клиент получает ее "С" + генерирует определенным образом( это дела не касается) одну из изначальных строк "Б" и на основании этих двух "С" и "Б" восстанавливает третью "А" и передаёт обратно серверу( это то же дела не касается) PS. Спасибо. сейчас почитаю. |
Последний вопрос, надеюсь, в этот раз.
Нужно этот код http://javascript.ru/php/base64_encode перевести на php (встроенную функцию не предлагать) у меня даже имеется часть кода http://www.everfall.com/paste/id.php?tgo9b3r1ay5s Нужно что бы этот скрипт давал такой же результат как и http://javascript.ru/php/base64_encode Будем очень благодарны :) |
Цитата:
|
|
Цитата:
|
Вариант на яве мне дали на этом форуме. А вот php вариант не стандартен. Нужно его как-то исправить. Но что именно не в порядке - не знаю.
|
Цитата:
|
Вот сравните:
Код:
mCHCwQPwWFaqiWhQ9x0kSbdK4tgVjHEh Код:
MchcWqpWwfAQIwHqSX0KsBDk4TGvJheH Он финтит с регистрами. Мне нужен или что бы Ява так же финтила или он не финтил :) |
Это я кодировал строку
Код:
$string = pack('H*', "31c85c5aaa56c1f0102301ea497d0ab010e4e131af261787"); |
Т.е. то, что лажает самопальный, а не стандартный PHP-шный, вы даже не допускаете? Интересная логика.
|
Цитата:
|
Спасибо. Не заметил :) Сейчас исправлю и перепроверю.
Цитата:
|
Спасибо. Всё замечательно.
Сейчас запакую, протестирую всю программу и выложу ссылку на сурцы и тестовый сайт( ну или когда приведу его в пристойный вид :) ) Коротко, что я вообще делаю: Нужно сделать тест на знание правил форума при регистрации. Форум на движке phpbb. Сейчас я делал пакет скриптов, реализующий прототип для тестирования реализации. Для установки теста нужно модифицировать всего один файл движка. Как оно работает: Модифицированный файл генерации почтового сообщения с подтверждением регистрации вместо ссылки с ключом и идентификатором пользователя для активации аккаунта высылает пользователю ссылку на тест с закодированным ключом активации в бэйс64 с модифицированным алфавитом. Страница теста грузить xml с вопросами и ответами. Верные ответы в файле не указаны. Вместо этого у каждого ответа есть свой ключ (часть словаря бэйс64) в атрибутах. Когда пользователь выбирает ответ на вопрос его ключ добавляется в переменную "результат". После того как тест пройден скрипт использует значение переменной "результат" как словарь для бэйс64 декодирования переданного сервером ключа активации. Ну а потом декодированный ключ передаётся стандартному механизму активации phpbb. Конечно, у варианта много минусов но он достаточно надежен и прост как для прототипа. Мне нужно, что бы какое-то время поработал на сервере пока я не закончу с полноценным тестом - метод встраивания будет тот же, всё остальное будет по другому. пример xml http://www.everfall.com/paste/id.php?d2cgz4lgxfbx |
Еще неудобно, то что нельзя менять последовательность вопросов в тесте.
А еще можно, однажды ответив на вопросы теста, сохранить результат и сделать такой себе кейгэн для обхода теста и прямой активации. Но, во первых, это тест для тех кто еще не вступил в сообщество, у кого еще нет доступа к местным ресурсам и потому ему неоткуда взять хак + тест короткий и простой - нет нужды ломать :) В принципе, можно повысить надежность если написать скрипт на серверной стороне, который будет время от времени генерировать новый алфавит, менять местами вопросы в xml, значения ключей. Да и РеКапчу перед тестом поставить. Но так как это всего лишь временное решение... Ну его :) |
Вот, что получилось: http://dump.ru/file/3742437 Как временное решение вполне сгодится...
Правда там версия php base64 глючная (другую не нашел) у нее проблемы с выходом за границы. Длина всех ключей активации в phpbb3 10 символов. А той реализации base64 нужно, что бы длина кодируемой строки делилась на 3. Так, что я дополнил до 12 двумя символами "XD", а при декодировании избавляюсь от "хвостика". Конечно, ламерство, но я не придумал ни одного варианта при котором это вызовет ошибку :) Форум: http://wowwnet.x10hosting.com/phpbb305ru/ PS. Не знаю кому оно нужно, но раз обещал - выложу :) |
Люди, help :help:
Срочно нужно перевести приведённый выше код на PHP. Вот сам модуль: http://www.angelfire.com/ny5/consigl...lphacrypt.html Вот код на JS: c64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''), l64 = {}; for (i=0; i<64; i++) l64[c64[i]] = i; function alphar(s) { // I only pray--let me be ready. var i; // s must contain only base-64 characters! s = s.replace(/[^0-9A-Za-z+\/]+/g, ''); s = s.split(''); // preparse k into n-series for (i=0; i<s.length; i++) s[i] = l64[s[i]]; return s; } // circular--acraw(acraw(a, k, r, sec), k, r, sec) == a function acraw(s, k, r, seed) { /* seed is a sec feature; read some papers about non-repeated initializations */ var i; s = s.split(''); // isn't it thrilling? for (i=0; i<s.length; i++) s[i] = c64[l64[s[i]] ^ k[i%k.length] ^ r[i%r.length] ^ seed]; return s.join(''); // yahoo! } function alphac(s, k, r, on) { /* encrypt = on | off */ // get read, get set var d, i; k=alphar(k), r=alphar(r); // dump empty stuff if (r.length == 0 || k.length == 0 || s.length == 0) return s; // split s into bunches of base-64/non-base-64 s = s.match(/[^0-9A-Za-z+\/]+|[0-9A-Za-z+\/]+/g); i = /[0-9A-Za-z+\/]/.test(s[0]) ? 0 : 1; // give a 1-2 punch! go! if (on) for (; i<s.length; i+=2) d = c64[Math.floor(Math.random()*64)], s[i] = acraw(s[i], k, r, l64[d])+d; /* si + d, Sidney Hall */ else for (; i<s.length; i+=2) d = s[i].length-1, s[i] = acraw(s[i].substring(0, d), k, r, l64[s[i].charAt(d)]); // finished! return s.join(''); } Он прекрасно работает. А вот, то, что у меня получилось на PHP: <?php function alphar($s) { $c64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; $l64 = array(); for ($i=0; $i<64; $i++) $l64[$c64[$i]] = $i; $s = preg_replace('/[^0-9A-Za-z+\/]+/', '', $s); for ($i=0; $i<strlen($s); $i++) $s[$i] = $l64[$s[$i]]; return $s; } // circular--acraw(acraw(a, k, r, sec), k, r, sec) == a function acraw($s, $k, $r, $seed) { $c64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; $l64 = array(); for ($i=0; $i<64; $i++) $l64[$c64[$i]] = $i; for ($i=0; $i<strlen($s); $i++) $s[$i] = $c64[$l64[$s[$i]] ^ $k[$i%(int)strlen($k)] ^ $r[$i%(int)strlen($r)] ^ $seed]; return $s; } function alphac($s, $k, $r, $on) { /* encrypt = on | off */ $c64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; $l64 = array(); for ($i=0; $i<64; $i++) $l64[$c64[$i]] = $i; $k=alphar($k); $r=alphar($r); if (strlen($r) == 0 || strlen($k) == 0 || strlen($s) == 0) return $s; // split s into bunches of base-64/non-base-64 preg_match_all('/[^0-9A-Za-z+\/]+|[0-9A-Za-z+\/]+/', $s, $a); $b = $a[0]; $i = preg_match('/[0-9A-Za-z+\/]/', $b[0]) ? 0 : 1; if ($on) { for (; $i<count($b); $i+=2) { $d = $c64[floor(rand(0,63))]; $b[$i] = acraw($b[$i], $k, $r, $l64[$d])+$d; /* si + d, Sidney Hall */ } } else { for (; $i<count($b); $i+=2) { $d = strlen($b[$i])-1; $b[$i] = acraw(substr($b[$i], 0, $d), $k, $r, $l64[$b[$i][$d]]); } } return implode('', $b); } ?> Причём, мне пришлось скопировать одно и то же в каждую функцию, потому что иначе он ругался на неинициализированные переменные. Пробовал писать global - стал ругаться вообще непонятно на что :( Сейчас ошибок интерпретатора нет (!), но в результате шифрования всегда получается строка, состоящая из нуля. Как отлаживать? :cray: |
Поясню сразу, чего я хочу. Я работаю над IM-системой, и решил прикрутить к ней шифрование на стороне клиента. Таким образом, данные будут зашифрованы не только в БД, но и передаваться по сети будут в шифрованном виде. Я отыскал этот алгоритм, он мне понравился. Авторы пишут, что он очень надёжный. Это очень простой алгоритм шифрования, усиленный MD5 подписями. В самом деле, там присутствует функция MD5 на JS и MD5-хэш ключа передаётся одним из аргументов основной шифрующей функции.
Я взял JS код. Алгоритм пока такой (возможно, буду улучшать): на клиента подгружаются для каждой шифрованной комнаты кодированные ключом сэмплы заранее известного отрывка текста (его можно увидеть через просмотр JS кода). Вообще это не очень хорошо, но так работает быстрее. Когда у пользователя просят ввести ключ, скрипт кодирует этот сэмпл и сверяет с шифрованным сэмплом комнаты. Если совпадает, тогда подгружаются зашифрованные сообщения с сервера и раскодируются "на лету". Ну и запись идёт аналогично: сначала шифруем, потом уже отправляем на сервер. И всё бы хорошо... Но я захотел сделать функцию смены ключа. А для этого надо расшифровать, а затем снова зашифровать все сообщения комнаты, но уже с новым ключом. И я рассудил, что лучше это сделать на сервере... Вот и мучаюсь теперь, пытаясь этот алгоритм на PHP портировать. Переносил аккуратно, но видимо где-то навалял. Или какие-то тонкости языка всё портят... :( |
О, класс, разобрался) Отладка рулит.
Проблема была тупа как бревно. Я забыл плюс поменять на точку (конкатенацию). И PHP приводил строки к числам и складывал по-честному :) |
Ура, работает! :dance:
Кстати, этот чудный алгоритм (в отличие от простого хэша к примеру), содержит рандомный элемент, и поэтому шифры каждый раз получаются разные! :) Но, что характерно, расшифровывает всегда безошибочно. Там информация о случайной составляющей в итоговую строку закладывается просто. |
Добрый день!
Подыму эту старую темку! нужен простенький алгоритм шифрования/дешифрирования, но что бы работал и на php и на яве. Поиском нашёл эту тему, поправил код popov654, работает нормально, но то что закодировано на php не расшифровывает ява и наоборот. Пробовал сделать случайную составляющею сделать "постоянной" и в виде теста один символ, тогда алгоритмы выдают постоянные строки, но разные. Не могу понять в чём грабли, помогите разобраться!!! Или может быть есть другой простенький алгоритм на php и на яве? |
Часовой пояс GMT +3, время: 07:46. |