Forum Webscript.Ru

Программирование => PHP => Тема начата: reLax[0x00] от 14 Апреля 2006, 21:35:37

Название: libmcrypt-помгите новичку плиз :(
Отправлено: reLax[0x00] от 14 Апреля 2006, 21:35:37
Была когда то задача  обеспечить безопасную транзакцию между тремя SQL серверами без использования https..выход один нашел - заюзать libmcrypt. В принципе то все равботает, но криво на самом деле. Во первых урезание NULL-бит символов в конце-го это еще не проблма. Проблма что я что то не поняимаю-в функцию my_encrypt() я не могу всунуть константу  случайного выбора :( часть кода своровал с php.net для избежания лишних комментариев-скажу сразу. Может вы знаете. Это так, оболочка чтобы алгоритмы потестить.


require_once $_SERVER[\'DOCUMENT_ROOT\']."/functions.php";

$modes = mcrypt_list_modes();
$algorithms = mcrypt_list_algorithms();


$_GET[\'uid\'] = ($_GET[\'uid\'] > count ($algorithms))?max(array_keys($algorithms)):$_GET[\'uid\'];
$poststring = htmlspecialchars (stripslashes ($_POST[\'string\']));

$random = array (
                "MCRYPT_DEV_RANDOM",
                "MCRYPT_DEV_URANDOM",
                "MCRYPT_RAND",
                );

if (!empty($_GET[\'uid\']))
    {
$disable_select = "disabled";
     foreach ($modes as $mod)
   {
if (@mcrypt_test_module_mode ($algorithms[$_GET[\'uid\']], $mod))
$option_modes .= "";
         }

         foreach ($random as $mtrand)
    {
         $option_random .= "";
              }

$value_text = (!isset($_POST[\'cikey\']))? sha1 (uniqid(rand(), true)):$_POST[\'cikey\'];

} else {
$disable_form = "disabled";
$option_modes = "";
$option_random = "";
$value_text = "[************************************************]";
    }

function mcrypt_check_sanity() {
global $modes, $algorithms;
$html = "
Таблица констант алгоритмов и их значений библиотеки LIBMCRYPT
";
$html.= "";
$html.= "";

foreach ($modes as $mode)
$html.= "";
$html.= "";
 foreach ($algorithms as $cipher)
    {
     $html.= "";

       if(mcrypt_module_self_test($cipher))
      {
     $html.= "";
               } else {
     $html.= "";
           }

$html.= "";
              } else {
           foreach ($ksizes as $size)      
                 {
               $html.= $size." ";
                      }
  }
$html.= "";

if (mcrypt_module_get_algo_block_size($cipher) == 1)
           {
$html.= "";
        } else {
$html.="";
           }

   foreach ($modes as $mode)
       {
       if($mode == \'\')
      {
           $result = "";
       } else if(mcrypt_test_module_mode($cipher,$mode))
      {
             $result = "";
       } else {
             $result = "";
       }
       $html.= $result;
   }
      $html.= "";
 }
$html.= "
АлгоритмСтатусРазмер ключаРазмер блока".strtoupper($mode)."
".strtoupper($cipher)."АктивенНе активен";  
$ksizes = mcrypt_module_get_supported_key_sizes($cipher);
          if($ksizes==NULL)
        {
          $html.= "1-".mcrypt_module_get_algo_key_size($cipher)."
Поток".mcrypt_module_get_algo_block_size($cipher)."НетДаНет
";
      return $html;
}

function checksum () {
global $algorithms, $poststring;

$comments = array (
                 "3des"=>"Тройной DES, стандарт шифрования данных США (U.S. Data Encryption Standart)",
                 "tripledes"=>"Тройной DES, стандарт шифрования данных США (U.S. Data Encryption Standart)",
"3way"=>"3way (Joan Daemen)",
"threeway"=>"3way (Joan Daemen)",
"blowfish"=>"Blowfish (Bruce Schneier)",
"blowfish-compat"=>"Blowfish, совместимый с другими реализациями (Bruce Schneier)",
"blowfish_128"=>"Blowfish (Bruce Schneier)",
"blowfish_192"=>"Blowfish (Bruce Schneier)",
"blowfish_256"=>"Blowfish (Bruce Schneier)",
"blowfish_448"=>"Blowfish (Bruce Schneier)",
                 "cast_128"=>"CAST (Carlisle Adams & Stafford Tavares)",
"cast_256"=>"CAST (Carlisle Adams & Stafford Tavares)",
"crypt"=>"Однопроходный алгоритм шифрования Unix",
"enigma"=>"Однопроходный алгоритм шифрования Unix",
"des"=>"DES, стандарт шифрования данных США (U.S. Data Encryption Standart)",
"gost"=>"Государственный стандарт СССР",
"idea"=>"Международный стандарт шифрования данных (International Data Encryption Algorithm)",
"loki97"=>"LOKI97 (Lawrie Brown & Josef Pieprzyk)",
"mars"=>"MARS (IBM)",
                 "panama"=>"PANAMA (Joan Daemen & Craig Clapp)",
"rc2"=>"Rivest Cipher 2",
"rc2_1024"=>"Rivest Cipher 2",
"rc2_128"=>"Rivest Cipher 2",
"rc2_256"=>"Rivest Cipher 2",
"rc4"=>"Rivest Cipher 4",
"arcfour"=>"Не имеющий торговой марки, RC4-совместимый",
"arcfour_iv"=>"Не имеющий торговой марки, RC4-совместимый с вектором инициализации",
"rc6"=>"Rivest Cipher 6",
                 "rc6_128"=>"Rivest Cipher 6",
"rc6_192"=>"Rivest Cipher 6",
"rc6_256"=>"Rivest Cipher 6",
"rijndael-128"=>"Rijndael (Joan Daemen & Vincent Rijmen)",
"rijndael-192"=>"Rijndael (Joan Daemen & Vincent Rijmen)",
"rijndael-256"=>"Rijndael (Joan Daemen & Vincent Rijmen)",
"saferplus"=>"SAFER+, основанный на SAFER - безопасной и быстрой процедуре шифрования с улучшенным набором усиленных ключей (Secure And Fast Encryption Routine With Strengthened Key Schedule)",
"safer_128"=>"Безопасная и быстрая процедура шифрования с улучшенным набором усиленных ключей (Secure And Fast Encryption Routine With Strengthened Key Schedule)",
"safer_64"=>"Безопасная и быстрая процедура шифрования с усиленным ключом (Secure And Fast Encryption Routine With Strengthened Key)",
                 "serpent"=>"Serpent (Ross Anderson, Eli Biham & Lars Knudsen)",
"serpent_128"=>"Serpent (Ross Anderson, Eli Biham & Lars Knudsen)",
"serpent_192"=>"Serpent (Ross Anderson, Eli Biham & Lars Knudsen)",
"serpent_256"=>"Serpent (Ross Anderson, Eli Biham & Lars Knudsen)",
"skipjack"=>" Стандарт шифрования Управления Национальной Безопасности США (U.S. NSA Clipper Escrowed Encryption Standart)",
"twofish"=>"Twofish (Counterpane Systems)",
"twofish_128"=>"Twofish (Counterpane Systems)",
"twofish_192"=>"Twofish (Counterpane Systems)",
"twofish_256"=>"Twofish (Counterpane Systems)",
                 "wake"=>"Шифрование строк с авто-ключом (Word Auto Key Encryption, David Wheeler)",
"xtea"=>"Расширенный малый алгоритм шифрования (Extended Tiny Encryption Algorithm, David Wheeler, Roger Needham",
"ecb"=>"Режим электронной кодовой книги (Electronic Code Book - ECB)",
"cbc"=>"Режим цепочки кодовых блоков (Cipher Block Chaining - CBC)",
"cfb"=>"Режим обратной кодовой связи (Cipher Feedback - CFB)",
"ofb"=>"Режим выходной обратной связи с 8-и битной обратной связью (Output Feedback - OFB)",
"nofb"=>"Режим выходной обратной связи (OFB) с n-битной обратной связью, где n - это размер блока, используемый алгоритмом",
                 "ncfb"=>"Режим обратной кодовой связи (CFB) с n-битной обратной связью, где n - это размер блока, используемый алгоритмом",
"stream"=>"Режим потокового кода (Stream Cipher)",
"MCRYPT_DEV_RANDOM"=>"Устройство случайности /dev/random",
                 "MCRYPT_DEV_URANDOM"=>"Устройство случайности /dev/urandom",
"MCRYPT_RAND"=>"Встроенный генератор случайных чисел"
                  );
Название: libmcrypt-помгите новичку плиз :(
Отправлено: reLax[0x00] от 14 Апреля 2006, 21:37:19
продолжение


if (isset($_POST[\'submit\'])) {

$check_plain_text = md5(rtrim ($poststring));
$check_decoded_text = md5(rtrim(my_decrypt (my_encrypt($poststring, $_POST[\'cikey\'], $algorithms[$_GET[\'uid\']],$_POST[\'mode\'], $_POST[\'rand\']), $_POST[\'cikey\'],$algorithms[$_GET[\'uid\']],$_POST[\'mode\'])));
(bool) $checksum = ($check_plain_text == $check_decoded_text)?1:0;
$html.= "
Контрольная сумма и общие данные
";
$html.= "";
$html.= "";
$html.= "";
$html.= "";
$html.= "".(($checksum)?"";
$html.= "";
$html.= "";
$html.= "";
$html.= "";
$html.= "";
$html.= "";
$html.= "".((mcrypt_module_is_block_algorithm ($algorithms[$_GET[\'uid\']]))?"";
$html.= "".((mcrypt_get_iv_size ($algorithms[$_GET[\'uid\']], $_POST[\'mode\'])!=0)?"";
$html.= "
Контрольная сумма
Контрольная сумма MD5 исходных данных ".$check_plain_text."
Контрольная сумма MD5 после дешифрации ".$check_decoded_text."
Результат сверки контрольных суммВозвращенные данные после дешифрации идентичны оригинальным":"Исходные данные после дешифрации не совпадают с оригинальными")."
Общие сведения об использованном методе шифрования данных
Используемый алгоритм библиотеки LIBMCRYPTMCRYPT_".strtoupper ($algorithms[$_GET[\'uid\']])."
".$comments[$algorithms[$_GET[\'uid\']]]."
Используемый режим шифрованияMCRYPT_MODE_".strtoupper ($_POST[\'mode\'])."
".$comments[$_POST[\'mode\']]."
Псевдоустройство случайности".$_POST[\'rand\']."
".$comments[$_POST[\'rand\']]."
Автоматически сгенерированный 40-разрядный SHA1-хэш ключа".wordwrap ($_POST[\'cikey\'], 40, \'
\',1)."
Размер ключа (берется максимальный)".mcrypt_get_key_size($algorithms[$_GET[\'uid\']], $_POST[\'mode\'])." Bytes
Размер блока".mcrypt_module_get_algo_block_size($algorithms[$_GET[\'uid\']])." Bytes":"Является потоковым алгоритмом, блоки не использует")."
Размер вектора инициализации".mcrypt_get_iv_size($algorithms[$_GET[\'uid\']], $_POST[\'mode\'])." Bytes":"В данном режиме вектор инициализации не используется")."
";
}
return $html;
}

function alg () {
global $algorithms, $disable_select, $poststring;
$html.= "

Алгоритм
";
return $html;
}

function alkey () {
global $value_text, $poststring;
$html = "
Генерация произвольного 40-разрядного SHA1-хэша ключа
";
return $html;
}

function mod () {
global $option_modes, $disable_form, $poststring;
$html = "
Режим шифрования
";
return $html;

}

function ran () {
global $option_random, $disable_form, $poststring;
$html = "
Источник случайности
";
return $html;
}

function text () {
global $disable_form, $poststring;
$html = "
Исходные данные
";
return $html;
}

function enc () {
global $algorithms, $poststring;
$html = "
Зашифрованные данные
";
return $html;
}

function sub () {
global $disable_form, $poststring;
$html = "
";
return $html;
}

function red () {
global $disable_form, $poststring;
$html = "
";
return $html;
}


function show () {
$html = "
Здесь можно что-нибудь зашифровать
";
$html.= "


   
   


   
   


   


   


   
   

".alg()."".alkey()."
".mod()."".ran()."
".text()."
".enc()."


".sub()."          ".red()."
";

return $html;
}

Название: libmcrypt-помгите новичку плиз :(
Отправлено: reLax[0x00] от 14 Апреля 2006, 21:38:57
продолжение



function mcrypt_test_module_mode($module,$mode) {
 global $algorithms, $modes;
 $key = \'this is a very long key, even too long for the cipher\';
 $plain_text = \'very important data\';
 $td = mcrypt_module_open($module, \'\',$mode, \'\');
 $key = substr($key, 0, mcrypt_enc_get_key_size($td));
 $iv_size = mcrypt_enc_get_iv_size($td);
 $iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
if (mcrypt_generic_init($td, $key, $iv) != -1)
    {
 $c_t = mcrypt_generic($td, $plain_text);
 mcrypt_generic_deinit($td);
 mcrypt_module_close($td);
 $td = mcrypt_module_open($module, \'\', $mode, \'\');
 $key = substr($key, 0, mcrypt_enc_get_key_size($td));
 mcrypt_generic_init($td, $key, $iv);
 $p_t = trim(mdecrypt_generic($td, $c_t));
 mcrypt_generic_end($td);
 mcrypt_module_close($td);
 }
 
 if (strncmp($p_t, $plain_text, strlen($plain_text)) == 0)
     {
   return true;
 } else {
   return false;
     }
 }

function my_encrypt($string,$key,$algo,$mode,$rand) {
  srand((double) microtime() * 1000000);
 
  $td = mcrypt_module_open($algo, \'\',$mode, \'\');
  $key = substr($key, 0, mcrypt_enc_get_key_size($td));
  $iv_size = mcrypt_enc_get_iv_size($td);
 if ($iv_size!=0)
    {
  $iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
    }
     if (mcrypt_generic_init($td, $key, $iv) != -1)
 {
     $c_t = mcrypt_generic($td, $string);
     mcrypt_generic_deinit($td);
     mcrypt_module_close($td);
       $c_t = $iv.$c_t;
       return $c_t;
   }
}

function my_decrypt($string,$key,$algo,$mode) {
 
  $td = mcrypt_module_open($algo, \'\',$mode, \'\');
  $key = substr($key, 0, mcrypt_enc_get_key_size($td));
  $iv_size = mcrypt_enc_get_iv_size($td);
    if ($iv_size!=0):
  $iv = substr($string,0,$iv_size);
    endif;

  $string = substr($string,$iv_size);
    if (mcrypt_generic_init($td, $key, $iv) != -1):
  $c_t = mdecrypt_generic($td, $string);
  mcrypt_generic_deinit($td);
  mcrypt_module_close($td);
       return $c_t;
    endif;
}

echo table (@mcrypt_check_sanity().spacer().show().spacer().checksum());

Название: libmcrypt-помгите новичку плиз :(
Отправлено: CGVictor от 15 Апреля 2006, 12:21:21
[moderatorial]
Разбираешь код на алгоритм, убираешь из него всё лишнее (html в первую очередь), оставляешь объем примерно страницы и создаешь новую тему. Описываешь, что на входе, что должно получиться и что должно происходить. Словами.
Тема закрыта.