{"id":202210,"date":"2013-11-15T08:26:03","date_gmt":"2013-11-15T04:26:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=202210"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=202210","title":{"rendered":"<span class=\"post_title\">\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0439\u0442\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043c\u0430: \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f HC-128<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/66e\/14a\/cc7\/66e14acc7acd02c6ff5b32de98efa873.png\" align=\"right\"\/><br \/>  <a href=\"http:\/\/www.ecrypt.eu.org\/stream\/p3ciphers\/hc\/hc128_p3.pdf\">HC-128<\/a> (pdf) \u2014 <a href=\"http:\/\/www.ecrypt.eu.org\/stream\/hcp3.html\">\u0444\u0438\u043d\u0430\u043b\u0438\u0441\u0442 <\/a>\u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <a href=\"http:\/\/ru.wikipedia.org\/wiki\/ESTREAM\">eSTREAM<\/a>, \u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u0448\u0438\u0444\u0440 \u0441 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c<br \/>  (2 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e 512 32\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u043b\u043e\u0432). \u041e\u043d \u043e\u0447\u0435\u043d\u044c \u0448\u0443\u0441\u0442\u0440\u044b\u0439 \u0435\u0441\u043b\u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438, \u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d \u0432 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u0421\u043f\u0440\u0430\u0432\u0430 6 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043d\u0451\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f. \u041e\u043d \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u043c\u0438 \u0434\u043b\u0438\u043d\u043d\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442, \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f (\u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c) \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439. \u041d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0451 \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u0435\u043d\u044f \u0437\u0430\u0446\u0435\u043f\u0438\u043b\u0438 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 f1 \u0438 f2<br \/>  <a name=\"habracut\"><\/a><\/p>\n<p>  \u0412\u043e\u0442 \u0441\u043e\u0440\u0435\u0446, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0432\u0437\u044f\u0442 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 BouncyCastle<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">HC-128<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package org.bouncycastle.crypto.engines;  import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.DataLengthException; import org.bouncycastle.crypto.StreamCipher; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.crypto.params.ParametersWithIV;  \/**  * HC-128 is a software-efficient stream cipher created by Hongjun Wu. It  * generates keystream from a 128-bit secret key and a 128-bit initialization  * vector.  * &lt;p&gt;  * http:\/\/www.ecrypt.eu.org\/stream\/p3ciphers\/hc\/hc128_p3.pdf  * &lt;\/p&gt;&lt;p&gt;  * It is a third phase candidate in the eStream contest, and is patent-free.  * No attacks are known as of today (April 2007). See  *  * http:\/\/www.ecrypt.eu.org\/stream\/hcp3.html  * &lt;\/p&gt;  *\/ public class HC128Engine     implements StreamCipher {     private int[] p = new int[512];     private int[] q = new int[512];     private int cnt = 0;      private static int f1(int x)     {         return rotateRight(x, 7) ^ rotateRight(x, 18)             ^ (x &gt;&gt;&gt; 3);     }      private static int f2(int x)     {         return rotateRight(x, 17) ^ rotateRight(x, 19)             ^ (x &gt;&gt;&gt; 10);     }      private int g1(int x, int y, int z)     {         return (rotateRight(x, 10) ^ rotateRight(z, 23))             + rotateRight(y, 8);     }      private int g2(int x, int y, int z)     {         return (rotateLeft(x, 10) ^ rotateLeft(z, 23)) + rotateLeft(y, 8);     }      private static int rotateLeft(         int     x,         int     bits)     {         return (x &lt;&lt; bits) | (x &gt;&gt;&gt; -bits);     }      private static int rotateRight(         int     x,         int     bits)     {         return (x &gt;&gt;&gt; bits) | (x &lt;&lt; -bits);     }      private int h1(int x)     {         return q[x & 0xFF] + q[((x &gt;&gt; 16) & 0xFF) + 256];     }      private int h2(int x)     {         return p[x & 0xFF] + p[((x &gt;&gt; 16) & 0xFF) + 256];     }      private static int mod1024(int x)     {         return x & 0x3FF;     }      private static int mod512(int x)     {         return x & 0x1FF;     }      private static int dim(int x, int y)     {         return mod512(x - y);     }      private int step()     {         int j = mod512(cnt);         int ret;         if (cnt &lt; 512)         {             p[j] += g1(p[dim(j, 3)], p[dim(j, 10)], p[dim(j, 511)]);             ret = h1(p[dim(j, 12)]) ^ p[j];         }         else         {             q[j] += g2(q[dim(j, 3)], q[dim(j, 10)], q[dim(j, 511)]);             ret = h2(q[dim(j, 12)]) ^ q[j];         }         cnt = mod1024(cnt + 1);         return ret;     }      private byte[] key, iv;     private boolean initialised;      private void init()     {         if (key.length != 16)         {             throw new java.lang.IllegalArgumentException(                 &quot;The key must be 128 bits long&quot;);         }          cnt = 0;          int[] w = new int[1280];          for (int i = 0; i &lt; 16; i++)         {             w[i &gt;&gt; 2] |= (key[i] & 0xff) &lt;&lt; (8 * (i & 0x3));         }         System.arraycopy(w, 0, w, 4, 4);          for (int i = 0; i &lt; iv.length && i &lt; 16; i++)         {             w[(i &gt;&gt; 2) + 8] |= (iv[i] & 0xff) &lt;&lt; (8 * (i & 0x3));         }         System.arraycopy(w, 8, w, 12, 4);          for (int i = 16; i &lt; 1280; i++)         {             w[i] = f2(w[i - 2]) + w[i - 7] + f1(w[i - 15]) + w[i - 16] + i;         }          System.arraycopy(w, 256, p, 0, 512);         System.arraycopy(w, 768, q, 0, 512);          for (int i = 0; i &lt; 512; i++)         {             p[i] = step();         }         for (int i = 0; i &lt; 512; i++)         {             q[i] = step();         }          cnt = 0;     }      public String getAlgorithmName()     {         return &quot;HC-128&quot;;     }      \/**      * Initialise a HC-128 cipher.      *      * @param forEncryption whether or not we are for encryption. Irrelevant, as      *                      encryption and decryption are the same.      * @param params        the parameters required to set up the cipher.      * @throws IllegalArgumentException if the params argument is      *                                  inappropriate (ie. the key is not 128 bit long).      *\/     public void init(boolean forEncryption, CipherParameters params)         throws IllegalArgumentException     {         CipherParameters keyParam = params;          if (params instanceof ParametersWithIV)         {             iv = ((ParametersWithIV)params).getIV();             keyParam = ((ParametersWithIV)params).getParameters();         }         else         {             iv = new byte[0];         }          if (keyParam instanceof KeyParameter)         {             key = ((KeyParameter)keyParam).getKey();             init();         }         else         {             throw new IllegalArgumentException(                 &quot;Invalid parameter passed to HC128 init - &quot;                     + params.getClass().getName());         }          initialised = true;     }      private byte[] buf = new byte[4];     private int idx = 0;      private byte getByte()     {         if (idx == 0)         {             int step = step();             buf[0] = (byte)(step & 0xFF);             step &gt;&gt;= 8;             buf[1] = (byte)(step & 0xFF);             step &gt;&gt;= 8;             buf[2] = (byte)(step & 0xFF);             step &gt;&gt;= 8;             buf[3] = (byte)(step & 0xFF);         }         byte ret = buf[idx];         idx = idx + 1 & 0x3;         return ret;     }      public void processBytes(byte[] in, int inOff, int len, byte[] out,                              int outOff) throws DataLengthException     {         if (!initialised)         {             throw new IllegalStateException(getAlgorithmName()                 + &quot; not initialised&quot;);         }          if ((inOff + len) &gt; in.length)         {             throw new DataLengthException(&quot;input buffer too short&quot;);         }          if ((outOff + len) &gt; out.length)         {             throw new DataLengthException(&quot;output buffer too short&quot;);         }          for (int i = 0; i &lt; len; i++)         {             out[outOff + i] = (byte)(in[inOff + i] ^ getByte());         }     }      public void reset()     {         idx = 0;         init();     }      public byte returnByte(byte in)     {         return (byte)(in ^ getByte());     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u0440\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>f1<\/b> \u0438 <b>f2<\/b>\u044f \u0443\u0436\u0435 <a href=\"http:\/\/habrahabr.ru\/post\/168707\/#bonus\">\u043f\u0438\u0441\u0430\u043b<\/a> \u0440\u0430\u043d\u0435\u0435. \u0412 \u043a\u0440\u0430\u0442\u0446\u0435 \u2014 \u043e\u043d\u0438 \u0432\u0437\u044f\u0442\u044b \u0438\u0437 SHA-2 (\u043f\u0440\u0438\u0432\u0435\u0442, \u0410\u041d\u0411!) \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e 32\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0435.<\/p>\n<p>  \u041c\u0435\u043d\u044f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0432 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d\u0438 \u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0438 \u043a\u0430\u043a \u0432\u044b\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0438\u0441\u044c. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043e\u0431 \u044d\u0442\u043e\u043c \u0435\u0441\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c <b>0<\/b> \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438, \u0432\u0441\u0451 \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u0432 \u0441\u0441\u044b\u043b\u043a\u0435 \u0432\u044b\u0448\u0435. \u042f \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b \u043f\u0435\u0440\u0438\u043e\u0434 \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u043d \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043d\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u0437 \u0432\u0441\u0435\u0445 \u0438 \u044f \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043b \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0435\u0440\u0438\u043e\u0434\u0443. \u041f\u0440\u043e\u0441\u0442\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c, \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u0442\u0440\u0451\u043c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c \u0438\u0441\u043a\u0430\u043b \u0442\u0440\u043e\u0439\u043a\u0438, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0435\u0440\u0438\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439. \u041d\u0443 \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u043b, \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0440\u043e\u0435\u043a \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0441\u0447\u0435\u0442\u0430 \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u043b\u0438\u0441\u044c. \u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u0438\u0435 \u0442\u0440\u043e\u0439\u043a\u0438. <br \/>  <b>{22, 13, 3} \u0438 {18, 4, 9} <\/b> \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 <b>{7, 18, 3} \u0438 {17, 19, 10}<\/b><\/p>\n<p>  \u042f \u043d\u0435 \u0437\u043d\u0430\u044e, \u0447\u0435\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0410\u041d\u0411 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043c\u043e\u0436\u0435\u0442 \u0432 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0430, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435\u0442. \u041d\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043c\u043e\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043d\u0435 \u0445\u0443\u0436\u0435, \u0447\u0435\u043c \u0438\u0445. \u041e\u043d\u0438 \u0442\u043e\u0436\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 (\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u043f\u043e \u0432\u0441\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c 0 \u2014 (2<sup>32<\/sup>-1) ) \u0438 \u0443 \u043d\u0438\u0445 \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0446\u0438\u043a\u043b, \u0447\u0435\u043c \u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445. \u0422\u0430\u043a \u0447\u0442\u043e, \u0441\u043c\u0435\u043b\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0445 \u043d\u0430 \u043c\u043e\u0438<\/p>\n<pre><code class=\"java\">    private static int f1(int x)     {         return rotateRight(x, 22) ^ rotateRight(x, 13) ^ (x &gt;&gt;&gt; 3);     }      private static int f2(int x)     {         return rotateRight(x, 18) ^ rotateRight(x, 4) ^ (x &gt;&gt;&gt; 9);     } <\/code><\/pre>\n<p>  C \u044d\u0442\u0438\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442. \u041c\u043d\u0435 \u043d\u0430 \u0433\u043b\u0430\u0437\u0430 \u043f\u043e\u043f\u0430\u043b\u0441\u044f <a href=\"http:\/\/eprint.iacr.org\/2010\/387.pdf\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442<\/a> \u0441 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043d\u044b\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c HC-128. \u0422\u0430\u043c \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434 \u043c\u0430\u0442\u0430\u043d\u0430, \u043d\u043e \u0447\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u2014 \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <b>h1<\/b>, <b>h2 <\/b>\u0438 <b>g1<\/b>, <b>g2<\/b> (\u0440\u0430\u0437\u0434\u0435\u043b 4)<\/p>\n<p>  \u0421\u0443\u0442\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f: \u0424\u0443\u043d\u043a\u0446\u0438\u0438 <b>h1(x)<\/b> \u0438 <b>h2(x)<\/b> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e 16 \u0431\u0438\u0442 \u0438\u0437 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0438\u043c 32. \u042d\u0442\u0438 16 \u0431\u0438\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a 2 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 ( 2\u04458) \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 <b>P<\/b> \u0438 <b>Q<\/b>. \u0410 \u043d\u0430\u0434\u043e \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 32, \u0438\u043d\u0430\u0447\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0442\u043e, \u0447\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 (\u0441\u0443\u043c\u043c\u0430 \u0434\u0432\u0443\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e 2<sup>32<\/sup>) \u043a\u0441\u043e\u0440\u0438\u043c \u0441 \u0441\u0430\u043c\u0438\u043c <b>x<\/b>. \u0412\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a (\u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435 \u0441 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0432\u044b\u0448\u0435):<\/p>\n<pre><code class=\"java\">    private int h1(int x)     {         return (q[x & 0xFF] + q[((x &gt;&gt; 16) & 0xFF) + 256]) ^ x;     }      private int h2(int x)     {         return (p[x & 0xFF] + p[((x &gt;&gt; 16) & 0xFF) + 256]) ^ x;     } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>g1(x)<\/b> \u0438 <b>g2(x)<\/b>. \u041c\u0430\u0441\u0441\u0438\u0432\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 <b>P<\/b> \u0438 <b>Q<\/b> \u0436\u0438\u0432\u0443\u0442 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043f\u0440\u0438 \u043d\u0435\u0431\u043b\u0430\u0433\u043e\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 (\u0443\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u044d\u0442\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0438 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0431\u0430\u0439\u0442) \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u043b\u043e\u0445\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u044f\u043c.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>g1<\/b> \u0438 <b>g2<\/b> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <b>P<\/b> \u0437\u0430\u0432\u0438\u0441\u0438\u043b \u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <b>Q<\/b> \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u0418 \u0432\u043c\u0435\u0441\u0442\u043e \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0434\u0432\u0438\u0433\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <b>y<\/b> \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0442 \u0438\u0437 \u0435\u0433\u043e \u043a\u0430\u043a \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 <b>Q<\/b> \u0438 <b>P<\/b>.<\/p>\n<pre><code class=\"java\">    private int g1(int x, int y, int z)     {         return (rotateRight(x, 10) ^ rotateRight(z, 23)) + Q[(y &gt;&gt; 7) & 0x1FF];     }      private int g2(int x, int y, int z)     {         return (rotateLeft(x, 10) ^ rotateLeft(z, 23)) + P[(y &gt;&gt; 7) & 0x1FF];     } <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0438 \u0432\u0441\u0451, \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043d\u0435 \u0443\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0439 (\u0430 \u043f\u043e \u0438\u0434\u0435\u0435, \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439) \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 HC-128.<\/p>\n<h4>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435<\/h4>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e \u0432\u0441\u0451 \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0441\u0447\u0435\u0442\u0443 \u0438\u0433\u0440\u044b \u0438 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u043d \u043f\u043e\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u043c \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u041d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0440\u044f\u0434\u043a\u0438 \u0434\u043b\u044f \u043c\u043e\u0437\u0433\u043e\u0432, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u00ab\u0434\u043b\u044f \u0441\u0435\u0431\u044f\u00bb \u0438 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0445\u043e\u0434\u0430 \u043e\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 \u0438 \u043f\u0430\u0442\u0435\u043d\u0442\u043e\u0432 (\u0435\u0441\u043b\u0438 \u0431\u044b HC-128 \u0431\u044b\u043b \u0437\u0430\u043f\u0430\u0442\u0435\u043d\u0442\u043e\u0432\u0430\u043d) \u0442\u0430\u043a\u0438\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 <b><i>\u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0435<\/i><\/b> \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0430\u0432\u043e \u043d\u0430 \u0436\u0438\u0437\u043d\u044c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u044f \u0445\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f (\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e \u0438\u0437 \u043f\u0430\u0440\u043e\u043b\u044f 15\u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0445\u044d\u0448(\u043f\u0430\u0440\u043e\u043b\u044c)+\u0445\u044d\u0448(\u0445\u044d\u0448(\u043f\u0430\u0440\u043e\u043b\u044c)) + (\u0445\u044d\u0448(\u043f\u0430\u0440\u043e\u043b\u044c)+\u0445\u044d\u0448(\u0445\u044d\u0448(\u043f\u0430\u0440\u043e\u043b\u044c))) \u0438 \u0442 \u0434&#8230;), \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 HC-128 \u0445\u044d\u0448\u0435\u043c \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432 \u0446\u0438\u043a\u043b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0440\u0430\u0437 \u0448\u0438\u0444\u0440\u0443\u044e \u0440\u0430\u0437\u043d\u044b\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c HC-128.<\/p>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, \u0447\u0435\u043c-\u0442\u043e \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 Sponge \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u041d\u043e \u044d\u0442\u043e \u044f \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0434\u043e\u043f\u0451\u0440. <\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0435\u0449\u0435 \u0440\u0430\u0437 \u0441\u0447\u0438\u0442\u0430\u044e \u0445\u044d\u0448 \u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u044d\u0442\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u043c \u0445\u044d\u0448\u0435\u043c \u043f\u0430\u0440\u043e\u043b\u044f. \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0431\u0440\u0443\u0442\u0444\u043e\u0440\u0441\u0438\u043b\u043a\u0443 \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u0443\u0436\u0430\u0441\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0440\u0435\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>  \u0412\u043e\u0442 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442. ObfuscatorEngine \u2014 \u044d\u0442\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 HC-128. entropy \u2014 \u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u0445\u044d\u0448\u0435\u0439, \u0430 \u043f\u043e\u0442\u043e\u043c \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0443\u0441\u043a\u0430\u043c\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445.<\/p>\n<pre><code class=\"java\">package com.paranoim.crypto.utils;  import java.util.Arrays;  import org.bouncycastle.crypto.util.Pack;  import com.paranoim.crypto.Consts; import com.paranoim.crypto.digest.SHA3_256; import com.paranoim.crypto.digest.SHA3_512; import com.paranoim.crypto.utils.obfuscator.ObfuscatorEngine;  import fr.cryptohash.DigestEngine; import fr.cryptohash.Keccak256; import fr.cryptohash.Keccak512;  \/**  * @author scratch  *  * @description this class does calculation of hash of a password but with many iterations,   * so that it would be difficult to find with brute force  *   * @created 06.08.2010  *\/ public class SlowHasher {     private static final int ITERATIONS_COUNT = 0x133ECD;     private static final int CHUNK_SIZE = 71;      public static byte[] calculateSlowHash(final String password, final byte[] salt)     {         if (salt.length != Consts.BIG_SALT_SIZE)         {             throw new IllegalArgumentException(&quot;Salt size must be &quot; + Consts.BIG_SALT_SIZE + &quot; bytes!&quot;);         }          final byte[] saltedPassword = ByteUtils.concat(salt, password.getBytes());         final byte[] hashOfSaltedPassword = SHA3_512.process(saltedPassword); \/\/ hash of (salt+password)          final ObfuscatorEngine engine = new ObfuscatorEngine(); \/\/ used to mix bytes          \/\/compute initial entropy string         final byte[] entropy = getInitialEntropy(engine, hashOfSaltedPassword, saltedPassword);         final byte[] entropyHash = SHA3_512.process(entropy);         engine.init(entropyHash); \/\/ 16 bytes used as key, 16 as iv           final int maxOffset = entropy.length - CHUNK_SIZE + 1;         int offset = (Pack.bigEndianToInt(entropyHash, 7) & 0x7FFFFFFF) % maxOffset;          \/\/ main loop         for (int i = 0; i &lt; ITERATIONS_COUNT; i++)         {             engine.processBytes(entropy, offset = (Pack.bigEndianToInt(entropy, offset) & 0x7FFFFFFF) % maxOffset, CHUNK_SIZE, entropy, offset);         }         \/\/finalization process         engine.init(SHA3_256.process(entropy));         engine.processBytes(entropy, 0, entropy.length, entropy, 0);         engine.processBytes(entropyHash, 0, entropyHash.length, entropyHash, 0);          return SHA3_256.process(ByteUtils.concat(entropyHash, entropy));     }      private static byte[] getInitialEntropy(final ObfuscatorEngine engine, final byte[] hashOfSaltedPassword, final byte[] saltedPassword)     {         \/\/final ExtendedDigest sha256 = new SHA3Digest(256);         \/\/final ExtendedDigest sha512 = new SHA3Digest(512);         final DigestEngine sha256 = new Keccak256();         final DigestEngine sha512 = new Keccak512();         final byte[] hash32 = new byte[32];         final byte[] hash64 = new byte[64];          final byte[] sp = Arrays.copyOf(saltedPassword, saltedPassword.length);         final byte[] h = Arrays.copyOf(hashOfSaltedPassword, hashOfSaltedPassword.length);          byte[] entropy = ByteUtils.concat(h, sp);          engine.init(hashOfSaltedPassword);         engine.processBytes(entropy, 0, entropy.length, entropy, 0);          for (int i = 0; i &lt; hashOfSaltedPassword.length &lt;&lt; 1; i++) \/\/ 128 iterations         {             final byte b = hashOfSaltedPassword[i &gt;&gt; 1]; \/\/ i\/2             if (((b &gt;&gt; (i & 1)) & 1) == 1) \/\/ we check 1st bit of b on even i and 2nd on odd             {                 engine.processBytes(sp, 0, sp.length, sp, 0);                 entropy = ByteUtils.concat(sp, entropy);                 hash(sha512, entropy, hash64);                 entropy = ByteUtils.concat(entropy, hash64);                 hash(sha256, entropy, hash32);                 engine.init(hash32);                 engine.processBytes(entropy, 0, entropy.length, entropy, 0);             }             else             {                 engine.processBytes(h, 0, h.length, h, 0);                 entropy = ByteUtils.concat(entropy, h);                 hash(sha512, entropy, hash64);                 entropy = ByteUtils.concat(hash64, entropy);                 hash(sha256, entropy, hash32);                 engine.init(hash32);                 engine.processBytes(entropy, 0, entropy.length, entropy, 0);             }         }         return entropy;     }      private static void hash(final DigestEngine digest, final byte[] data, final byte[] result)     {         digest.update(data, 0, data.length);         digest.digest(result, 0, result.length);     } }  <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u043f\u044f\u0442\u043d\u0438\u0447\u043d\u044b\u0439 \u044d\u0442\u044e\u0434.    \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/202210\/\"> http:\/\/habrahabr.ru\/post\/202210\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/66e\/14a\/cc7\/66e14acc7acd02c6ff5b32de98efa873.png\" align=\"right\"\/><br \/>  <a href=\"http:\/\/www.ecrypt.eu.org\/stream\/p3ciphers\/hc\/hc128_p3.pdf\">HC-128<\/a> (pdf) \u2014 <a href=\"http:\/\/www.ecrypt.eu.org\/stream\/hcp3.html\">\u0444\u0438\u043d\u0430\u043b\u0438\u0441\u0442 <\/a>\u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <a href=\"http:\/\/ru.wikipedia.org\/wiki\/ESTREAM\">eSTREAM<\/a>, \u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u0448\u0438\u0444\u0440 \u0441 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c<br \/>  (2 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e 512 32\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u043b\u043e\u0432). \u041e\u043d \u043e\u0447\u0435\u043d\u044c \u0448\u0443\u0441\u0442\u0440\u044b\u0439 \u0435\u0441\u043b\u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438, \u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d \u0432 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u0421\u043f\u0440\u0430\u0432\u0430 6 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043d\u0451\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f. \u041e\u043d \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u043c\u0438 \u0434\u043b\u0438\u043d\u043d\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442, \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f (\u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c) \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439. \u041d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0451 \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u0435\u043d\u044f \u0437\u0430\u0446\u0435\u043f\u0438\u043b\u0438 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 f1 \u0438 f2  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-202210","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/202210","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=202210"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/202210\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=202210"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=202210"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=202210"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}