как зашифровать строку с помощью секретного ключа?

rsv

Новичок
как зашифровать строку с помощью секретного ключа?

Есть две строки
"secured_text_0001"
"secured_text_0002"
если шифровать эти две строки используя пример от сюда
http://www.php.net/manual/ru/function.mdecrypt-generic.php
то зашифрованный текст выглядит примерно одинаково, то есть если начало текста исходных строк совпадает, то и начала зашифрованных строк тоже совпадают
есть ли такой алгоритм шифровки (реализуемый с помощью функций имеющихся в php), чтобы если вторая исходная строка отличается от первой хотябы одним последним символом, то зашифрованные строки различаются полностью
имеем:
"secured_text_0001"
"secured_text_0002"
получаем типа:
"biseriusvbgc3ytc9n54yxd9m34y93"
"kydne87t48mfh8eg8eyt78gy8cv78"
и при этом чтобы был способ получить из зашифрованных строк исходные.
И надо чтобы ключ был один и тот же для шифрования обеих строк, либо его не должно быть вообще :)
 

alexhemp

Новичок
rsv

Для симметричных блочных потоковых шифров это так и будет. Если ключ одинаковый и блок данных одинаковый - то и шифротекст будет совпадать.

ИМХО - это все совершенно не важно поскольку стойкость все равно зависит от выбранного ключа и алгоритма.
Или ты думаешь что эта идентичность может как-то быть использована?

Для стандартных шифров, например BlowFish или 3DES это ничего не даст, чтобы частотный анализ применить нужно очень много таких одинаковых текстов.

Очень много - это порядка 2^(длина ключа - 50) примерно.

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

rsv

Новичок
исходная задача такая
есть набор папок в которых лежат хтмл файлы и картинки
все файлы отдаются юзеру скриптом
и все ссылки на картинки и хтмл файлы соответственно тоже генерируются скриптом
заказчик хочет чтобы если есть например физически папка на сервере
и в ней куча картинок, то юзеру бы отдавались ссылки на картинки так как будто они лежат в случайно сгенерированных папках

например сейчас так сделано
folde1/pic1.jpg
folde1/pic2.jpg
folde1/pic3.jpg
а нужно чтобы было так
sfggsdg/pic1.jpg
kjsvvcw/pic2.jpg
bc87svb/pic3.jpg

я подумал, что было бы неплохо название пакпки+картинка шифровать а отдавать юзеру как ссылку а потом расшифровывать чтобы картинку отдать

не хранить же для каждого сгенерированного имени папки соответствие реальной папки в сессии юзера
картинок может быть больше тысячи
 

dacuan

Новичок
rsv
Храни картинки в одной папке, а пользователю отдавай случайные строки. Запросы пользователей преобразовывай с мопощью mod_rewrite.
 

rsv

Новичок
картинки в одной папке хранить нельзя, поскольку картинки из разных папок могут иметь одинаковые названия
 

ksnk

прохожий
Эээ... то-есть в строчке, которую нужно модифицировать есть неизменяемый хвост? Тогда можно его использовать для модификации ключа. К примеру, приписывать сначала ключа md5 от этого самого хвоста. Итого - каталоги будут непохожими... Подходит?
 

rsv

Новичок
наверно не понял твою идею?
получается что для того чтобы определить название папки из которой юзеру нужно отдать картинки, по той ссылке которую он прислал, надо взять мд5 от всех существующих папок и сравнить с присланным
папок будет порядка 2000, это для вывода каждой картинки надо бдет сделать 2000 сравнений
или я чего то не понял?
 

Andreika

"PHP for nubies" reader
rsv
кажись его идея такая -
если единственное, что тебе не нравится в твоем варианте - похожесть результатов шифрования, то добавь в начало и конец названия папки md5(microtime()) и md5(mt_rand()) потом шифруй ).. после расшифровки 32 первых и последних символа обрезай )
 

dacuan

Новичок
rsv
Делай так:
Предположим, твоя папка называется /images/folder1/ (от корня сайта)
тогда мнимая папка будет иметь название
/<случайный код>/folder1/
и т.п. Имя папки сможешь определить однозначно.
 

ksnk

прохожий
В примере, на который ты ссылаешься нужно сделать, к примеру, так
PHP:
   $fn=substr($plaintext,strrpos($plaintext,'/'));
   $key = substr(md5($fn).$key, 0, mcrypt_enc_get_key_size($td));
Так как для енкрипта и для декрипта тебе приходят строчки с одинаковым хвостом, то добавки к ключу тоже будут одинаковые

-~{}~ 29.10.05 18:21:

Кодируется, конечно, не $plaintext, а то, что до $fn :)
 

rsv

Новичок
кажись его идея такая -
если единственное, что тебе не нравится в твоем варианте - похожесть результатов шифрования, то добавь в начало и конец названия папки md5(microtime()) и md5(mt_rand()) потом шифруй ).. после расшифровки 32 первых и последних символа обрезай )
Получается что средний участок папки всеравно для всех картинок будет одинаковым
/<случайный код>/folder1/
и т.п. Имя папки сможешь определить однозначно.
реальное имя папки в ссылке не должно фигурировать
 

dacuan

Новичок
rsv
Такое бывает :)
Есть ли закономерность в именах каталогов?
Если есть, то выводи в урле только изменяемую часть, если нет, то создай карту соответстви имен и используй ее в преобразованиях, думаю, это может работать быстрее, чем постоянное кодирование-декодирование.
 

SiMM

Новичок
> реальное имя папки в ссылке не должно фигурировать
Ну так и делай
/<случайный код>/id_папки/
правда совершенно непонятно, на кой ляд далось это требование.
 

rsv

Новичок
в общем если кому интересно вот что у меня получилось
все как то просто оказалось :0)
PHP:
function crypt_str($key,$string)
 {
  $td = mcrypt_module_open ('des', '', 'ecb', '');
  $iv_size = 8;
  $iv = mcrypt_create_iv ($iv_size, MCRYPT_RAND);
  if (mcrypt_generic_init ($td, $key.substr($iv, 0, 3), $iv) != -1) 
     {
      $c_t = mcrypt_generic ($td, $string);
      mcrypt_generic_deinit ($td);
      mcrypt_module_close ($td);
      $packed= bin2hex($iv.$c_t);
      return $packed;
     }
  mcrypt_module_close ($td);
  return false;
 }

function decript_str($key,$string)
 {
  $c_t = pack("H*", $string);
  $iv = substr($c_t, 0, 8);
  $c_t = substr($c_t, 8);
  $td = mcrypt_module_open ('des', '', 'ecb', '');
  if (mcrypt_generic_init ($td, $key.substr($iv, 0, 3), $iv) != -1)
     {
      $p_t = mdecrypt_generic ($td, $c_t);
      mcrypt_module_close ($td);
      return $p_t;
     }
  mcrypt_module_close ($td);
  return false;
 }
смысл такой что для выбранного алгоритма шифрования ключ нужен длинной 8 байт
мы берем в качестве ключа только 5 байт а остальные 3 байта генерим случайным образом всегда
в данном случае просто берем первые три байта из вектора инициализации
а когда кодируем шифрованную строку в шетнадцатиричный формат, то в начало подставляем вектор
при расшифровке строки используем секретный ключ 5ти байтовый плюс первые три байта из вектора который есть в начале закодированной строки
в итоге получается что одна и таже строка всегда будет иметь абсолютно разный вид в зашифрованном формате и вроде как безопастность не сильно пострадала, хотя конечно я не знаю, может 5ти байтовый ключ ломается вообще влет 8)
 

SiMM

Новичок
Смысл такой, что задача не требует шифрования. Вообще. Хотя конечно гвозди микроскопом забивать можно, да...
 

rsv

Новичок
если кто то не видит смысла в шифровании для поставленной задачи, это в общем то не означает что смысла нет ;)
 

ixti

Новичок
Категорически согласен с SiMM. Зачем и куда тебе именно шифрование уперлось? Или заказчик хочет видеть в качестве не существующих директорий именно человеконепонятные "4bs16a...". Ну так и в этом случае можно извернуться и создать таблицу соответствия, о которой говорил dacuan. При особом желании можно еще и заставить ее генерироваться каждый раз по разному.
 
Сверху