<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/filters.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'uk',
  ),
  'this' => 
  array (
    0 => 'filters.encryption.php',
    1 => 'Шифрувальні фільтри',
    2 => 'Шифрувальні фільтри',
  ),
  'up' => 
  array (
    0 => 'filters.php',
    1 => 'Список доступних фільтрів',
  ),
  'prev' => 
  array (
    0 => 'filters.compression.php',
    1 => 'Фільтри для стиснення',
  ),
  'next' => 
  array (
    0 => 'transports.php',
    1 => 'Перелік підтримуваних транспортних протоколів у сокетах',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'uk',
    'path' => 'appendices/filters.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="filters.encryption" class="section">
  <h2 class="title">Шифрувальні фільтри</h2>

  <p class="para">
    Шифрувальні фільтри особливо корисні для шифрування файлу чи потоку.
  </p>

  <div class="section" id="filters.encryption.mcrypt">
   <h2 class="title">mcrypt.* та mdecrypt.*</h2>
   <p class="para">
     <div class="warning"><strong class="warning">Увага</strong><p class="simpara">Цей функціонал
<em>ЗАСТАРІВ</em>, починаючи з PHP 7.1.0. Вкрай не рекомендується на
нього покладатися.</p></div>
   </p>

   <p class="simpara">
    <code class="literal">mcrypt.*</code> та <code class="literal">mdecrypt.*</code> забезпечують
    симетричне шифрування та дешифрування за допомогою libmcrypt. Обидва
    набори фільтрів підтримують ті самі алгоритми, що й
    <a href="ref.mcrypt.php" class="link">розширення mcrypt</a>. Записуються вони так:
    <code class="literal">mcrypt.ciphername</code>, де <code class="parameter">ciphername</code>
    — це назва шифру, що може бути параметром до
    <span class="function"><a href="function.mcrypt-module-open.php" class="function">mcrypt_module_open()</a></span>. Також доступні п&#039;ять параметрів
    фільтра, що записані нижче:
   </p>

   <p class="para">
    <table class="doctable table">
     <caption><strong>Параметри фільтра mcrypt</strong></caption>
     
      <thead>
       <tr>
        <th>Параметр</th>
        <th>Обов&#039;язковий?</th>
        <th>Початкове значення</th>
        <th>Приклади значень</th>
       </tr>

      </thead>

      <tbody class="tbody">
       <tr>
        <td>mode</td>
        <td>Необов&#039;язковий</td>
        <td>cbc</td>
        <td>cbc, cfb, ecb, nofb, ofb, stream</td>
       </tr>

       <tr>
        <td>algorithms_dir</td>
        <td>Необов&#039;язковий</td>
        <td>ini_get(&#039;mcrypt.algorithms_dir&#039;)</td>
        <td>Розташування модулів алгоритмів</td>
       </tr>

       <tr>
        <td>modes_dir</td>
        <td>Необов&#039;язковий</td>
        <td>ini_get(&#039;mcrypt.modes_dir&#039;)</td>
        <td>Розташування модулів режимів</td>
       </tr>

       <tr>
        <td>iv</td>
        <td>Обов&#039;язковий</td>
        <td>Немає</td>
        <td>
          Типово 8, 16 чи 32 байта дівйкових даних. Залежно від шифру
        </td>
       </tr>

       <tr>
        <td>key</td>
        <td>Обов&#039;язковий</td>
        <td>Немає</td>
        <td>
          Типово 8, 16 чи 32 байта дівйкових даних. Залежно від шифру
        </td>
       </tr>

      </tbody>
     
    </table>

   </p>

   <div class="example" id="example-1">
    <p><strong>Приклад #1 Шифрування з Blowfish</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//Передбачається, що $key був створений раніше<br /></span><span style="color: #0000BB">$iv_size </span><span style="color: #007700">= </span><span style="color: #0000BB">mcrypt_get_iv_size</span><span style="color: #007700">(</span><span style="color: #0000BB">MCRYPT_BLOWFISH</span><span style="color: #007700">, </span><span style="color: #0000BB">MCRYPT_MODE_CBC</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$iv </span><span style="color: #007700">= </span><span style="color: #0000BB">mcrypt_create_iv</span><span style="color: #007700">(</span><span style="color: #0000BB">$iv_size</span><span style="color: #007700">, </span><span style="color: #0000BB">MCRYPT_DEV_URANDOM</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'encrypted-file.enc'</span><span style="color: #007700">, </span><span style="color: #DD0000">'wb'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">$iv</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$opts </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'mode'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'cbc'</span><span style="color: #007700">,</span><span style="color: #DD0000">'iv'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">$iv</span><span style="color: #007700">, </span><span style="color: #DD0000">'key'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">$key</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">stream_filter_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">'mcrypt.blowfish'</span><span style="color: #007700">, </span><span style="color: #0000BB">STREAM_FILTER_WRITE</span><span style="color: #007700">, </span><span style="color: #0000BB">$opts</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">'message to encrypt'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">//Розшифрування...<br /></span><span style="color: #0000BB">$fp </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'encrypted-file.enc'</span><span style="color: #007700">, </span><span style="color: #DD0000">'rb'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$iv </span><span style="color: #007700">= </span><span style="color: #0000BB">fread</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">$iv_size </span><span style="color: #007700">= </span><span style="color: #0000BB">mcrypt_get_iv_size</span><span style="color: #007700">(</span><span style="color: #0000BB">MCRYPT_BLOWFISH</span><span style="color: #007700">, </span><span style="color: #0000BB">MCRYPT_MODE_CBC</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">$opts </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'mode'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'cbc'</span><span style="color: #007700">,</span><span style="color: #DD0000">'iv'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">$iv</span><span style="color: #007700">, </span><span style="color: #DD0000">'key'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">$key</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">stream_filter_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #DD0000">'mdecrypt.blowfish'</span><span style="color: #007700">, </span><span style="color: #0000BB">STREAM_FILTER_READ</span><span style="color: #007700">, </span><span style="color: #0000BB">$opts</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">rtrim</span><span style="color: #007700">(</span><span style="color: #0000BB">stream_get_contents</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">)); </span><span style="color: #FF8000">//Обрізає порожній відступ<br /></span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br />echo </span><span style="color: #0000BB">$data</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <div class="example" id="example-2">
    <p><strong>Приклад #2 Зашифровування файлу за допомогою AES-128 CBC з SHA256 HMAC</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />AES_CBC</span><span style="color: #007700">::</span><span style="color: #0000BB">encryptFile</span><span style="color: #007700">(</span><span style="color: #0000BB">$password</span><span style="color: #007700">, </span><span style="color: #DD0000">"plaintext.txt"</span><span style="color: #007700">, </span><span style="color: #DD0000">"encrypted.enc"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">AES_CBC</span><span style="color: #007700">::</span><span style="color: #0000BB">decryptFile</span><span style="color: #007700">(</span><span style="color: #0000BB">$password</span><span style="color: #007700">, </span><span style="color: #DD0000">"encrypted.enc"</span><span style="color: #007700">, </span><span style="color: #DD0000">"decrypted.txt"</span><span style="color: #007700">);<br /><br />class </span><span style="color: #0000BB">AES_CBC<br /></span><span style="color: #007700">{<br />   protected static </span><span style="color: #0000BB">$KEY_SIZES </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'AES-128'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">16</span><span style="color: #007700">,</span><span style="color: #DD0000">'AES-192'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">24</span><span style="color: #007700">,</span><span style="color: #DD0000">'AES-256'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">32</span><span style="color: #007700">);<br />   protected static function </span><span style="color: #0000BB">key_size</span><span style="color: #007700">() { return </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$KEY_SIZES</span><span style="color: #007700">[</span><span style="color: #DD0000">'AES-128'</span><span style="color: #007700">]; } </span><span style="color: #FF8000">//початковий AES-128<br />   </span><span style="color: #007700">public static function </span><span style="color: #0000BB">encryptFile</span><span style="color: #007700">(</span><span style="color: #0000BB">$password</span><span style="color: #007700">, </span><span style="color: #0000BB">$input_stream</span><span style="color: #007700">, </span><span style="color: #0000BB">$aes_filename</span><span style="color: #007700">){<br />      </span><span style="color: #0000BB">$iv_size </span><span style="color: #007700">= </span><span style="color: #0000BB">mcrypt_get_iv_size</span><span style="color: #007700">(</span><span style="color: #0000BB">MCRYPT_RIJNDAEL_128</span><span style="color: #007700">, </span><span style="color: #0000BB">MCRYPT_MODE_CBC</span><span style="color: #007700">);<br />      </span><span style="color: #0000BB">$fin </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #0000BB">$input_stream</span><span style="color: #007700">, </span><span style="color: #DD0000">"rb"</span><span style="color: #007700">);<br />      </span><span style="color: #0000BB">$fc </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #0000BB">$aes_filename</span><span style="color: #007700">, </span><span style="color: #DD0000">"wb+"</span><span style="color: #007700">);<br />      if (!empty(</span><span style="color: #0000BB">$fin</span><span style="color: #007700">) &amp;&amp; !empty(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">)) {<br />         </span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">, </span><span style="color: #0000BB">str_repeat</span><span style="color: #007700">(</span><span style="color: #DD0000">"_"</span><span style="color: #007700">, </span><span style="color: #0000BB">32</span><span style="color: #007700">) );</span><span style="color: #FF8000">//заповнювач, SHA256 HMAC з'явиться тут пізніше<br />         </span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">, </span><span style="color: #0000BB">$hmac_salt </span><span style="color: #007700">= </span><span style="color: #0000BB">mcrypt_create_iv</span><span style="color: #007700">(</span><span style="color: #0000BB">$iv_size</span><span style="color: #007700">, </span><span style="color: #0000BB">MCRYPT_DEV_URANDOM</span><span style="color: #007700">));<br />         </span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">, </span><span style="color: #0000BB">$esalt </span><span style="color: #007700">= </span><span style="color: #0000BB">mcrypt_create_iv</span><span style="color: #007700">(</span><span style="color: #0000BB">$iv_size</span><span style="color: #007700">, </span><span style="color: #0000BB">MCRYPT_DEV_URANDOM</span><span style="color: #007700">));<br />         </span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">, </span><span style="color: #0000BB">$iv </span><span style="color: #007700">= </span><span style="color: #0000BB">mcrypt_create_iv</span><span style="color: #007700">(</span><span style="color: #0000BB">$iv_size</span><span style="color: #007700">, </span><span style="color: #0000BB">MCRYPT_DEV_URANDOM</span><span style="color: #007700">));<br />         </span><span style="color: #0000BB">$ekey </span><span style="color: #007700">= </span><span style="color: #0000BB">hash_pbkdf2</span><span style="color: #007700">(</span><span style="color: #DD0000">"sha256"</span><span style="color: #007700">, </span><span style="color: #0000BB">$password</span><span style="color: #007700">, </span><span style="color: #0000BB">$esalt</span><span style="color: #007700">, </span><span style="color: #0000BB">$it</span><span style="color: #007700">=</span><span style="color: #0000BB">1000</span><span style="color: #007700">, </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">key_size</span><span style="color: #007700">(), </span><span style="color: #0000BB">$raw</span><span style="color: #007700">=</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />         </span><span style="color: #0000BB">$opts </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'mode'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'cbc'</span><span style="color: #007700">, </span><span style="color: #DD0000">'iv'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">$iv</span><span style="color: #007700">, </span><span style="color: #DD0000">'key'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">$ekey</span><span style="color: #007700">);<br />         </span><span style="color: #0000BB">stream_filter_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">, </span><span style="color: #DD0000">'mcrypt.rijndael-128'</span><span style="color: #007700">, </span><span style="color: #0000BB">STREAM_FILTER_WRITE</span><span style="color: #007700">, </span><span style="color: #0000BB">$opts</span><span style="color: #007700">);<br />         </span><span style="color: #0000BB">$infilesize </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />         while (!</span><span style="color: #0000BB">feof</span><span style="color: #007700">(</span><span style="color: #0000BB">$fin</span><span style="color: #007700">)) {<br />            </span><span style="color: #0000BB">$block </span><span style="color: #007700">= </span><span style="color: #0000BB">fread</span><span style="color: #007700">(</span><span style="color: #0000BB">$fin</span><span style="color: #007700">, </span><span style="color: #0000BB">8192</span><span style="color: #007700">);<br />            </span><span style="color: #0000BB">$infilesize</span><span style="color: #007700">+=</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$block</span><span style="color: #007700">);<br />            </span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">, </span><span style="color: #0000BB">$block</span><span style="color: #007700">);<br />         }<br />         </span><span style="color: #0000BB">$block_size </span><span style="color: #007700">= </span><span style="color: #0000BB">mcrypt_get_block_size</span><span style="color: #007700">(</span><span style="color: #0000BB">MCRYPT_RIJNDAEL_128</span><span style="color: #007700">, </span><span style="color: #0000BB">MCRYPT_MODE_CBC</span><span style="color: #007700">);<br />         </span><span style="color: #0000BB">$padding </span><span style="color: #007700">= </span><span style="color: #0000BB">$block_size </span><span style="color: #007700">- (</span><span style="color: #0000BB">$infilesize </span><span style="color: #007700">% </span><span style="color: #0000BB">$block_size</span><span style="color: #007700">);</span><span style="color: #FF8000">//$padding є числом в діапазоні 1-16<br />         </span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">, </span><span style="color: #0000BB">str_repeat</span><span style="color: #007700">(</span><span style="color: #0000BB">chr</span><span style="color: #007700">(</span><span style="color: #0000BB">$padding</span><span style="color: #007700">), </span><span style="color: #0000BB">$padding</span><span style="color: #007700">) );</span><span style="color: #FF8000">//виконує PKCS7-доповнення<br />         </span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fin</span><span style="color: #007700">);<br />         </span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">);<br />         </span><span style="color: #0000BB">$hmac_raw </span><span style="color: #007700">= </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">calculate_hmac_after_32bytes</span><span style="color: #007700">(</span><span style="color: #0000BB">$password</span><span style="color: #007700">, </span><span style="color: #0000BB">$hmac_salt</span><span style="color: #007700">, </span><span style="color: #0000BB">$aes_filename</span><span style="color: #007700">);<br />         </span><span style="color: #0000BB">$fc </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #0000BB">$aes_filename</span><span style="color: #007700">, </span><span style="color: #DD0000">"rb+"</span><span style="color: #007700">);<br />         </span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">, </span><span style="color: #0000BB">$hmac_raw</span><span style="color: #007700">);</span><span style="color: #FF8000">//перезаписує заповнювач<br />         </span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">);<br />      }<br />   }<br />   public static function </span><span style="color: #0000BB">decryptFile</span><span style="color: #007700">(</span><span style="color: #0000BB">$password</span><span style="color: #007700">, </span><span style="color: #0000BB">$aes_filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$out_stream</span><span style="color: #007700">) {<br />      </span><span style="color: #0000BB">$iv_size </span><span style="color: #007700">= </span><span style="color: #0000BB">mcrypt_get_iv_size</span><span style="color: #007700">(</span><span style="color: #0000BB">MCRYPT_RIJNDAEL_128</span><span style="color: #007700">, </span><span style="color: #0000BB">MCRYPT_MODE_CBC</span><span style="color: #007700">);<br />      </span><span style="color: #0000BB">$hmac_raw </span><span style="color: #007700">= </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #0000BB">$aes_filename</span><span style="color: #007700">, </span><span style="color: #0000BB">false</span><span style="color: #007700">, </span><span style="color: #0000BB">NULL</span><span style="color: #007700">,  </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">32</span><span style="color: #007700">);<br />      </span><span style="color: #0000BB">$hmac_salt </span><span style="color: #007700">= </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #0000BB">$aes_filename</span><span style="color: #007700">, </span><span style="color: #0000BB">false</span><span style="color: #007700">, </span><span style="color: #0000BB">NULL</span><span style="color: #007700">, </span><span style="color: #0000BB">32</span><span style="color: #007700">, </span><span style="color: #0000BB">$iv_size</span><span style="color: #007700">);<br />      </span><span style="color: #0000BB">$hmac_calc </span><span style="color: #007700">= </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">calculate_hmac_after_32bytes</span><span style="color: #007700">(</span><span style="color: #0000BB">$password</span><span style="color: #007700">, </span><span style="color: #0000BB">$hmac_salt</span><span style="color: #007700">, </span><span style="color: #0000BB">$aes_filename</span><span style="color: #007700">);<br />      </span><span style="color: #0000BB">$fc </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #0000BB">$aes_filename</span><span style="color: #007700">, </span><span style="color: #DD0000">"rb"</span><span style="color: #007700">);<br />      </span><span style="color: #0000BB">$fout </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #0000BB">$out_stream</span><span style="color: #007700">, </span><span style="color: #DD0000">'wb'</span><span style="color: #007700">);<br />      if (!empty(</span><span style="color: #0000BB">$fout</span><span style="color: #007700">) &amp;&amp; !empty(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">) &amp;&amp; </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">hash_equals</span><span style="color: #007700">(</span><span style="color: #0000BB">$hmac_raw</span><span style="color: #007700">,</span><span style="color: #0000BB">$hmac_calc</span><span style="color: #007700">)) {<br />         </span><span style="color: #0000BB">fread</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">, </span><span style="color: #0000BB">32</span><span style="color: #007700">+</span><span style="color: #0000BB">$iv_size</span><span style="color: #007700">);</span><span style="color: #FF8000">//пропуск sha256 hmac та сіль<br />         </span><span style="color: #0000BB">$esalt </span><span style="color: #007700">= </span><span style="color: #0000BB">fread</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">, </span><span style="color: #0000BB">$iv_size</span><span style="color: #007700">);<br />         </span><span style="color: #0000BB">$iv    </span><span style="color: #007700">= </span><span style="color: #0000BB">fread</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">, </span><span style="color: #0000BB">$iv_size</span><span style="color: #007700">);<br />         </span><span style="color: #0000BB">$ekey </span><span style="color: #007700">= </span><span style="color: #0000BB">hash_pbkdf2</span><span style="color: #007700">(</span><span style="color: #DD0000">"sha256"</span><span style="color: #007700">, </span><span style="color: #0000BB">$password</span><span style="color: #007700">, </span><span style="color: #0000BB">$esalt</span><span style="color: #007700">, </span><span style="color: #0000BB">$it</span><span style="color: #007700">=</span><span style="color: #0000BB">1000</span><span style="color: #007700">, </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">key_size</span><span style="color: #007700">(), </span><span style="color: #0000BB">$raw</span><span style="color: #007700">=</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />         </span><span style="color: #0000BB">$opts </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'mode'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'cbc'</span><span style="color: #007700">, </span><span style="color: #DD0000">'iv'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">$iv</span><span style="color: #007700">, </span><span style="color: #DD0000">'key'</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">$ekey</span><span style="color: #007700">);<br />         </span><span style="color: #0000BB">stream_filter_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">, </span><span style="color: #DD0000">'mdecrypt.rijndael-128'</span><span style="color: #007700">, </span><span style="color: #0000BB">STREAM_FILTER_READ</span><span style="color: #007700">, </span><span style="color: #0000BB">$opts</span><span style="color: #007700">);<br />         while (!</span><span style="color: #0000BB">feof</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">)) {<br />            </span><span style="color: #0000BB">$block </span><span style="color: #007700">= </span><span style="color: #0000BB">fread</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">, </span><span style="color: #0000BB">8192</span><span style="color: #007700">);<br />            if (</span><span style="color: #0000BB">feof</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">)) {<br />               </span><span style="color: #0000BB">$padding </span><span style="color: #007700">= </span><span style="color: #0000BB">ord</span><span style="color: #007700">(</span><span style="color: #0000BB">$block</span><span style="color: #007700">[</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$block</span><span style="color: #007700">) - </span><span style="color: #0000BB">1</span><span style="color: #007700">]);</span><span style="color: #FF8000">//припускається PKCS7-доповнення<br />               </span><span style="color: #0000BB">$block </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$block</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">-</span><span style="color: #0000BB">$padding</span><span style="color: #007700">);<br />            }<br />            </span><span style="color: #0000BB">fwrite</span><span style="color: #007700">(</span><span style="color: #0000BB">$fout</span><span style="color: #007700">, </span><span style="color: #0000BB">$block</span><span style="color: #007700">);<br />         }<br />         </span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fout</span><span style="color: #007700">);<br />         </span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$fc</span><span style="color: #007700">);<br />      }<br />   }<br />   private static function </span><span style="color: #0000BB">hash_equals</span><span style="color: #007700">(</span><span style="color: #0000BB">$str1</span><span style="color: #007700">, </span><span style="color: #0000BB">$str2</span><span style="color: #007700">) {<br />      if(</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$str1</span><span style="color: #007700">) == </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$str2</span><span style="color: #007700">)) {<br />         </span><span style="color: #0000BB">$res </span><span style="color: #007700">= </span><span style="color: #0000BB">$str1 </span><span style="color: #007700">^ </span><span style="color: #0000BB">$str2</span><span style="color: #007700">;<br />         for(</span><span style="color: #0000BB">$ret</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">,</span><span style="color: #0000BB">$i </span><span style="color: #007700">= </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">) - </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #0000BB">$i </span><span style="color: #007700">&gt;= </span><span style="color: #0000BB">0</span><span style="color: #007700">; </span><span style="color: #0000BB">$i</span><span style="color: #007700">--) </span><span style="color: #0000BB">$ret </span><span style="color: #007700">|= </span><span style="color: #0000BB">ord</span><span style="color: #007700">(</span><span style="color: #0000BB">$res</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">]);<br />         return !</span><span style="color: #0000BB">$ret</span><span style="color: #007700">;<br />      }<br />      return </span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />   }<br />   private static function </span><span style="color: #0000BB">calculate_hmac_after_32bytes</span><span style="color: #007700">(</span><span style="color: #0000BB">$password</span><span style="color: #007700">, </span><span style="color: #0000BB">$hsalt</span><span style="color: #007700">, </span><span style="color: #0000BB">$filename</span><span style="color: #007700">) {<br />      static </span><span style="color: #0000BB">$init</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />      </span><span style="color: #0000BB">$init </span><span style="color: #007700">or </span><span style="color: #0000BB">$init </span><span style="color: #007700">= </span><span style="color: #0000BB">stream_filter_register</span><span style="color: #007700">(</span><span style="color: #DD0000">"user-filter.skipfirst32bytes"</span><span style="color: #007700">, </span><span style="color: #DD0000">"FileSkip32Bytes"</span><span style="color: #007700">);<br />      </span><span style="color: #0000BB">$stream </span><span style="color: #007700">= </span><span style="color: #DD0000">'php://filter/read=user-filter.skipfirst32bytes/resource=' </span><span style="color: #007700">. </span><span style="color: #0000BB">$filename</span><span style="color: #007700">;<br />      </span><span style="color: #0000BB">$hkey </span><span style="color: #007700">= </span><span style="color: #0000BB">hash_pbkdf2</span><span style="color: #007700">(</span><span style="color: #DD0000">"sha256"</span><span style="color: #007700">, </span><span style="color: #0000BB">$password</span><span style="color: #007700">, </span><span style="color: #0000BB">$hsalt</span><span style="color: #007700">, </span><span style="color: #0000BB">$iterations</span><span style="color: #007700">=</span><span style="color: #0000BB">1000</span><span style="color: #007700">, </span><span style="color: #0000BB">24</span><span style="color: #007700">, </span><span style="color: #0000BB">$raw</span><span style="color: #007700">=</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />      return </span><span style="color: #0000BB">hash_hmac_file</span><span style="color: #007700">(</span><span style="color: #DD0000">'sha256'</span><span style="color: #007700">, </span><span style="color: #0000BB">$stream</span><span style="color: #007700">, </span><span style="color: #0000BB">$hkey</span><span style="color: #007700">, </span><span style="color: #0000BB">$raw</span><span style="color: #007700">=</span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />   }<br />}<br />class </span><span style="color: #0000BB">FileSkip32Bytes </span><span style="color: #007700">extends </span><span style="color: #0000BB">php_user_filter<br /></span><span style="color: #007700">{<br />   private </span><span style="color: #0000BB">$skipped</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />   function </span><span style="color: #0000BB">filter</span><span style="color: #007700">(</span><span style="color: #0000BB">$in</span><span style="color: #007700">, </span><span style="color: #0000BB">$out</span><span style="color: #007700">, &amp;</span><span style="color: #0000BB">$consumed</span><span style="color: #007700">, </span><span style="color: #0000BB">$closing</span><span style="color: #007700">)  {<br />      while (</span><span style="color: #0000BB">$bucket </span><span style="color: #007700">= </span><span style="color: #0000BB">stream_bucket_make_writeable</span><span style="color: #007700">(</span><span style="color: #0000BB">$in</span><span style="color: #007700">)) {<br />         </span><span style="color: #0000BB">$outlen </span><span style="color: #007700">= </span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">datalen</span><span style="color: #007700">;<br />         if (</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">skipped</span><span style="color: #007700">&lt;</span><span style="color: #0000BB">32</span><span style="color: #007700">){<br />            </span><span style="color: #0000BB">$outlen </span><span style="color: #007700">= </span><span style="color: #0000BB">min</span><span style="color: #007700">(</span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">datalen</span><span style="color: #007700">,</span><span style="color: #0000BB">32</span><span style="color: #007700">-</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">skipped</span><span style="color: #007700">);<br />            </span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">data </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">data</span><span style="color: #007700">, </span><span style="color: #0000BB">$outlen</span><span style="color: #007700">);<br />            </span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">datalen </span><span style="color: #007700">= </span><span style="color: #0000BB">$bucket</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">datalen</span><span style="color: #007700">-</span><span style="color: #0000BB">$outlen</span><span style="color: #007700">;<br />            </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">skipped</span><span style="color: #007700">+=</span><span style="color: #0000BB">$outlen</span><span style="color: #007700">;<br />         }<br />         </span><span style="color: #0000BB">$consumed </span><span style="color: #007700">+= </span><span style="color: #0000BB">$outlen</span><span style="color: #007700">;<br />         </span><span style="color: #0000BB">stream_bucket_append</span><span style="color: #007700">(</span><span style="color: #0000BB">$out</span><span style="color: #007700">, </span><span style="color: #0000BB">$bucket</span><span style="color: #007700">);<br />      }<br />      return </span><span style="color: #0000BB">PSFS_PASS_ON</span><span style="color: #007700">;<br />   }<br />}<br />class </span><span style="color: #0000BB">AES_128_CBC </span><span style="color: #007700">extends </span><span style="color: #0000BB">AES_CBC </span><span style="color: #007700">{<br />   protected static function </span><span style="color: #0000BB">key_size</span><span style="color: #007700">() { return </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$KEY_SIZES</span><span style="color: #007700">[</span><span style="color: #DD0000">'AES-128'</span><span style="color: #007700">]; }<br />}<br />class </span><span style="color: #0000BB">AES_192_CBC </span><span style="color: #007700">extends </span><span style="color: #0000BB">AES_CBC </span><span style="color: #007700">{<br />   protected static function </span><span style="color: #0000BB">key_size</span><span style="color: #007700">() { return </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$KEY_SIZES</span><span style="color: #007700">[</span><span style="color: #DD0000">'AES-192'</span><span style="color: #007700">]; }<br />}<br />class </span><span style="color: #0000BB">AES_256_CBC </span><span style="color: #007700">extends </span><span style="color: #0000BB">AES_CBC </span><span style="color: #007700">{<br />   protected static function </span><span style="color: #0000BB">key_size</span><span style="color: #007700">() { return </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$KEY_SIZES</span><span style="color: #007700">[</span><span style="color: #DD0000">'AES-256'</span><span style="color: #007700">]; }<br />}</span></span></code></div>
    </div>

   </div>
  </div>
 </div><?php manual_footer($setup); ?>