Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 07.11.2009, 18:03
Кандидат Javascript-наук
Отправить личное сообщение для JAre Посмотреть профиль Найти все сообщения от JAre
 
Регистрация: 29.06.2009
Сообщений: 111

Еще неудобно, то что нельзя менять последовательность вопросов в тесте.

А еще можно, однажды ответив на вопросы теста, сохранить результат и сделать такой себе кейгэн для обхода теста и прямой активации.
Но, во первых, это тест для тех кто еще не вступил в сообщество, у кого еще нет доступа к местным ресурсам и потому ему неоткуда взять хак + тест короткий и простой - нет нужды ломать

В принципе, можно повысить надежность если написать скрипт на серверной стороне, который будет время от времени генерировать новый алфавит, менять местами вопросы в xml, значения ключей. Да и РеКапчу перед тестом поставить. Но так как это всего лишь временное решение... Ну его
Ответить с цитированием
  #22 (permalink)  
Старый 10.11.2009, 22:19
Кандидат Javascript-наук
Отправить личное сообщение для JAre Посмотреть профиль Найти все сообщения от JAre
 
Регистрация: 29.06.2009
Сообщений: 111

Вот, что получилось: http://dump.ru/file/3742437 Как временное решение вполне сгодится...
Правда там версия php base64 глючная (другую не нашел) у нее проблемы с выходом за границы. Длина всех ключей активации в phpbb3 10 символов. А той реализации base64 нужно, что бы длина кодируемой строки делилась на 3. Так, что я дополнил до 12 двумя символами "XD", а при декодировании избавляюсь от "хвостика". Конечно, ламерство, но я не придумал ни одного варианта при котором это вызовет ошибку
Форум: http://wowwnet.x10hosting.com/phpbb305ru/

PS. Не знаю кому оно нужно, но раз обещал - выложу

Последний раз редактировалось JAre, 10.11.2009 в 22:33.
Ответить с цитированием
  #23 (permalink)  
Старый 09.06.2012, 07:56
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Люди, 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 - стал ругаться вообще непонятно на что

Сейчас ошибок интерпретатора нет (!), но в результате шифрования всегда получается строка, состоящая из нуля. Как отлаживать?
Ответить с цитированием
  #24 (permalink)  
Старый 09.06.2012, 08:05
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Поясню сразу, чего я хочу. Я работаю над IM-системой, и решил прикрутить к ней шифрование на стороне клиента. Таким образом, данные будут зашифрованы не только в БД, но и передаваться по сети будут в шифрованном виде. Я отыскал этот алгоритм, он мне понравился. Авторы пишут, что он очень надёжный. Это очень простой алгоритм шифрования, усиленный MD5 подписями. В самом деле, там присутствует функция MD5 на JS и MD5-хэш ключа передаётся одним из аргументов основной шифрующей функции.

Я взял JS код. Алгоритм пока такой (возможно, буду улучшать): на клиента подгружаются для каждой шифрованной комнаты кодированные ключом сэмплы заранее известного отрывка текста (его можно увидеть через просмотр JS кода). Вообще это не очень хорошо, но так работает быстрее. Когда у пользователя просят ввести ключ, скрипт кодирует этот сэмпл и сверяет с шифрованным сэмплом комнаты. Если совпадает, тогда подгружаются зашифрованные сообщения с сервера и раскодируются "на лету". Ну и запись идёт аналогично: сначала шифруем, потом уже отправляем на сервер.

И всё бы хорошо...

Но я захотел сделать функцию смены ключа. А для этого надо расшифровать, а затем снова зашифровать все сообщения комнаты, но уже с новым ключом. И я рассудил, что лучше это сделать на сервере... Вот и мучаюсь теперь, пытаясь этот алгоритм на PHP портировать.

Переносил аккуратно, но видимо где-то навалял. Или какие-то тонкости языка всё портят...
Ответить с цитированием
  #25 (permalink)  
Старый 09.06.2012, 08:39
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

О, класс, разобрался) Отладка рулит.

Проблема была тупа как бревно. Я забыл плюс поменять на точку (конкатенацию). И PHP приводил строки к числам и складывал по-честному
Ответить с цитированием
  #26 (permalink)  
Старый 09.06.2012, 09:11
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Ура, работает!

Кстати, этот чудный алгоритм (в отличие от простого хэша к примеру), содержит рандомный элемент, и поэтому шифры каждый раз получаются разные! Но, что характерно, расшифровывает всегда безошибочно. Там информация о случайной составляющей в итоговую строку закладывается просто.
Ответить с цитированием
  #27 (permalink)  
Старый 26.02.2015, 16:06
Rik Rik вне форума
Интересующийся
Отправить личное сообщение для Rik Посмотреть профиль Найти все сообщения от Rik
 
Регистрация: 06.06.2012
Сообщений: 24

Добрый день!
Подыму эту старую темку!
нужен простенький алгоритм шифрования/дешифрирования, но что бы работал и на php и на яве.
Поиском нашёл эту тему, поправил код popov654, работает нормально, но то что закодировано на php не расшифровывает ява и наоборот.
Пробовал сделать случайную составляющею сделать "постоянной" и в виде теста один символ, тогда алгоритмы выдают постоянные строки, но разные.
Не могу понять в чём грабли, помогите разобраться!!!
Или может быть есть другой простенький алгоритм на php и на яве?

Последний раз редактировалось Rik, 26.02.2015 в 16:40.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обрезать строку и добавить символы в середине, в зависимости от длинны строки andreyua Firefox/Mozilla 12 10.12.2010 15:44
Как удалить последний символ строки? PAMAC Events/DOM/Window 5 18.10.2009 15:01
Для события onCLick получить индекс строки и объект грида. progi2007 ExtJS 4 05.08.2009 11:31
Подсветка выделенной строки в таблице (row table highlight) artsage Элементы интерфейса 4 03.04.2009 06:40
Разбор строки GRol Общие вопросы Javascript 19 04.03.2009 00:33