{"id":354725,"date":"2024-05-20T22:54:07","date_gmt":"2024-05-20T22:54:07","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=354725"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=354725","title":{"rendered":"<span>\u0414\u0435\u043b\u0430\u0435\u043c crackme. \u0427\u0430\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u0430\u044f: whitebox AES<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/767900\/\" rel=\"noopener noreferrer nofollow\">\u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u043f\u043e\u043a\u0430\u0436\u0443, <s>\u043a\u0430\u043a\u00a0\u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u0443\u043b\u044c\u0451\u043d\u044b \u043d\u0430\u00a0\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0434\u0435\u0435!<\/s> \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0444\u0438\u0433\u043d\u044e. \u0412\u00a0\u0440\u0430\u043c\u043a\u0430\u0445 \u0446\u0438\u043a\u043b\u0430 \u0438\u0437\u00a0\u0442\u0440\u0451\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e crackme \u0434\u043b\u044f\u00a0linux amd64. \u0412\u043e\u0442 \u0434\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0447\u0435\u0440\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e crackme:<\/p>\n<ol>\n<li>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0430 \u0441\u0432\u043e\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c AES \u0441\u00a0\u0440\u0435\u0436\u0438\u043c\u043e\u043c CBC \u0438 256\u00a0\u0431\u0438\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c). \u041f\u0440\u0438\u00a0\u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043d\u0430 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0430\u00a0\u0432\u044b\u0437\u0432\u0430\u0432\u0448\u0430\u044f \u0435\u0451 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f\u00a0\u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0430\u043d\u043e\u043c\u0438\u0442\u044b.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0448\u0438\u0442\u044c crackme, \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441 <a href=\"https:\/\/github.com\/cyberfined\/nanomites\/releases\" rel=\"noopener noreferrer nofollow\">github<\/a>. \u0410\u00a0\u044f \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u044e \u043a\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e.<\/p>\n<h2>Whitebox AES<\/h2>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0438\u043a\u0431\u0435\u0439\u0442\u043d\u044b\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0438\u0437\u00a0\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 whitebox \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u044f \u043d\u0435\u00a0\u0438\u0437\u0443\u0447\u0430\u043b, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0434\u0430\u043b\u0435\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435\u00a0\u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u0434\u043b\u044f\u00a0\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. Whitebox \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u043a\u043e\u0434\u0443 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043f\u0443\u0441\u043a\u0430\u0439 \u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\/\u0438\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u043d\u0438\u0435), \u0438 \u0432\u0430\u043c \u043d\u0435\u00a0\u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0438\u0437\u00a0\u043d\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0438. \u0423\u00a0\u043c\u0435\u043d\u044f, \u0442\u0430\u043a\u043e\u0439 \u0446\u0435\u043b\u0438 \u043d\u0435\u00a0\u0441\u0442\u043e\u044f\u043b\u043e, \u043d\u0443\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e\u00a0\u043b\u0438\u0448\u044c \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u0440\u043e\u0441\u0442\u043e \u044f \u043d\u0435\u00a0\u0441\u043c\u043e\u0433 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0447\u0435\u043c whitebox AES.<\/p>\n<p>\u0412\u00a0\u0448\u0438\u0444\u0440\u0435 AES \u043a\u043b\u044e\u0447 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u0432\u00a0\u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0\u2014 AddRoundKey, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0451 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c (\u043a\u043e\u0434 \u0432\u0437\u044f\u0442 \u0438\u0437\u00a0\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f <a href=\"https:\/\/github.com\/kokke\/tiny-AES-c\" rel=\"noopener noreferrer nofollow\">tiny\u2011AES\u2011c<\/a>):<\/p>\n<pre><code class=\"cpp\">#define Nb 4 \/\/ \u0447\u0438\u0441\u043b\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 (32-\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u043b\u043e\u0432), \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 State.  void AddRoundKey(uint8_t round, state_t* state, const uint8_t* RoundKey) {   uint8_t i,j;   for (i = 0; i &lt; 4; ++i) {     for (j = 0; j &lt; 4; ++j) {       (*state)[i][j] ^= RoundKey[(round * Nb * 4) + (i * Nb) + j];     }   } }<\/code><\/pre>\n<p>\u041a\u0430\u043a\u00a0\u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c, \u043d\u0430\u0434 \u0431\u043b\u043e\u043a\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0447\u0430\u0441\u0442\u044c\u044e \u043a\u043b\u044e\u0447\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u0438\u043b\u0438, \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0447\u0430\u0441\u0442\u044c \u043a\u043b\u044e\u0447\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u00a0\u043d\u043e\u043c\u0435\u0440\u0430 \u0440\u0430\u0443\u043d\u0434\u0430. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443\u00a0\u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0447\u0435\u043d\u044c \u0442\u0443\u043f\u0430\u044f \u0438\u0434\u0435\u044f\u00a0\u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u0447\u0442\u043e\u2011\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0442\u0430\u043a\u043e\u0433\u043e:<\/p>\n<pre><code class=\"cpp\">void AddRoundKey(uint8_t round, state_t* _state) {   uint32_t *state = (uint32_t*)_state;   if(round == 0) {     state[0] ^= word_0_round_0;     state[1] ^= word_1_round_0;     state[2] ^= word_2_round_0;     state[3] ^= word_3_round_0;   } else if(round == 1) {     state[0] ^= word_0_round_1;     state[1] ^= word_1_round_1;     state[2] ^= word_2_round_1;     state[3] ^= word_3_round_1;   }   \/\/...   else if(round == 14) {     state[0] ^= word_0_round_14;     state[1] ^= word_1_round_14;     state[2] ^= word_2_round_14;     state[3] ^= word_3_round_14;   } }<\/code><\/pre>\n<p>\u0413\u0434\u0435 word_n_round_k\u00a0\u2014 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0438\u0437\u00a0\u043a\u043b\u044e\u0447\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u043b\u044e\u0447 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043a\u043e\u0434, \u0447\u0442\u043e\u00a0\u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435. \u0414\u0430\u043b\u0435\u0435 \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e\u00a0\u0438\u0437\u00a0\u043a\u043e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e\u00a0\u0431\u044b\u043b\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a\u00a0\u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 \u0432\u043d\u043e\u0441\u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u00a0\u0434\u0430\u043d\u043d\u044b\u0435, \u0430\u00a0\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0443\u043d\u0434\u043e\u0432\u00a0\u2014 \u043d\u0435\u0442. \u042f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u043d\u0434 \u043d\u0430 32\u00a0\u0431\u0438\u0442\u0430 \u0432\u043b\u0435\u0432\u043e \u0438\u043b\u0438\u00a0\u0432\u043f\u0440\u0430\u0432\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u0438\u043b\u0438\u00a0\u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0435\u00a0\u0438\u043c\u0435\u043b\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430. \u0412\u00a0\u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f AddRoundKey \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0435\u0441\u043b\u0438 n > 0, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 1. \/\/ \u0435\u0441\u043b\u0438 n &lt; 0, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 -1. \/\/ \u0435\u0441\u043b\u0438 n = 0, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 0. uint32_t sgn32(uint32_t n) {   return (-n>>31)-(n>>31); }  \/\/ \u0435\u0441\u043b\u0438 n = 0, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 0. \/\/ \u0435\u0441\u043b\u0438 n != 0, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 32. uint32_t guard(uint32_t n) {   uint32_t a = sgn32(n);   return ((a &amp; 1) | (a >> 31)) * 32; }  void AddRoundKey(uint32_t round, state_t* _state) {   uint32_t *state = (uint32_t*)_state;   uint32_t r0 = round ^ 0; \/\/ r0 = 0, \u0435\u0441\u043b\u0438 round = 0   uint32_t r1 = round ^ 1; \/\/ r1 = 0, \u0435\u0441\u043b\u0438 round = 1   \/\/...   uint32_t r14 = round ^ 14; \/\/ r14 = 0, \u0435\u0441\u043b\u0438 round = 14   \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c 64-\u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0434\u0432\u0438\u0433 \u0431\u043e\u043b\u0435\u0435, \u0447\u0435\u043c \u043d\u0430 31 \u0431\u0438\u0442,   \/\/ \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f undefined behavior \u0434\u043b\u044f 32-\u0431\u0438\u0442\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b.   uint64_t shift = 0;    \/\/ \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0443\u043d\u0434   shift = word_0_round_0;   \/\/ guard(r0) = 32, \u0435\u0441\u043b\u0438 r0 != 0.   \/\/ guard(r0) = 0, \u0435\u0441\u043b\u0438 r0 = 0.   shift &lt;&lt;= guard(r0);   state[0] ^= shift;   \/\/...    \/\/ \u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044b\u0439 \u0440\u0430\u0443\u043d\u0434   shift = word_0_round_14;   shift &lt;&lt;= guard(r14);   state[0] ^= shift; }<\/code><\/pre>\n<p>\u0423\u0436\u0435 \u043b\u0443\u0447\u0448\u0435, \u043d\u043e\u00a0\u0431\u0430\u0439\u0442\u044b \u043a\u043b\u044e\u0447\u0430 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043b\u0435\u0436\u0430\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c. \u0410\u00a0\u0447\u0442\u043e\u00a0\u0435\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u0438\u043b\u0438\u00a0\u0434\u043b\u044f\u00a0\u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u0432\u0441\u0435\u0433\u0434\u0430, \u0434\u043b\u044f\u00a0\u043f\u0435\u0440\u0432\u043e\u0433\u043e\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u00a0\u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 \u0438 \u0434\u043e\u00a0\u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u043e\u0433\u043e, \u0434\u043b\u044f\u00a0\u0432\u0442\u043e\u0440\u043e\u0433\u043e\u00a0\u2014 \u043e\u0442\u00a0\u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438 \u0434\u043e\u00a0\u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u043e\u0433\u043e \u0438\u00a0\u0442.\u00a0\u0434. \u0422\u043e\u0433\u0434\u0430 \u0432\u00a0\u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e 4\u00a0\u0441\u043b\u043e\u0432\u0430 \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430. \u0422\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 AddRoundKey:<\/p>\n<pre><code class=\"cpp\">void AddRoundKey(uint32_t round, state_t* _state) {   uint32_t *state = (uint32_t*)_state;   uint32_t r0 = round ^ 0;   uint32_t r1 = round ^ 1;   \/\/...   uint32_t r14 = round ^ 14;   uint64_t shift = 0;    \/\/ \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0443\u043d\u0434   shift = word_0_round_0;   \/\/ guard \u0432\u0435\u0440\u043d\u0451\u0442 \u043d\u043e\u043b\u044c, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0432\u043d\u0430 \u043d\u0443\u043b\u044e   shift &lt;&lt;= guard(r0 * r1 * \/*...*\/ * r14);   state[0] ^= shift;   \/\/...    \/\/ \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0443\u043d\u0434   \/\/ (state[0] ^ word_0_round_0) ^ shift = state[0] ^ word_0_round_1   shift = word_0_round_0 ^ word_0_round_1;   \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0430\u0443\u043d\u0434\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e   shift &lt;&lt;= guard(r1 * r2 \/*...*\/ * r14);   shift[0] ^= shift;   \/\/ ...    \/\/ \u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044b\u0439 \u0440\u0430\u0443\u043d\u0434   shift = word_0_round_0 ^ word_0_round_1 ^ \/*...*\/ ^ word_0_round_13;   shift &lt;&lt;= guard(r14);   state[0] ^= shift; }<\/code><\/pre>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044f \u0432 shift \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 round, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">void AddRoundKey(uint32_t round, state_t* _state) {   uint32_t *state = (uint32_t*)_state;   uint32_t r0 = round ^ 0;   uint32_t r1 = round ^ 1;   \/\/...   uint32_t r14 = round ^ 14;   uint64_t shift = 0;    \/\/ \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0443\u043d\u0434   \/\/ \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e rotl((round + 0x12345678), 17) * 0x90801023 = word_0_round_0   shift = rotl((round + 0x12345678), 17) * 0x90801023;   shift &lt;&lt;= guard(r0 * r1 * \/*...*\/ * r14);   state[0] ^= shift;   \/\/...    \/\/ \u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044b\u0439 \u0440\u0430\u0443\u043d\u0434   \/\/ \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e (rotl(round, 11) ^ 0x546321) * 0x77889910 =   \/\/ word_0_round_0 ^ word_0_round_1 ^ ... ^ word_0_round_13;   shift = (rotl(round, 11) ^ 0x546321) * 0x77889910;   shift &lt;&lt;= guard(r14);   state[0] ^= shift; }<\/code><\/pre>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u043c\u043d\u0435 \u0432\u00a0\u0433\u043e\u043b\u043e\u0432\u0443\u00a0\u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u0440\u0430\u0443\u043d\u0434\u044b \u043c\u0435\u0441\u0442\u0430\u043c\u0438, \u0442.\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0434\u0443\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f\u00a0\u0448\u0435\u0441\u0442\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430, \u043f\u043e\u0442\u043e\u043c \u0434\u043b\u044f\u00a0\u0434\u0435\u0441\u044f\u0442\u043e\u0433\u043e \u0438\u00a0\u0442.\u00a0\u0434. \u0412\u0438\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 AddRoundKey \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043d\u0435\u00a0\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f\u00a0\u043b\u0438\u0448\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432\u00a0\u043d\u0435\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043a\u043e\u0434\u0430 \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 (\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 AddRoundKey \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430). \u041a\u0430\u043a\u00a0\u044f \u043f\u0438\u0441\u0430\u043b \u0440\u0430\u043d\u0435\u0435, \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430\u00a0\u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c AddRoundKey \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00a0\u043b\u0438\u0448\u044c \u0441\u00a0\u043e\u0434\u043d\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c. \u0427\u0442\u043e\u00a0\u0436, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u0414\u0435\u043b\u0430\u0442\u044c \u043c\u044b \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0442\u0435\u043c\u00a0\u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c\u00a0\u2014 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0445 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0443\u00a0\u043d\u0430\u0441 \u043a\u043b\u044e\u0447\u0435\u0439 \u0432\u00a0\u043e\u0434\u043d\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e AddRoundKey, \u0430\u00a0\u0447\u0442\u043e\u0431\u044b \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u043d\u0443\u0436\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u0441\u0434\u0432\u0438\u0433\u0438, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u00a0\u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u00a0\u043e\u0442\u00a0\u043d\u043e\u043c\u0435\u0440\u0430 \u0440\u0430\u0443\u043d\u0434\u0430, \u0430\u00a0\u043e\u0442\u00a0\u0430\u0434\u0440\u0435\u0441\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 _state, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u00a0AddRoundKey \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u043d\u0430\u00a0\u0448\u0438\u0444\u0440\u0443\u0435\u043c\u0443\u044e \u0438\u043b\u0438\u00a0\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u043c\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f\u00a0\u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u0430\u0434\u0440\u0435\u0441\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041d\u043e\u00a0\u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435\u00a0\u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0440\u0435\u0436\u0438\u043c\u0430\u043c\u0438 AES, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, CTR \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u00a0\u0432\u044b\u0439\u0434\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0442\u0430\u043c \u0432 _state \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a, \u0430\u00a0\u043d\u0435\u00a0\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u00a0\u043a\u0430\u043a\u0443\u044e\u2011\u043b\u0438\u0431\u043e \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0414\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c 0, \u0435\u0441\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0443, \u0438 33\u00a0\u0432\u00a0\u0438\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 (\u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u044e\u0449\u0435\u0435\u0441\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u044c\u044e \u0434\u0432\u043e\u0439\u043a\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0438\u0441\u0435\u043b, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u044f\u043c\u0438 \u0434\u0432\u043e\u0439\u043a\u0438, \u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f 0).<\/p>\n<pre><code class=\"cpp\">int64_t sgn64(uint64_t n) {   uint64_t s = 63;   return (-n>>s)-(n>>s); }   uint32_t address_guard(uint64_t addr, uint64_t begin, uint64_t end) {   uint64_t a = sgn64((2 + sgn64(addr - begin)) * (2 + sgn64(end - addr)) - 4);   uint64_t s = 63;   a >>= s;   return a * 33; }<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b address_guard, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0432\u0435\u0434\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f: range = (2 + sgn64(addr &#8212; begin)) * (2 + sgn64(end &#8212; addr)) &#8212; 4, \u0447\u0442\u043e\u0431\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0431\u044b\u043b\u0430 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0448\u0438\u0440\u043e\u043a\u043e\u0439. \u041f\u0440\u043e\u0447\u0435\u0440\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0441\u043b\u043e\u0432\u0438\u044f addr &lt; begin \u0438 addr > end \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"181\" width=\"181\">\n<p>sgn64(addr &#8212; begin)<\/p>\n<\/th>\n<th data-colwidth=\"161\" width=\"161\">\n<p>sgn64(end &#8212; addr)<\/p>\n<\/th>\n<th>\n<p>range<\/p>\n<\/th>\n<th>\n<p>a<\/p>\n<\/th>\n<th>\n<p>a >> 63<\/p>\n<\/th>\n<th>\n<p>result<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">0 (addr = begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">0 (addr = end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">0 (addr = begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">1 (addr &lt; end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">0 (addr = begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">-1 (addr > end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">-2<\/p>\n<\/td>\n<td>\n<p align=\"left\">-1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">33<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">1 (addr > begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">0 (addr = end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">1 (addr > begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">1 (addr &lt; end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">1 (addr > begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">-1 (addr > end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">-1<\/p>\n<\/td>\n<td>\n<p align=\"left\">-1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">33<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">-1 (addr &lt; begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">0 (addr = end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">-1 (addr &lt; begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">1 (addr &lt; end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">-1<\/p>\n<\/td>\n<td>\n<p align=\"left\">-1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">33<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">-1 (addr &lt; begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">-1 (addr > end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, address_guard \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 0, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0434\u0432\u0443\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 begin &lt;= addr &lt;= end, \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 33, \u0447\u0442\u043e \u043d\u0430\u043c \u0438 \u0431\u044b\u043b\u043e \u043d\u0443\u0436\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u0434 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 AddRoundKey, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0434\u0432\u0443\u043c\u044f \u043a\u043b\u044e\u0447\u0430\u043c\u0438. \u041f\u0435\u0440\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 0x401000 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 16 \u0431\u0430\u0439\u0442, \u0432\u0442\u043e\u0440\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 0x401020 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 48 \u0431\u0430\u0439\u0442:<\/p>\n<pre><code class=\"cpp\">void AddRoundKey(uint32_t round, state_t* _state) {   uint32_t *state = (uint32_t*)_state;   uint64_t addr = (uint64_t)state;   uint32_t r0 = round ^ 0;   uint32_t r1 = round ^ 1;   \/\/...   uint32_t r14 = round ^ 14;   uint32_t f0 = address_guard(addr, 0x401000, 0x401010);   uint32_t f1 = address_guard(addr, 0x401020, 0x401050);   uint64_t shift = 0;    \/\/ \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0443\u043d\u0434 \u043f\u0435\u0440\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   shift = rotl((round + 0x12345678), 17) * 0x90801023;   \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u043e\u0431\u0435\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439   shift &lt;&lt;= guard(r0 * r1 * \/*...*\/ * r14);   shift &lt;&lt;= guard(f0 * f1);   state[0] ^= shift;   \/\/...    \/\/ \u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044b\u0439 \u0440\u0430\u0443\u043d\u0434 \u043f\u0435\u0440\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   shift = (rotl(round, 11) ^ 0x546321) * 0x77889910;   \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0434\u043b\u044f \u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044b\u0445 \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u043e\u0431\u0435\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.   shift &lt;&lt;= guard(r14);   shift &lt;&lt;= guard(f0 * f1);   state[0] ^= shift;    \/\/ \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0443\u043d\u0434 \u0432\u0442\u043e\u0440\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   shift = (round * 0x11223344) ^ 0x78771122;   \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u0432\u0442\u043e\u0440\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   shift &lt;&lt;= guard(r0 * r1 * \/*...*\/ * r14);   shift &lt;&lt;= guard(f1);   state[0] ^= shift;   \/\/...    \/\/ \u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044b\u0439 \u0440\u0430\u0443\u043d\u0434 \u0432\u0442\u043e\u0440\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   shift = rotl((round * 0x98765432) + 0x988888), 12) ^ 0x77777;   \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0434\u043b\u044f \u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   shift &lt;&lt;= guard(r14);   shift &lt;&lt;= guard(f1);   state[0] ^= shift; }<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u044f \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e AddRoundKey. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 AddRoundKey \u043d\u0430 Haskell.<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 AddRoundKey<\/h2>\n<h3>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h3>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0438\u0448\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"haskell\">-- \u041c\u0430\u0441\u0441\u0438\u0432 state data AesState = AesState !Word32 !Word32 !Word32 !Word32  -- \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0438\u043b\u0438 \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 state xorAesStates :: AesState -> AesState -> AesState xorAesStates (AesState w11 w12 w13 w14) (AesState w21 w22 w23 w24) =   AesState (w11 `xor` w21) (w12 `xor` w22) (w13 `xor` w23) (w14 `xor` w24)  -- \u0422\u0438\u043f, \u043d\u0443\u0436\u043d\u044b\u0439 \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. newtype Address = Address (Word64) deriving newtype Read  -- \u0422\u0438\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u044e\u0447 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f. newtype Key = Key (ByteString)  -- \u0422\u0438\u043f \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0440\u0430\u0443\u043d\u0434\u0430 newtype Round = Round Word32 deriving newtype (Eq, Ord, Enum)  -- \u0412\u043c\u0435\u0441\u0442\u043e 256 \u0431\u0438\u0442 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u0434\u043e 15 -- \u0431\u043b\u043e\u043a\u043e\u0432 \u043a\u043b\u044e\u0447. toKey :: ByteString -> Maybe Key toKey key   | BS.length key == 240 = Just (Key key)   | otherwise            = Nothing  -- \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043a\u043b\u044e\u0447\u0430 \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443 \u0440\u0430\u0443\u043d\u0434\u0430 getKeyRoundState :: Key -> Round -> AesState getKeyRoundState (Key key) (Round rnd) = AesState (getWord32 0)                                                   (getWord32 1)                                                   (getWord32 2)                                                   (getWord32 3)   where getWord32 :: Int -> Word32         getWord32 j = (b4 `shiftL` 24) .|. (b3 `shiftL` 16) .|. (b2 `shiftL` 8) .|. b1           where b1 = fromIntegral $ BS.index key w32Idx                 b2 = fromIntegral $ BS.index key (w32Idx + 1)                 b3 = fromIntegral $ BS.index key (w32Idx + 2)                 b4 = fromIntegral $ BS.index key (w32Idx + 3)                 w32Idx = rndIdx + j * 4          rndIdx :: Int         rndIdx = fromIntegral rnd * 16<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0438\u043f\u044b \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"haskell\">data Stmt   = Define !Type !Var !Expr   | Assign !Var !Expr  data Expr   = Var !Var   | Int32 !Word32   | Int64 !Word64   | Binop !Binop !Expr !Expr   | Guard !Expr -- \u0432\u044b\u0437\u043e\u0432 guard   | AddressGuard !Expr !Expr !Expr -- \u0432\u044b\u0437\u043e\u0432 address_guard  data Var   = VarName !Text -- \u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439   | VarState !Int -- \u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 state   | VarAddress    -- \u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 addr   | VarRound      -- \u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 round   deriving stock Eq  varToText :: Var -> Text varToText = \\case     VarName name -> name     VarState idx -> \"state[\" &lt;> Text.pack (show idx) &lt;> \"]\"     VarAddress   -> \"address\"     VarRound     -> \"round\"  data Binop   = Add   | Mul   | Shl   | Shr   | Rotl   | Rotr   | Xor   | And   deriving stock (Eq, Bounded, Enum)  data Type   = Uint32   | Uint64<\/code><\/pre>\n<h3>\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440<\/h3>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043c\u043e\u043d\u0430\u0434\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"haskell\">-- \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 - \u0445\u044d\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 -- \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 newtype State = State { stVariables :: HashMap Var Value }  -- \u0414\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 -- \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 state, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 -- \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f -- \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 AddRoundKey, \u0432 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 -- \u043e\u043d\u0430 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u0438\u044f \u043d\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442. lookupAesState :: State -> Either InterpretError AesState lookupAesState (State variables) =  AesState                                 &lt;$> lookupStateOrError 0                                 &lt;*> lookupStateOrError 1                                 &lt;*> lookupStateOrError 2                                 &lt;*> lookupStateOrError 3   where lookupStateOrError :: Int -> Either InterpretError Word32         lookupStateOrError stateIdx =             case HashMap.lookup var variables of                 Nothing        -> Left (UndefinedVariable var)                 Just (Val64 _) -> Left (WrongStateType stateIdx)                 Just (Val32 w) -> Right w           where var = VarState stateIdx  -- \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e 32 \u043b\u0438\u0431\u043e 64-\u0431\u0438\u0442\u043d\u044b\u043c. data Value   = Val32 !Word32   | Val64 !Word64  -- \u041f\u0440\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0434\u0432\u0435 \u043e\u0448\u0438\u0431\u043a\u0438: -- 1. \u043c\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u043b\u0438\u0441\u044c \u043a \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, -- 2. \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f state[i] \u0438\u043c\u0435\u0435\u0442 64, \u0430 \u043d\u0435 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. data InterpretError   = UndefinedVariable !Var   | WrongStateType !Int  interpretErrorToText :: InterpretError -> Text interpretErrorToText = \\case     UndefinedVariable var -> \"Undefined variable \" &lt;> (varToText var)     WrongStateType idx    -> \"Wrong type: \"                           &lt;> varToText (VarState idx)                           &lt;> \" must be 32-bit integer\"  type InterpretM a = StateT State (Except InterpretError) a<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"haskell\">-- \u0414\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 state, -- \u0430\u0434\u0440\u0435\u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 -- \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430. runInterpreter :: Traversable t                => AesState                -> Address                -> Round                -> t Stmt                -> Either InterpretError State runInterpreter (AesState w1 w2 w3 w4) (Address addr) (Round rnd) stmts = result   where result = runExcept (execStateT (runInterpreterM stmts) initState)         initState = State initVariables         initVariables = HashMap.fromList [ (VarState 0, Val32 w1)                                          , (VarState 1, Val32 w2)                                          , (VarState 2, Val32 w3)                                          , (VarState 3, Val32 w4)                                          , (VarAddress, Val64 addr)                                          , (VarRound, Val32 rnd)                                          ]  -- \u0414\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435. runInterpreterExpr :: Round -> Expr -> Either InterpretError Value runInterpreterExpr (Round rnd) expr = runExcept (evalStateT (runExpr expr) initState)   where initState = State initVariables         initVariables = HashMap.fromList [(VarRound, Val32 rnd)]  -- runStmt :: Stmt -> InterpreterM () runInterpreterM :: Traversable t => t Stmt -> InterpretM () runInterpreterM = mapM_ runStmt<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"haskell\">runStmt :: Stmt -> InterpretM () runStmt = \\case     -- \u041f\u0440\u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435     -- \u0442\u0438\u043f\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043a \u0442\u0438\u043f\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439.     Define typ var expr -> runExpr expr >>= setVariable var . castToType typ     Assign var expr     -> do         typ &lt;- getVarType &lt;$> getVariable var         val &lt;- castToType typ &lt;$> runExpr expr         setVariable var val   where castToType :: Type -> Value -> Value         castToType Uint32 v@(Val32 _) = v         castToType Uint64 v@(Val64 _) = v         castToType Uint32 (Val64 v)   = Val32 (fromIntegral v)         castToType Uint64 (Val32 v)   = Val64 (fromIntegral v)          getVarType :: Value -> Type         getVarType = \\case             Val32 _ -> Uint32             Val64 _ -> Uint64  runExpr :: Expr -> InterpretM Value runExpr = \\case     Var var                     -> getVariable var     Int32 i32                   -> pure (Val32 i32)     Int64 i64                   -> pure (Val64 i64)     Binop op e1 e2              -> runBinop op &lt;$> runExpr e1 &lt;*> runExpr e2     Guard e                     -> runGuard &lt;$> runExpr e     AddressGuard addr begin end ->  runAddressGuard                                 &lt;$> runExpr addr                                 &lt;*> runExpr begin                                 &lt;*> runExpr end   where -- \u0422\u0443\u0442 \u0432\u0441\u0451 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0435\u0441\u043b\u0438 \u0442\u0438\u043f\u044b \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e,         -- \u0432 \u0438\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u043c 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 64-\u0431\u0438\u0442\u043d\u043e\u0435 \u0438         -- \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e         runBinop :: Binop -> Value -> Value -> Value         runBinop op (Val32 v1) (Val32 v2) = Val32 (runBinop32 op v1 v2)         runBinop op (Val64 v1) (Val64 v2) = Val64 (runBinop64 op v1 v2)         runBinop op (Val32 v1) (Val64 v2) = Val64 (runBinop64 op (fromIntegral v1) v2)         runBinop op (Val64 v1) (Val32 v2) = Val64 (runBinop64 op v1 (fromIntegral v2))          runBinop32 :: Binop -> Word32 -> Word32 -> Word32         runBinop32 op v1 v2 = case op of             Add  -> v1 + v2             Mul  -> v1 * v2             Shl  -> shiftL v1 (fromIntegral v2)             Shr  -> shiftR v1 (fromIntegral v2)             Rotl -> rotateL v1 (fromIntegral v2)             Rotr -> rotateR v1 (fromIntegral v2)             Xor  -> v1 `xor` v2             And  -> v1 .&amp;. v2          runBinop64 :: Binop -> Word64 -> Word64 -> Word64         runBinop64 op v1 v2 = case op of             Add  -> v1 + v2             Mul  -> v1 * v2             Shl  -> shiftL v1 (fromIntegral v2)             Shr  -> shiftR v1 (fromIntegral v2)             Rotl -> rotateL v1 (fromIntegral v2)             Rotr -> rotateR v1 (fromIntegral v2)             Xor  -> v1 `xor` v2             And  -> v1 .&amp;. v2          -- \u0412\u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0433\u043b\u0430\u0432\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f,         -- \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443.         runGuard :: Value -> Value         runGuard (Val32 v) = Val32 (if v == 0 then 0 else 32)         runGuard (Val64 v) = Val32 (if v == 0 then 0 else 32)          -- \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043c \u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c address_guard.         runAddressGuard :: Value -> Value -> Value -> Value         runAddressGuard addr begin end           | addrGeBegin &amp;&amp; addrLeEnd = Val32 0           | otherwise                = Val32 33           where addrGeBegin = case (addr, begin) of                     (Val32 a32, Val32 b32) -> a32 >= b32                     (Val64 a64, Val64 b64) -> a64 >= b64                     (Val32 a32, Val64 b64) -> fromIntegral a32 >= b64                     (Val64 a64, Val32 b32) -> a64 >= fromIntegral b32                  addrLeEnd = case (addr, end) of                     (Val32 a32, Val32 e32) -> a32 &lt;= e32                     (Val64 a64, Val64 e64) -> a64 &lt;= e64                     (Val32 a32, Val64 e64) -> fromIntegral a32 &lt;= e64                     (Val64 a64, Val32 e32) -> a64 &lt;= fromIntegral e32  -- \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 getVariable :: Var -> InterpretM Value getVariable var = gets (\\State {..} -> HashMap.lookup var stVariables) >>= \\case     Nothing  -> lift $ throwE $ UndefinedVariable var     Just val -> pure val  -- \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 setVariable :: Var -> Value -> InterpretM () setVariable var val = modify' $     \\s@(State {..}) -> s { stVariables = HashMap.insert var val stVariables }<\/code><\/pre>\n<p>\u041d\u0430\u0448 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a\u00a0\u0441\u0430\u043c\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438\u00a0\u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u043a\u043e\u0434\u0430.<\/p>\n<h3>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 AddRoundKey<\/h3>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u0441 \u043c\u043e\u043d\u0430\u0434\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"haskell\">-- \u041f\u043e\u043b\u0435 funcIv \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, -- \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 get_iv, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c -- \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0433\u043b\u0430\u0432\u044b. data FuncInfo = FuncInfo   { funcAddress :: !Address   , funcSize    :: !Word32   , funcKey     :: !Key   , funcIv      :: !Iv   }  -- \u0412 \u0445\u043e\u0434\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, -- \u0441\u0430\u043c\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043e\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c -- \u0434\u043b\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u0442\u0438\u043f InterpreterError. type GenM a = StateT GenState (Except InterpretError) a  data GenState = GenState     { -- \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b.       stGen           :: !StdGen       -- \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439.      -- Seq \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c      -- \u043d\u043e\u0432\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u043f\u0438\u0441\u043a\u0430, \u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c      -- \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043d\u0430\u0447\u0430\u043b\u0430.     , stStmts         :: !(Seq Stmt)      -- \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438     -- \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0430 var0, var1 \u0438 \u0442.\u0434.     , stNextVar       :: !Int      -- \u041c\u0430\u0441\u0441\u0438\u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 guard:     -- r0 = round ^ 0;     -- r1 = round ^ 1;     -- \u0438 \u0442.\u0434.     , stGuardVars     :: !(Array Int Expr)      -- \u0421\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u0437\u043e\u0432\u0430 address_guard:     -- f0 = address_guard(addr, 0x1234, 0x12345);     -- f1 = address_guard(addr, 0x5678, 0x56789);     , stAddrGuardVars :: ![Expr]      -- \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f uint64_t shift;     , stShiftVar      :: !Var      -- \u0414\u0430\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 get_iv.     , stSizeVar       :: !Var     }  -- \u0414\u0430\u043d\u043d\u044b\u0439 \u0442\u0438\u043f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435. \u041e\u043d \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043f\u0443\u0442\u0430\u0442\u044c \u0434\u0432\u0430 -- \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: -- AddRoundKey \u0438 get_iv. newtype AddRoundKeyCode f = AddRoundKeyCode { addRoundKeyCode :: f Stmt }  -- \u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, -- \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0442\u044c, \u0438 -- \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0434 AddRoundKey. generateAddRoundKey :: StdGen                     -> [FuncInfo]                     -> Either InterpretError (AddRoundKeyCode Seq, StdGen) generateAddRoundKey = runGenerator generateAddRoundKeyM AddRoundKeyCode  -- \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0443\u0436\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b. runGenerator :: ([FuncInfo] -> GenM ())              -> (Seq Stmt -> a)              -> StdGen              -> [FuncInfo]              -> Either InterpretError (a, StdGen) runGenerator run toRes gen funcs = case finalStateOrError of     Left err         -> Left err     Right finalState -> Right (toRes $ stStmts finalState, stGen finalState)   where finalStateOrError = runExcept $ execStateT (run funcs) initState         initState = GenState { stGen           = gen                              , stStmts         = Seq.empty                              , stNextVar       = 0                              , stGuardVars     = array (0, 0) []                              , stAddrGuardVars = []                              , stShiftVar      = VarName \"undefined\"                              , stSizeVar       = VarName \"undefined\"                              }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"haskell\">-- \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. define :: Type -> Var -> Expr -> GenM () define typ var expr = modify' (\\s@GenState{..} -> s { stStmts = stStmts |> stmt })   where stmt = Define typ var expr  -- \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. assign :: Var -> Expr -> GenM () assign var expr = modify' (\\s@GenState{..} -> s { stStmts = stStmts |> stmt })   where stmt = Assign var expr  -- \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. getNextVar :: GenM Var getNextVar = do     idx &lt;- gets stNextVar     modify' (\\s -> s { stNextVar = idx + 1 })     pure (VarName $ \"var\" &lt;> Text.pack (show idx))  -- \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435. randomR :: Random a => (a, a) -> GenM a randomR rng = applyGen (Random.randomR rng)  -- \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. random :: Random a => GenM a random = applyGen Random.random  -- \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430. randomChoice :: [a] -> GenM a randomChoice xs = randomR (0, length xs - 1) >>= \\idx -> pure (xs !! idx)  -- \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f -- \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. applyGen :: (StdGen -> (a, StdGen)) -> GenM a applyGen f = do     (res, newGen) &lt;- f &lt;$> gets stGen     modify' (\\s -> s { stGen = newGen })     pure res  -- \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430. -- \u041a\u043e\u0434 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0438 \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0439\u0441\u044f \u043a \u0442\u0435\u043c\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, -- \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f. shuffle :: [a] -> GenM [a] shuffle = undefined<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"haskell\">rounds :: [Round] rounds = [Round 0..Round 14]  generateAddRoundKeyM :: [FuncInfo] -> GenM () generateAddRoundKeyM funcs = do     -- \u0417\u0430\u0434\u0430\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0439.     shuffledFuncs &lt;- shuffle funcs     -- \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435     defineGuardVars shuffledFuncs     defineShiftVar     -- \u0414\u0435\u043b\u0430\u0435\u043c xor \u043c\u0430\u0441\u0441\u0438\u0432\u0430 state \u0441\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438,     -- \u0434\u043b\u044f \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430.     xorInitState      -- \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c     forM_ shuffledFuncs $ \\func -> do         -- \u0417\u0430\u0434\u0430\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438         roundsOrder &lt;- shuffle rounds          -- \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 \u0432 AddRoundKey, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a         -- \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.         generateAddRoundKeyForFunction func roundsOrder   where defineGuardVars :: [FuncInfo] -> GenM ()         defineGuardVars shuffledFuncs = do             -- \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f             -- \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u043e\u043c\u0435\u0440\u0430             -- \u0440\u0430\u0443\u043d\u0434\u0430.             -- uint32_t var0 = round ^ 0;             -- uint32_t var1 = round ^ 1;             -- \u0438 \u0442.\u0434.             guardVars &lt;- forM rounds $ \\(Round round) -> do                 guardVar &lt;- getNextVar                 define Uint32 guardVar (Binop Xor (Var VarRound) (Int32 round))                 pure $ Var guardVar              -- \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f             -- \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0430\u0434\u0440\u0435\u0441\u0430             -- \u0444\u0443\u043d\u043a\u0446\u0438\u0438.             -- uint32_t var15 = address_guard(addr, funcAddress f1, funcAddress f1 + funcSize f1)             -- uint32_t var16 = address_guard(addr, funcAddress f2, funcAddress f2 + funcSize f2)             -- \u0438 \u0442.\u0434.             addrGuardVars &lt;- defineAddrGuardVars shuffledFuncs              -- \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 guardVars.             let guardVarsArray = array (0, length rounds - 1) (zip [0..] guardVars)              -- \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0430\u043d\u0435\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438.             modify' $ \\s -> s { stGuardVars     = guardVarsArray                               , stAddrGuardVars = addrGuardVars                               }          -- \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e uint64_t shift = 0.         defineShiftVar :: GenM ()         defineShiftVar = do             let shiftVar = VarName \"shift\"             define Uint64 shiftVar (Int64 0)             modify' (\\s -> s { stShiftVar = shiftVar })          -- \u0414\u0435\u043b\u0430\u0435\u043c xor \u043c\u0430\u0441\u0441\u0438\u0432\u0430 state \u0441\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438.         xorInitState :: GenM ()         xorInitState = forM_ [0..3] $ \\stateIdx -> do             val &lt;- Int32 &lt;$> randomR (0x10000000, 0xffffffff)             assign (VarState stateIdx) (Binop Xor (Var $ VarState stateIdx) val)  -- \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f -- \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0430\u0434\u0440\u0435\u0441\u0430 -- \u0444\u0443\u043d\u043a\u0446\u0438\u0438. defineAddrGuardVars :: [FuncInfo] -> GenM [Expr] defineAddrGuardVars funcs = forM funcs $ \\FuncInfo{..} -> do     guardVar &lt;- getNextVar     let Address begin = funcAddress     let beginExpr = Int64 begin     let end = begin + fromIntegral funcSize - 1     let endExpr = Int64 end     -- uint32_t varn = address_guard(addr, funcAddress, funcAddress + funcSize)     define Uint32 guardVar (AddressGuard (Var VarAddress) beginExpr endExpr)     pure $ Var guardVar<\/code><\/pre>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"haskell\">-- \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430. -- \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c -- \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0442\u0435\u043b\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u043b -- \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. initAesState :: AesState initAesState = AesState 0xa749220 0xbe93bfa6 0x852f3eee 0xde9a4ae0  -- \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c 15 \u0440\u0430\u0443\u043d\u0434\u0430\u043c, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c -- \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 -- \u043d\u0438\u0445. generateAddRoundKeyForFunction :: FuncInfo -> [Round] -> GenM () generateAddRoundKeyForFunction func roundsOrder = do     -- \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 shift \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442     -- \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 addrGuardExpr \u0432\u043b\u0435\u0432\u043e \u0438\u043b\u0438 \u0432\u043f\u0440\u0430\u0432\u043e.     addrGuardExpr &lt;- getAddrGuardExpr     generateRounds roundsOrder addrGuardExpr   where generateRounds :: [Round] -> Expr -> GenM ()         generateRounds (rnd:rs) addrGuardExpr = do             generateRound func rnd rs addrGuardExpr             generateRounds rs addrGuardExpr         generateRounds _ _ = pure ()  -- \u0414\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 -- \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0430\u0434\u0440\u0435\u0441\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. -- \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043a\u043e\u0434 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u0434\u0451\u0442 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 f2, f4, f3, f1. -- \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 \u0434\u043b\u044f f4, \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043f\u0438\u0441\u043e\u043a stAddrGuardVars -- \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f f4, f3 \u0438 f1: [var15, var16, var17], \u0433\u0434\u0435: -- var15 = address_guard(addr, funcAddress f4, funcAddress f4 + funcSize f4); -- var16 = address_guard(addr, funcAddress f3, funcAddress f3 + funcSize f3); -- var17 = address_guard(addr, funcAddress f1, funcAddress f1 + funcSize f1); -- \u0422\u043e\u0433\u0434\u0430 \u0434\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0435\u0440\u043d\u0451\u0442 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435: guard(var15 * var16 * var17), -- \u043f\u0440\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0441\u0434\u0432\u0438\u0433\u0435 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 -- \u043c\u044b \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0438\u043b\u0438 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043e\u0434\u043d\u0443 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439: f4, f3 \u0438\u043b\u0438 f1. -- \u0422\u0430\u043a\u0436\u0435 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a stAddrGuardVars, \u0443\u0431\u0438\u0440\u0430\u044f \u0438\u0437 \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u0443\u044e -- \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e, \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: [var16, var17]. getAddrGuardExpr :: GenM Expr getAddrGuardExpr = do     addrGuardVars &lt;- gets stAddrGuardVars     modify' (\\s -> s { stAddrGuardVars = tail addrGuardVars })     pure $ Guard $ foldl1 (\\e1 e2 -> Binop Mul e1 e2) addrGuardVars  -- \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u044b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430. generateRound :: FuncInfo -> Round -> [Round] -> Expr -> GenM () generateRound FuncInfo{..} rnd nextRnds addrGuardExpr = do     -- \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0432\u0441\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u043d\u0435\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438     -- \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 state \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.     AesState c1 c2 c3 c4 &lt;- getCurAesState     shiftVar &lt;- gets stShiftVar     roundGuardExpr &lt;- getRoundGuardExpr     forM_ (zip3 [0..] [c1, c2, c3, c4] [d1, d2, d3, d4]) $ \\(idx, c, d) -> do         -- \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 shift,         -- \u0447\u0442\u043e\u0431\u044b state[idx] ^ shift = d         let destWord = c `xor` d         -- \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e         -- shift. True \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430         -- \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f round.         exprForXor &lt;- randomExprForXor rnd True destWord         assign shiftVar exprForXor          -- \u041f\u043e\u0431\u0438\u0442\u043e\u0432\u043e \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c shift.         shiftByGuard shiftVar roundGuardExpr         shiftByGuard shiftVar addrGuardExpr          -- \u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 state. state[idx] = state[idx] ^ shift.         assign (VarState idx) (Binop Xor (Var $ VarState idx) (Var $ shiftVar))   where -- \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 state, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u0443\u0447\u0438\u0442\u0441\u044f \u043d\u0430         -- \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0430\u0443\u043d\u0434\u0435.         AesState d1 d2 d3 d4 = initAesState `xorAesStates` getKeyRoundState funcKey rnd          getCurAesState :: GenM AesState         getCurAesState = runInterpreter funcAddress rnd >>= lookupAesState          -- \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430, \u0447\u0442\u043e \u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438         -- getAddrGuardExpr \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0440\u0430\u0443\u043d\u0434\u043e\u0432.         getRoundGuardExpr :: GenM Expr         getRoundGuardExpr = do             guardVars &lt;- gets stGuardVars             let roundToExpr (Round rndIdx) = guardVars ! (fromIntegral rndIdx)             let guardExprs = map roundToExpr (rnd:nextRnds)             pure $ Guard $ foldl1 (\\e1 e2 -> Binop Mul e1 e2) guardExprs  -- \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439, -- \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 state \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f -- initAesState. runInterpreter :: Address -> Round -> GenM Interpreter.State runInterpreter addr rnd = do     stmts &lt;- gets stStmts     case (Interpreter.runInterpreter initAesState addr rnd stmts) of         Left err  -> lift $ throwE err         Right res -> pure res  -- \u041e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 \u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 -- \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439. lookupAesState :: Interpreter.State -> GenM AesState lookupAesState state = case Interpreter.lookupAesState state of     Left err       -> lift $ throwE err     Right aesState -> pure aesState  -- \u0414\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0441\u0434\u0432\u0438\u0433 \u0434\u0435\u043b\u0430\u0442\u044c - \u043b\u0435\u0432\u044b\u0439 \u0438\u043b\u0438 \u043f\u0440\u0430\u0432\u044b\u0439. -- \u0415\u0441\u043b\u0438 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u044b\u0439 \u0441\u0434\u0432\u0438\u0433, \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 64-\u0431\u0438\u0442\u043d\u043e\u0435 -- \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 shift \u043a 32 \u0431\u0438\u0442\u0430\u043c, \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439 \u0435\u0441\u043b\u0438 shift > 0xffffffff.  -- \u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u043b\u0435\u0432\u043e\u0433\u043e \u0441\u0434\u0432\u0438\u0433\u0430: -- shift = shift &lt;&lt; guard(...);  -- \u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0432\u044b\u0431\u043e\u0440\u0435 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0441\u0434\u0432\u0438\u0433\u0430: -- shift = shift &amp; 0xffffffff; -- shift = shift >> guard(...); shiftByGuard :: Var -> Expr -> GenM () shiftByGuard shiftVar guardExpr = do     shiftOp &lt;- randomChoice [Shl, Shr]     when (shiftOp == Shr) $         assign shiftVar (Binop And (Var shiftVar) (Int64 0xffffffff))     assign shiftVar (Binop shiftOp (Var shiftVar) guardExpr)<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u00a0\u0434\u0430\u043d\u043d\u043e\u0439 \u0433\u043b\u0430\u0432\u0435,\u00a0\u2014 randomExprForXor. \u041a\u0430\u043a\u00a0\u0440\u0430\u0437 \u0432\u00a0\u043d\u0435\u0439 \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e shift \u0434\u043b\u044f\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 state.<\/p>\n<pre><code class=\"haskell\">randomExprForXor :: Round -> Bool -> Word32 -> GenM Expr randomExprForXor rnd withRound destWord = do     -- \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438.     numOps &lt;- randomR (2, 5)      -- \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c numOps - 1 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.     ops &lt;- replicateM (numOps - 1) (randomChoice [Add, Mul, Rotl, Rotr, Xor])      -- \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0438\u0437 numOps - 1 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439,     -- \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435.     partialExpr &lt;- randomPartialExpr ops      -- \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f     partialResult &lt;- runExpr32 rnd partialExpr      -- \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u043c \u0442\u0430\u043a,     -- \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b \u0440\u0430\u0432\u0435\u043d destWord.     -- \u041c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0437\u0434\u0435\u0441\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 Rotl \u0438 Rotr, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e     -- \u043c\u0430\u043b\u043e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0447\u0442\u043e destWord \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c     -- \u0441\u0434\u0432\u0438\u0433\u043e\u043c partialResult.     (lastOp, lastOperand) &lt;- randomLastOperand partialResult [Add, Mul, Xor]      -- \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435.     pure (Binop lastOp partialExpr lastOperand)   where randomPartialExpr :: [Binop] -> GenM Expr         randomPartialExpr ops@(op : _) = do             -- \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043b\u0435\u0432\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u043d\u0434 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0435\u0433\u043e \u0432 randomPartialExpr'.             (lOperand, isRoundUsed) &lt;- randomOperand op (not withRound)             randomPartialExpr' ops isRoundUsed lOperand         randomPartialExpr _ = error \"Never executed\"          randomPartialExpr' :: [Binop] -> Bool -> Expr -> GenM Expr         randomPartialExpr' (op:ops@(_:_)) isRoundUsed lOperand = do             -- \u0415\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435,             -- \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u0430\u0432\u044b\u0439 \u043e\u043f\u0435\u0440\u0430\u043d\u0434, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u0437 \u043b\u0435\u0432\u043e\u0433\u043e             -- \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e             -- \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.             (rOperand, isRoundUsed') &lt;- randomOperand op isRoundUsed             randomPartialExpr' ops isRoundUsed' (Binop op lOperand rOperand)         randomPartialExpr' [op] isRoundUsed lOperand           -- \u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043e\u0434\u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0431\u044b\u043b\u0430 \u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430           -- \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f round.           | isRoundUsed           -- \u0415\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u043f\u0435\u0440\u0430\u043d\u0434 - \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e.           = Binop op lOperand . fst &lt;$> randomOperand op isRoundUsed           | otherwise           -- \u0418\u043d\u0430\u0447\u0435 - \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f round.           = pure $ Binop op lOperand (Var VarRound)         randomPartialExpr' _ _ _ = error \"Never executed\"          -- \u0414\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u043f\u0435\u0440\u0430\u043d\u0434 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0442\u0430\u043a,         -- \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b \u0440\u0430\u0432\u0435\u043d destWord.         randomLastOperand :: Word32 -> [Binop] -> GenM (Binop, Expr)         randomLastOperand curWord ops = randomChoice ops >>= \\case             Mul               -- \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f - \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435,               -- \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e               -- \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0415\u0432\u043a\u043b\u0438\u0434\u0430. \u0415\u0441\u043b\u0438 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c               -- \u043d\u0430\u0448\u0451\u043b\u0441\u044f, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0438 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c.               | Just term &lt;- getMultTerm curWord destWord               -> pure (Mul, Int32 term)               -- \u0415\u0441\u043b\u0438 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u043d\u0430\u0439\u0442\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e               -- \u0437\u0430\u043d\u043e\u0432\u043e \u0431\u0435\u0437 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f.               | otherwise               -> randomLastOperand curWord (delete Mul ops)              -- \u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f - \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c.             Add -> pure (Add, Int32 (destWord - curWord))              -- \u0414\u043b\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0438\u043b\u0438 - \u043e\u043d\u043e \u0441\u0430\u043c\u043e \u0436\u0435.             _   -> pure (Xor, Int32 (destWord `xor` curWord))          -- \u0414\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0431\u0438\u043d\u0430\u0440\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0438         -- \u0431\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u043e \u0442\u043e\u043c, \u0431\u044b\u043b\u0430 \u043b\u0438         -- \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f round \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438. \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435         -- \u043e\u043d\u0430 \u0434\u0430\u0451\u0442 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u0430\u044f         -- \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u0438 \u043d\u043e\u0432\u043e\u0435 \u0431\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.         randomOperand :: Binop -> Bool -> GenM (Expr, Bool)         randomOperand op isRoundUsed = do             -- \u0411\u0443\u0434\u0435\u0442 \u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f round \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435             -- \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430.             useRound &lt;- if isRoundUsed then pure False else random             if useRound                -- \u0415\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0451 \u0438 True,                -- \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437 round                -- \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d.                then pure (Var VarRound, True)                else do                    -- \u0412 \u0438\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e.                    val &lt;- case op of                        -- \u0417\u0434\u0435\u0441\u044c \u0437\u0430\u0434\u0430\u043d \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043e\u0442 5 \u0434\u043e 31, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0441\u0434\u0432\u0438\u0433                        -- 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043d\u0430 31 \u0431\u0438\u0442, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f                        -- UB.                        Rotl -> randomR (5, 31)                        Rotr -> randomR (5, 31)                         -- \u0414\u043b\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0431\u0435\u0440\u0451\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435.                        _    -> randomR (0x10000000, 0xffffffff)                    pure (Int32 val, isRoundUsed)          -- from * getMultTerm from to = to         getMultTerm :: Word32 -> Word32 -> Maybe Word32         getMultTerm from to = (*to) &lt;$> getReciprocal from          getReciprocal :: Word32 -> Maybe Word32         getReciprocal a           | g \/= 1    = Nothing           | otherwise = Just $ fromIntegral $ (x `mod` m + m) `mod` m           where (g, x, _) = gcd (fromIntegral a) m                 m = 0x100000000          gcd :: Word64 -> Word64 -> (Word64, Word64, Word64)         gcd a b           | a == 0    = (b, 0, 1)           | otherwise = (d, y - (b `div` a) * x, x)           where (d, x, y) = gcd (b `mod` a) a  -- \u0414\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435. runExpr32 :: Round -> Expr -> GenM Word32 runExpr32 rnd expr = runExpr rnd expr >>= \\case     Val32 w32 -> pure w32     Val64 w64 -> pure (fromIntegral w64)  runExpr :: Round -> Expr -> GenM Value runExpr rnd expr = case runInterpreterExpr rnd expr of     Left err  -> lift $ throwE err     Right res -> pure res<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043d\u0430\u0448 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f AddRoundKey \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d. \u0412 \u0445\u043e\u0434\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u044b\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u043e\u043b\u044c\u0446\u0435 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e, \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044f. \u0415\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 32-\u0431\u0438\u0442\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044e 0x100000000. \u0421\u0430\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0438\u0441\u0430\u043d <a href=\"https:\/\/e-maxx.ru\/algo\/reverse_element\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c \u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 get_iv:<\/p>\n<pre><code class=\"cpp\">uint32_t get_iv(uint8_t *_state, uint64_t addr);<\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u0443\u0444\u0435\u0440 \u0438 \u0430\u0434\u0440\u0435\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 \u0431\u0443\u0444\u0435\u0440 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0435\u0451 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0447\u0442\u043e \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043b\u044f AddRoundKey. \u0414\u0430\u043b\u0435\u0435 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434 \u043d\u0430 \u0421\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044f \u043d\u0435 \u0431\u0443\u0434\u0443. <a href=\"https:\/\/github.com\/cyberfined\/nanomites\/releases\" rel=\"noopener noreferrer nofollow\">\u0421\u043a\u0430\u0447\u0430\u0442\u044c<\/a> \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/github.com\/cyberfined\/nanomites\/tree\/master\/utils\/gen-add-round-key\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u0434<\/a> \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 github.<\/p>\n<h3>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/h3>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d \u043d\u0430 \u043e\u0434\u043d\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 0x401000 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 48 \u0431\u0430\u0439\u0442.<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043b\u0430\u0431\u043e\u043d\u0435\u0440\u0432\u043d\u044b\u043c \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static inline uint32_t sgn32(uint32_t n) {     return (-n>>31)-(n>>31); }  static inline uint32_t guard(uint32_t n) {     uint32_t a = sgn32(n);     return ((a &amp; 1) | (a >> 31)) * 32; }  static inline int64_t sgn64(uint64_t n) {     uint64_t s = 63;     return (-n>>s)-(n>>s); }  static inline uint32_t address_guard(uint64_t addr, uint64_t begin, uint64_t end) {     uint64_t a = sgn64((2 + sgn64(addr - begin)) * (2 + sgn64(end - addr)) - 4);     uint64_t s = 63;     a >>= s;     return a * 33; }  static inline uint32_t rotl(uint32_t x, unsigned int n) {     const unsigned int mask = (CHAR_BIT*sizeof(x)-1);     n &amp;= mask;     return (x&lt;&lt;n) | (x>>( (-n)&amp;mask )); }  static inline uint32_t rotr(uint32_t x, unsigned int n) {     const unsigned int mask = CHAR_BIT * sizeof(x) - 1;     n &amp;= mask;     return (x >> n) | (x &lt;&lt; (-n &amp; mask)); }  static inline uint32_t get_iv(uint8_t *_state, uint64_t addr) {     uint32_t *state = (uint32_t*)_state;     state[0] = 0xc351597c;     state[1] = 0x268cd519;     state[2] = 0x59c504c3;     state[3] = 0x24bb08f9;     uint64_t shift = 0x0;     uint32_t size = 0x7b5620c9;     uint32_t var0 = address_guard(addr,0x401000,0x80202f);     shift = (rotr((0x362cee65 ^ 0x6e2d7ea0), 0x1f) ^ 0xcb151173);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var0));     size = (size ^ shift);     shift = (((0x4b93c7d3 ^ 0x31d550ee) ^ 0xb1912cd8) * 0x6a407173);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var0));     state[0] = (state[0] ^ shift);     shift = (rotr(rotl(0x5, 0x9), 0x5) + 0xede949a3);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var0));     state[1] = (state[1] ^ shift);     shift = (rotr((0x263e128c + 0x6d3c16e9), 0x1f) + 0x584e5296);     shift = (shift &lt;&lt; guard(var0));     state[2] = (state[2] ^ shift);     shift = (rotr(0x1e, 0xf) ^ 0x8712c49d);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var0));     state[3] = (state[3] ^ shift);     return size; }  INLINE static inline void AddRoundKey(state_t *_state, uint32_t round) {     uint32_t *state = (uint32_t*)_state;     uint64_t addr = (uint64_t)state;     uint32_t var0 = (round ^ 0x0);     uint32_t var1 = (round ^ 0x1);     uint32_t var2 = (round ^ 0x2);     uint32_t var3 = (round ^ 0x3);     uint32_t var4 = (round ^ 0x4);     uint32_t var5 = (round ^ 0x5);     uint32_t var6 = (round ^ 0x6);     uint32_t var7 = (round ^ 0x7);     uint32_t var8 = (round ^ 0x8);     uint32_t var9 = (round ^ 0x9);     uint32_t var10 = (round ^ 0xa);     uint32_t var11 = (round ^ 0xb);     uint32_t var12 = (round ^ 0xc);     uint32_t var13 = (round ^ 0xd);     uint32_t var14 = (round ^ 0xe);     uint32_t var15 = address_guard(addr,0x401000,0x80202f);     uint64_t shift = 0x0;     state[0] = (state[0] ^ 0x9e1039a6);     state[1] = (state[1] ^ 0xe4074a25);     state[2] = (state[2] ^ 0x3591ebee);     state[3] = (state[3] ^ 0x6c2bca0a);     shift = ((round + 0xa7fb8c08) ^ 0x7dde4f5c);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(((((((((((((((var6 * var11) * var10) * var4) * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[0] = (state[0] ^ shift);     shift = (((rotl(round, 0x10) + 0xe5d8467b) * 0xa6a7f63a) + 0x2b41e232);     shift = (shift &lt;&lt; guard(((((((((((((((var6 * var11) * var10) * var4) * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[1] = (state[1] ^ shift);     shift = ((rotl(round, 0x1c) * 0xb567757f) ^ 0x7b8b6d31);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(((((((((((((((var6 * var11) * var10) * var4) * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[2] = (state[2] ^ shift);     shift = ((rotl(0x18, 0x17) + round) ^ 0x747fe9e2);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(((((((((((((((var6 * var11) * var10) * var4) * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[3] = (state[3] ^ shift);     shift = ((rotr(((round + 0xb9c2c963) ^ 0x505edd69), 0xf) + 0xd2dcd618) ^ 0x4736fe58);     shift = (shift &lt;&lt; guard((((((((((((((var11 * var10) * var4) * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[0] = (state[0] ^ shift);     shift = (rotl(0x1a, round) + 0xc811a71b);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((((((((((var11 * var10) * var4) * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[1] = (state[1] ^ shift);     shift = (rotl(rotl(rotr((round ^ 0xcf89eae7), 0x1d), 0x16), 0x7) ^ 0xf3acad7e);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((((((((((var11 * var10) * var4) * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[2] = (state[2] ^ shift);     shift = ((rotl((0xf51c1e51 + round), 0x17) ^ 0x1ae06ec7) + 0x9de7d1f1);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((((((((((var11 * var10) * var4) * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[3] = (state[3] ^ shift);     shift = (((rotr(round, 0xd) ^ 0x6f744e3d) ^ 0x9bd81345) + 0x9010d480);     shift = (shift &lt;&lt; guard(((((((((((((var10 * var4) * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[0] = (state[0] ^ shift);     shift = (rotr(round, 0x6) ^ 0x28a38990);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(((((((((((((var10 * var4) * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[1] = (state[1] ^ shift);     shift = ((((0x30e893c5 * round) * 0x3f47d073) ^ 0xe7e7d941) + 0x31246c85);     shift = (shift &lt;&lt; guard(((((((((((((var10 * var4) * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[2] = (state[2] ^ shift);     shift = ((((0x706bcec2 + 0x3fe671ba) * round) + 0xf58e3d8f) ^ 0x4b40e278);     shift = (shift &lt;&lt; guard(((((((((((((var10 * var4) * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[3] = (state[3] ^ shift);     shift = ((((round + 0x1d05f17d) * 0xf56254b3) * 0xfba55362) ^ 0x2a43ba5e);     shift = (shift &lt;&lt; guard((((((((((((var4 * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[0] = (state[0] ^ shift);     shift = (rotr(rotl(round, 0x1e), 0xb) ^ 0x533ab204);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((((((((var4 * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[1] = (state[1] ^ shift);     shift = (rotl(rotl(((round + 0x8c6f5595) * 0x999b4570), 0x11), 0x1e) * 0xd04d3caa);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((((((((var4 * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[2] = (state[2] ^ shift);     shift = (rotl(rotr((0xc032bcd8 ^ round), 0xe), 0x14) ^ 0x7d86b52);     shift = (shift &lt;&lt; guard((((((((((((var4 * var9) * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[3] = (state[3] ^ shift);     shift = (rotr(((0xf37a81b5 + 0xf6876b7b) + round), 0x5) * 0x404096b6);     shift = (shift &lt;&lt; guard(((((((((((var9 * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[0] = (state[0] ^ shift);     shift = ((((rotr(round, 0x1e) ^ 0x63be2db5) * 0xeb397c2e) * 0x84282b2a) + 0x952f4033);     shift = (shift &lt;&lt; guard(((((((((((var9 * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[1] = (state[1] ^ shift);     shift = (((rotr((0x48ca0729 + round), 0x19) + 0x2ae23eee) + 0xb03bf9a8) ^ 0x24496e53);     shift = (shift &lt;&lt; guard(((((((((((var9 * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[2] = (state[2] ^ shift);     shift = (rotr(round, 0x6) + 0xcf9dec0f);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(((((((((((var9 * var3) * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[3] = (state[3] ^ shift);     shift = ((0x7eee5dfb * round) + 0x25823449);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((((((var3 * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[0] = (state[0] ^ shift);     shift = (rotr(rotl(rotl(round, 0x10), 0x12), 0x1b) ^ 0xa3b3de72);     shift = (shift &lt;&lt; guard((((((((((var3 * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[1] = (state[1] ^ shift);     shift = ((((rotl(round, 0x5) + 0xb21e2c4c) + 0xbce439a2) + 0x4a639aa4) + 0xf2aab8ad);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((((((var3 * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[2] = (state[2] ^ shift);     shift = (((rotr(0x1c, round) * 0xc1a9c957) * 0x3093378c) + 0x444262c8);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((((((var3 * var8) * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[3] = (state[3] ^ shift);     shift = (rotl(rotr(((0x8c8236d3 ^ 0x814322d0) ^ round), 0x14), 0x1d) * 0xb8c10f5f);     shift = (shift &lt;&lt; guard(((((((((var8 * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[0] = (state[0] ^ shift);     shift = (rotr((((round ^ 0xb309fe73) * 0xa94c9100) * 0x7059a9c8), 0x1f) ^ 0x967b228d);     shift = (shift &lt;&lt; guard(((((((((var8 * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[1] = (state[1] ^ shift);     shift = ((rotl(rotl(0xe, 0x11), 0x12) + round) ^ 0x165c0fa5);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(((((((((var8 * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[2] = (state[2] ^ shift);     shift = ((((0x9f674bf4 + round) ^ 0x752bea1e) ^ 0xd20defa5) + 0xe1c2e413);     shift = (shift &lt;&lt; guard(((((((((var8 * var12) * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[3] = (state[3] ^ shift);     shift = ((rotr(rotl(0xc, 0x7), 0x1c) ^ round) + 0xcb828487);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((((var12 * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[0] = (state[0] ^ shift);     shift = ((((round ^ 0x7527a6ed) ^ 0x7c6a6758) * 0xeb18f7f3) + 0xf568bacb);     shift = (shift &lt;&lt; guard((((((((var12 * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[1] = (state[1] ^ shift);     shift = (((0xda741724 + 0x85c793c1) + round) ^ 0x7ace9fe);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((((var12 * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[2] = (state[2] ^ shift);     shift = (rotr(rotl(((round ^ 0xda048644) ^ 0x1709ba1b), 0x1e), 0x8) ^ 0xd8466d6e);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((((var12 * var14) * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[3] = (state[3] ^ shift);     shift = (rotr(round, 0x19) ^ 0xeaa8ea51);     shift = (shift &lt;&lt; guard(((((((var14 * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[0] = (state[0] ^ shift);     shift = (rotr((((0x81975088 * round) + 0xe8fea743) + 0x54dbfa12), 0xf) + 0xb11c18d);     shift = (shift &lt;&lt; guard(((((((var14 * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[1] = (state[1] ^ shift);     shift = (rotr(0x15, round) ^ 0xa6da17bf);     shift = (shift &lt;&lt; guard(((((((var14 * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[2] = (state[2] ^ shift);     shift = (rotl(rotl(0x16, round), 0x14) ^ 0xbeeba5d4);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(((((((var14 * var13) * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[3] = (state[3] ^ shift);     shift = (((round ^ 0xb52cee81) * 0xcc0dac17) ^ 0xc669b11b);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((var13 * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[0] = (state[0] ^ shift);     shift = (((rotl((0x9c6de2ac ^ 0xca001388), 0x11) * round) ^ 0x95e20672) ^ 0x616ca13d);     shift = (shift &lt;&lt; guard((((((var13 * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[1] = (state[1] ^ shift);     shift = (rotr((rotr((round ^ 0xce83b9b7), 0xe) ^ 0x9b168237), 0xa) ^ 0xd5f73425);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((var13 * var7) * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[2] = (state[2] ^ shift);     shift = (rotr((round + 0x62cdff05), 0x9) * 0x7aac499c);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((((var13 * var7) * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[3] = (state[3] ^ shift);     shift = ((rotl((0xf845e7c7 * 0x90b3c06c), 0x1c) + round) ^ 0x152ae01a);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(((((var7 * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[0] = (state[0] ^ shift);     shift = ((round + 0xed4aa3d8) * 0x4f2129fa);     shift = (shift &lt;&lt; guard(((((var7 * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[1] = (state[1] ^ shift);     shift = (((((round * 0x7ad54a32) ^ 0xa068578e) + 0x6269f7eb) + 0x664f92d9) ^ 0x12c1f5b2);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(((((var7 * var2) * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[2] = (state[2] ^ shift);     shift = (((0xb9a89b14 ^ round) + 0xcf62f9ef) ^ 0xf67560ce);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(((((var7 * var2) * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[3] = (state[3] ^ shift);     shift = (((round ^ 0xccf0d105) + 0xdf1c25f0) * 0xc8e76e14);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((((var2 * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[0] = (state[0] ^ shift);     shift = ((rotr(round, 0x17) * 0xaa07b30d) ^ 0xcefbedfe);     shift = (shift &lt;&lt; guard((((var2 * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[1] = (state[1] ^ shift);     shift = ((rotr(0xf, round) ^ 0x3bbab7ef) + 0xd7c1e1a7);     shift = (shift &lt;&lt; guard((((var2 * var0) * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[2] = (state[2] ^ shift);     shift = (rotl(rotl(((round ^ 0x4227fceb) * 0x1c4b7b26), 0x14), 0x1d) + 0xb7a5e337);     shift = (shift &lt;&lt; guard((((var2 * var0) * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[3] = (state[3] ^ shift);     shift = (rotr((0x423797af * 0x9f726cf4), round) + 0x6c8ba5bf);     shift = (shift &lt;&lt; guard(((var0 * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[0] = (state[0] ^ shift);     shift = (rotr(rotl(((round ^ 0xb0053cfd) + 0x9533f8ef), 0x19), 0x8) + 0x9beb216d);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(((var0 * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[1] = (state[1] ^ shift);     shift = (rotl(rotl(0x1d, 0x12), round) ^ 0x5b72c2c6);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(((var0 * var5) * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[2] = (state[2] ^ shift);     shift = ((0xfa566e48 + round) + 0x2491c127);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(((var0 * var5) * var1)));     shift = (shift &lt;&lt; guard(var15));     state[3] = (state[3] ^ shift);     shift = ((0x2ef805f8 * round) + 0x9d5b80ba);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((var5 * var1)));     shift = (shift &lt;&lt; guard(var15));     state[0] = (state[0] ^ shift);     shift = (((0x980f58e2 ^ round) ^ 0x8e21baae) * 0x8c2bd0e2);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((var5 * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[1] = (state[1] ^ shift);     shift = (rotl(rotl((0x78460382 + round), 0x1e), 0x7) * 0xf436841e);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((var5 * var1)));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[2] = (state[2] ^ shift);     shift = (((rotr(round, 0x1c) ^ 0x849e0440) + 0x6ccf46ee) ^ 0xbcc1aef0);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard((var5 * var1)));     shift = (shift &lt;&lt; guard(var15));     state[3] = (state[3] ^ shift);     shift = (rotl((rotl(0x8, 0x1c) ^ round), 0x1b) ^ 0x7b34cec4);     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var1));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[0] = (state[0] ^ shift);     shift = ((((round + 0xbd8b6316) + 0x7ac47d13) ^ 0x22863bd0) ^ 0x679cfcd8);     shift = (shift &lt;&lt; guard(var1));     shift = (shift &lt;&lt; guard(var15));     state[1] = (state[1] ^ shift);     shift = (rotl(rotr(0x8, round), 0x18) ^ 0x284680f6);     shift = (shift &lt;&lt; guard(var1));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[2] = (state[2] ^ shift);     shift = (rotl(round, 0xe) ^ 0xb68d6ce9);     shift = (shift &lt;&lt; guard(var1));     shift = (shift &amp; 0xffffffff);     shift = (shift >> guard(var15));     state[3] = (state[3] ^ shift); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412\u00a0\u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0\u043a\u043e\u0434, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u0438\u043a\u0430\u043a \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u0430 \u0432\u00a0AddRoundKey \u043f\u0440\u044f\u043c\u043e \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0448\u0438\u0444\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0430\u00a0\u043d\u0430\u00a0\u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u043a\u043e\u043b\u043e 400\u00a0\u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430. \u0414\u043b\u044f\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0430\u00a0\u2014 \u0443\u00a0\u043c\u0435\u043d\u044f \u0432\u00a0crackme \u0432\u0441\u0435\u0433\u043e 12\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432\u00a0AddRoundKey \u0440\u0430\u0432\u043d\u043e 3675, \u0438 \u043f\u0440\u0438\u00a0\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0432\u0441\u0435, \u0447\u0442\u043e\u00a0\u0441\u0438\u043b\u044c\u043d\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430\u00a0\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (\u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u043e\u0441\u044c \u0441 13\u00a0\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u0434\u043e 17\u00a0\u0441\u0435\u043a\u0443\u043d\u0434). \u0422\u0430\u043a\u0436\u0435 \u044d\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430\u00a0\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0443\u00a0\u043c\u0435\u043d\u044f \u043e\u043d\u0430 \u0434\u043b\u0438\u0442\u0441\u044f \u043e\u043a\u043e\u043b\u043e 18\u00a0\u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p>\u0412\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a\u00a0\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438, \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0\u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0412\u00a0\u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u00a0\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0430\u043d\u043e\u043c\u0438\u0442\u044b.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/760672\/\"> https:\/\/habr.com\/ru\/articles\/760672\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<ul>\n<li>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/767900\/\" rel=\"noopener noreferrer nofollow\">\u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u043f\u043e\u043a\u0430\u0436\u0443, <s>\u043a\u0430\u043a\u00a0\u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043c\u0443\u043b\u044c\u0451\u043d\u044b \u043d\u0430\u00a0\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u0434\u0435\u0435!<\/s> \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0444\u0438\u0433\u043d\u044e. \u0412\u00a0\u0440\u0430\u043c\u043a\u0430\u0445 \u0446\u0438\u043a\u043b\u0430 \u0438\u0437\u00a0\u0442\u0440\u0451\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e crackme \u0434\u043b\u044f\u00a0linux amd64. \u0412\u043e\u0442 \u0434\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0447\u0435\u0440\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e crackme:<\/p>\n<ol>\n<li>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0430 \u0441\u0432\u043e\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c AES \u0441\u00a0\u0440\u0435\u0436\u0438\u043c\u043e\u043c CBC \u0438 256\u00a0\u0431\u0438\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c). \u041f\u0440\u0438\u00a0\u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043d\u0430 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0430\u00a0\u0432\u044b\u0437\u0432\u0430\u0432\u0448\u0430\u044f \u0435\u0451 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f\u00a0\u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0430\u043d\u043e\u043c\u0438\u0442\u044b.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0448\u0438\u0442\u044c crackme, \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441 <a href=\"https:\/\/github.com\/cyberfined\/nanomites\/releases\" rel=\"noopener noreferrer nofollow\">github<\/a>. \u0410\u00a0\u044f \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u044e \u043a\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e.<\/p>\n<h2>Whitebox AES<\/h2>\n<p>\u0421\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0438\u043a\u0431\u0435\u0439\u0442\u043d\u044b\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0438\u0437\u00a0\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 whitebox \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u044f \u043d\u0435\u00a0\u0438\u0437\u0443\u0447\u0430\u043b, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0434\u0430\u043b\u0435\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435\u00a0\u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u0434\u043b\u044f\u00a0\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. Whitebox \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u043a\u043e\u0434\u0443 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043f\u0443\u0441\u043a\u0430\u0439 \u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\/\u0438\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u043d\u0438\u0435), \u0438 \u0432\u0430\u043c \u043d\u0435\u00a0\u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u0438\u0437\u00a0\u043d\u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0438. \u0423\u00a0\u043c\u0435\u043d\u044f, \u0442\u0430\u043a\u043e\u0439 \u0446\u0435\u043b\u0438 \u043d\u0435\u00a0\u0441\u0442\u043e\u044f\u043b\u043e, \u043d\u0443\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e\u00a0\u043b\u0438\u0448\u044c \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u0440\u043e\u0441\u0442\u043e \u044f \u043d\u0435\u00a0\u0441\u043c\u043e\u0433 \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u0447\u0435\u043c whitebox AES.<\/p>\n<p>\u0412\u00a0\u0448\u0438\u0444\u0440\u0435 AES \u043a\u043b\u044e\u0447 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u0432\u00a0\u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0\u2014 AddRoundKey, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0451 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c (\u043a\u043e\u0434 \u0432\u0437\u044f\u0442 \u0438\u0437\u00a0\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f <a href=\"https:\/\/github.com\/kokke\/tiny-AES-c\" rel=\"noopener noreferrer nofollow\">tiny\u2011AES\u2011c<\/a>):<\/p>\n<pre><code class=\"cpp\">#define Nb 4 \/\/ \u0447\u0438\u0441\u043b\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 (32-\u0431\u0438\u0442\u043d\u044b\u0445 \u0441\u043b\u043e\u0432), \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 State.  void AddRoundKey(uint8_t round, state_t* state, const uint8_t* RoundKey) {   uint8_t i,j;   for (i = 0; i &lt; 4; ++i) {     for (j = 0; j &lt; 4; ++j) {       (*state)[i][j] ^= RoundKey[(round * Nb * 4) + (i * Nb) + j];     }   } }<\/code><\/pre>\n<p>\u041a\u0430\u043a\u00a0\u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c, \u043d\u0430\u0434 \u0431\u043b\u043e\u043a\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0447\u0430\u0441\u0442\u044c\u044e \u043a\u043b\u044e\u0447\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u0438\u043b\u0438, \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0447\u0430\u0441\u0442\u044c \u043a\u043b\u044e\u0447\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442\u00a0\u043d\u043e\u043c\u0435\u0440\u0430 \u0440\u0430\u0443\u043d\u0434\u0430. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443\u00a0\u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0447\u0435\u043d\u044c \u0442\u0443\u043f\u0430\u044f \u0438\u0434\u0435\u044f\u00a0\u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0446\u0438\u043a\u043b, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u0447\u0442\u043e\u2011\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0442\u0430\u043a\u043e\u0433\u043e:<\/p>\n<pre><code class=\"cpp\">void AddRoundKey(uint8_t round, state_t* _state) {   uint32_t *state = (uint32_t*)_state;   if(round == 0) {     state[0] ^= word_0_round_0;     state[1] ^= word_1_round_0;     state[2] ^= word_2_round_0;     state[3] ^= word_3_round_0;   } else if(round == 1) {     state[0] ^= word_0_round_1;     state[1] ^= word_1_round_1;     state[2] ^= word_2_round_1;     state[3] ^= word_3_round_1;   }   \/\/...   else if(round == 14) {     state[0] ^= word_0_round_14;     state[1] ^= word_1_round_14;     state[2] ^= word_2_round_14;     state[3] ^= word_3_round_14;   } }<\/code><\/pre>\n<p>\u0413\u0434\u0435 word_n_round_k\u00a0\u2014 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0438\u0437\u00a0\u043a\u043b\u044e\u0447\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u043b\u044e\u0447 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u00a0\u043a\u043e\u0434, \u0447\u0442\u043e\u00a0\u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435. \u0414\u0430\u043b\u0435\u0435 \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e\u00a0\u0438\u0437\u00a0\u043a\u043e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u044c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e\u00a0\u0431\u044b\u043b\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a\u00a0\u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 \u0432\u043d\u043e\u0441\u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u00a0\u0434\u0430\u043d\u043d\u044b\u0435, \u0430\u00a0\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0443\u043d\u0434\u043e\u0432\u00a0\u2014 \u043d\u0435\u0442. \u042f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0432\u0438\u0433\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u043d\u0434 \u043d\u0430 32\u00a0\u0431\u0438\u0442\u0430 \u0432\u043b\u0435\u0432\u043e \u0438\u043b\u0438\u00a0\u0432\u043f\u0440\u0430\u0432\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u0438\u043b\u0438\u00a0\u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0435\u00a0\u0438\u043c\u0435\u043b\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430. \u0412\u00a0\u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f AddRoundKey \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0435\u0441\u043b\u0438 n > 0, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 1. \/\/ \u0435\u0441\u043b\u0438 n &lt; 0, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 -1. \/\/ \u0435\u0441\u043b\u0438 n = 0, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 0. uint32_t sgn32(uint32_t n) {   return (-n>>31)-(n>>31); }  \/\/ \u0435\u0441\u043b\u0438 n = 0, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 0. \/\/ \u0435\u0441\u043b\u0438 n != 0, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 32. uint32_t guard(uint32_t n) {   uint32_t a = sgn32(n);   return ((a &amp; 1) | (a >> 31)) * 32; }  void AddRoundKey(uint32_t round, state_t* _state) {   uint32_t *state = (uint32_t*)_state;   uint32_t r0 = round ^ 0; \/\/ r0 = 0, \u0435\u0441\u043b\u0438 round = 0   uint32_t r1 = round ^ 1; \/\/ r1 = 0, \u0435\u0441\u043b\u0438 round = 1   \/\/...   uint32_t r14 = round ^ 14; \/\/ r14 = 0, \u0435\u0441\u043b\u0438 round = 14   \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c 64-\u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0434\u0432\u0438\u0433 \u0431\u043e\u043b\u0435\u0435, \u0447\u0435\u043c \u043d\u0430 31 \u0431\u0438\u0442,   \/\/ \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f undefined behavior \u0434\u043b\u044f 32-\u0431\u0438\u0442\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b.   uint64_t shift = 0;    \/\/ \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0443\u043d\u0434   shift = word_0_round_0;   \/\/ guard(r0) = 32, \u0435\u0441\u043b\u0438 r0 != 0.   \/\/ guard(r0) = 0, \u0435\u0441\u043b\u0438 r0 = 0.   shift &lt;&lt;= guard(r0);   state[0] ^= shift;   \/\/...    \/\/ \u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044b\u0439 \u0440\u0430\u0443\u043d\u0434   shift = word_0_round_14;   shift &lt;&lt;= guard(r14);   state[0] ^= shift; }<\/code><\/pre>\n<p>\u0423\u0436\u0435 \u043b\u0443\u0447\u0448\u0435, \u043d\u043e\u00a0\u0431\u0430\u0439\u0442\u044b \u043a\u043b\u044e\u0447\u0430 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043b\u0435\u0436\u0430\u0442 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c. \u0410\u00a0\u0447\u0442\u043e\u00a0\u0435\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0435 \u0438\u043b\u0438\u00a0\u0434\u043b\u044f\u00a0\u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u0432\u0441\u0435\u0433\u0434\u0430, \u0434\u043b\u044f\u00a0\u043f\u0435\u0440\u0432\u043e\u0433\u043e\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u00a0\u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430 \u0438 \u0434\u043e\u00a0\u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u043e\u0433\u043e, \u0434\u043b\u044f\u00a0\u0432\u0442\u043e\u0440\u043e\u0433\u043e\u00a0\u2014 \u043e\u0442\u00a0\u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438 \u0434\u043e\u00a0\u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u043e\u0433\u043e \u0438\u00a0\u0442.\u00a0\u0434. \u0422\u043e\u0433\u0434\u0430 \u0432\u00a0\u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e 4\u00a0\u0441\u043b\u043e\u0432\u0430 \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430. \u0422\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 AddRoundKey:<\/p>\n<pre><code class=\"cpp\">void AddRoundKey(uint32_t round, state_t* _state) {   uint32_t *state = (uint32_t*)_state;   uint32_t r0 = round ^ 0;   uint32_t r1 = round ^ 1;   \/\/...   uint32_t r14 = round ^ 14;   uint64_t shift = 0;    \/\/ \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0443\u043d\u0434   shift = word_0_round_0;   \/\/ guard \u0432\u0435\u0440\u043d\u0451\u0442 \u043d\u043e\u043b\u044c, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0432\u043d\u0430 \u043d\u0443\u043b\u044e   shift &lt;&lt;= guard(r0 * r1 * \/*...*\/ * r14);   state[0] ^= shift;   \/\/...    \/\/ \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0443\u043d\u0434   \/\/ (state[0] ^ word_0_round_0) ^ shift = state[0] ^ word_0_round_1   shift = word_0_round_0 ^ word_0_round_1;   \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0430\u0443\u043d\u0434\u043e\u0432, \u043a\u0440\u043e\u043c\u0435 \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e   shift &lt;&lt;= guard(r1 * r2 \/*...*\/ * r14);   shift[0] ^= shift;   \/\/ ...    \/\/ \u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044b\u0439 \u0440\u0430\u0443\u043d\u0434   shift = word_0_round_0 ^ word_0_round_1 ^ \/*...*\/ ^ word_0_round_13;   shift &lt;&lt;= guard(r14);   state[0] ^= shift; }<\/code><\/pre>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044f \u0432 shift \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 round, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">void AddRoundKey(uint32_t round, state_t* _state) {   uint32_t *state = (uint32_t*)_state;   uint32_t r0 = round ^ 0;   uint32_t r1 = round ^ 1;   \/\/...   uint32_t r14 = round ^ 14;   uint64_t shift = 0;    \/\/ \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0443\u043d\u0434   \/\/ \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e rotl((round + 0x12345678), 17) * 0x90801023 = word_0_round_0   shift = rotl((round + 0x12345678), 17) * 0x90801023;   shift &lt;&lt;= guard(r0 * r1 * \/*...*\/ * r14);   state[0] ^= shift;   \/\/...    \/\/ \u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044b\u0439 \u0440\u0430\u0443\u043d\u0434   \/\/ \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e (rotl(round, 11) ^ 0x546321) * 0x77889910 =   \/\/ word_0_round_0 ^ word_0_round_1 ^ ... ^ word_0_round_13;   shift = (rotl(round, 11) ^ 0x546321) * 0x77889910;   shift &lt;&lt;= guard(r14);   state[0] ^= shift; }<\/code><\/pre>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u043c\u043d\u0435 \u0432\u00a0\u0433\u043e\u043b\u043e\u0432\u0443\u00a0\u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u0442\u044c \u0440\u0430\u0443\u043d\u0434\u044b \u043c\u0435\u0441\u0442\u0430\u043c\u0438, \u0442.\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0434\u0443\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f\u00a0\u0448\u0435\u0441\u0442\u043e\u0433\u043e \u0440\u0430\u0443\u043d\u0434\u0430, \u043f\u043e\u0442\u043e\u043c \u0434\u043b\u044f\u00a0\u0434\u0435\u0441\u044f\u0442\u043e\u0433\u043e \u0438\u00a0\u0442.\u00a0\u0434. \u0412\u0438\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 AddRoundKey \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043d\u0435\u00a0\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f\u00a0\u043b\u0438\u0448\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432\u00a0\u043d\u0435\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043a\u043e\u0434\u0430 \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 (\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u044e \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 AddRoundKey \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430). \u041a\u0430\u043a\u00a0\u044f \u043f\u0438\u0441\u0430\u043b \u0440\u0430\u043d\u0435\u0435, \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430\u00a0\u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c AddRoundKey \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00a0\u043b\u0438\u0448\u044c \u0441\u00a0\u043e\u0434\u043d\u0438\u043c \u043a\u043b\u044e\u0447\u043e\u043c. \u0427\u0442\u043e\u00a0\u0436, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u0414\u0435\u043b\u0430\u0442\u044c \u043c\u044b \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0442\u0435\u043c\u00a0\u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c\u00a0\u2014 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0445 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0443\u00a0\u043d\u0430\u0441 \u043a\u043b\u044e\u0447\u0435\u0439 \u0432\u00a0\u043e\u0434\u043d\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e AddRoundKey, \u0430\u00a0\u0447\u0442\u043e\u0431\u044b \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u043d\u0443\u0436\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u0441\u0434\u0432\u0438\u0433\u0438, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u00a0\u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u00a0\u043e\u0442\u00a0\u043d\u043e\u043c\u0435\u0440\u0430 \u0440\u0430\u0443\u043d\u0434\u0430, \u0430\u00a0\u043e\u0442\u00a0\u0430\u0434\u0440\u0435\u0441\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 _state, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u00a0AddRoundKey \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u043d\u0430\u00a0\u0448\u0438\u0444\u0440\u0443\u0435\u043c\u0443\u044e \u0438\u043b\u0438\u00a0\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u043c\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f\u00a0\u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u0430\u0434\u0440\u0435\u0441\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041d\u043e\u00a0\u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435\u00a0\u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0440\u0435\u0436\u0438\u043c\u0430\u043c\u0438 AES, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, CTR \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u00a0\u0432\u044b\u0439\u0434\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0442\u0430\u043c \u0432 _state \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0441\u0447\u0451\u0442\u0447\u0438\u043a, \u0430\u00a0\u043d\u0435\u00a0\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u00a0\u043a\u0430\u043a\u0443\u044e\u2011\u043b\u0438\u0431\u043e \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0414\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c 0, \u0435\u0441\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0443, \u0438 33\u00a0\u0432\u00a0\u0438\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 (\u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u044e\u0449\u0435\u0435\u0441\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u044c\u044e \u0434\u0432\u043e\u0439\u043a\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0438\u0441\u0435\u043b, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u044f\u043c\u0438 \u0434\u0432\u043e\u0439\u043a\u0438, \u043f\u0440\u0438\u00a0\u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f 0).<\/p>\n<pre><code class=\"cpp\">int64_t sgn64(uint64_t n) {   uint64_t s = 63;   return (-n>>s)-(n>>s); }   uint32_t address_guard(uint64_t addr, uint64_t begin, uint64_t end) {   uint64_t a = sgn64((2 + sgn64(addr - begin)) * (2 + sgn64(end - addr)) - 4);   uint64_t s = 63;   a >>= s;   return a * 33; }<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b address_guard, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0432\u0435\u0434\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f: range = (2 + sgn64(addr &#8212; begin)) * (2 + sgn64(end &#8212; addr)) &#8212; 4, \u0447\u0442\u043e\u0431\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0431\u044b\u043b\u0430 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0448\u0438\u0440\u043e\u043a\u043e\u0439. \u041f\u0440\u043e\u0447\u0435\u0440\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0441\u043b\u043e\u0432\u0438\u044f addr &lt; begin \u0438 addr > end \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"181\" width=\"181\">\n<p>sgn64(addr &#8212; begin)<\/p>\n<\/th>\n<th data-colwidth=\"161\" width=\"161\">\n<p>sgn64(end &#8212; addr)<\/p>\n<\/th>\n<th>\n<p>range<\/p>\n<\/th>\n<th>\n<p>a<\/p>\n<\/th>\n<th>\n<p>a >> 63<\/p>\n<\/th>\n<th>\n<p>result<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">0 (addr = begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">0 (addr = end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">0 (addr = begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">1 (addr &lt; end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">0 (addr = begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">-1 (addr > end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">-2<\/p>\n<\/td>\n<td>\n<p align=\"left\">-1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">33<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">1 (addr > begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">0 (addr = end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">1 (addr > begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">1 (addr &lt; end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">1 (addr > begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">-1 (addr > end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">-1<\/p>\n<\/td>\n<td>\n<p align=\"left\">-1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">33<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">-1 (addr &lt; begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">0 (addr = end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">-1 (addr &lt; begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">1 (addr &lt; end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">-1<\/p>\n<\/td>\n<td>\n<p align=\"left\">-1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">33<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"181\" width=\"181\">\n<p align=\"left\">-1 (addr &lt; begin)<\/p>\n<\/td>\n<td data-colwidth=\"161\" width=\"161\">\n<p align=\"left\">-1 (addr > end)<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">0<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<td>\n<p align=\"left\">&#8212;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, address_guard \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 0, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0434\u0432\u0443\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 begin &lt;= addr &lt;= end, \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 33, \u0447\u0442\u043e \u043d\u0430\u043c \u0438 \u0431\u044b\u043b\u043e \u043d\u0443\u0436\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u0434 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 AddRoundKey, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0434\u0432\u0443\u043c\u044f \u043a\u043b\u044e\u0447\u0430\u043c\u0438. \u041f\u0435\u0440\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 0x401000 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 16 \u0431\u0430\u0439\u0442, \u0432\u0442\u043e\u0440\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 0x401020 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 48 \u0431\u0430\u0439\u0442:<\/p>\n<pre><code class=\"cpp\">void AddRoundKey(uint32_t round, state_t* _state) {   uint32_t *state = (uint32_t*)_state;   uint64_t addr = (uint64_t)state;   uint32_t r0 = round ^ 0;   uint32_t r1 = round ^ 1;   \/\/...   uint32_t r14 = round ^ 14;   uint32_t f0 = address_guard(addr, 0x401000, 0x401010);   uint32_t f1 = address_guard(addr, 0x401020, 0x401050);   uint64_t shift = 0;    \/\/ \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0443\u043d\u0434 \u043f\u0435\u0440\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   shift = rotl((round + 0x12345678), 17) * 0x90801023;   \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u043e\u0431\u0435\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439   shift &lt;&lt;= guard(r0 * r1 * \/*...*\/ * r14);   shift &lt;&lt;= guard(f0 * f1);   state[0] ^= shift;   \/\/...    \/\/ \u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044b\u0439 \u0440\u0430\u0443\u043d\u0434 \u043f\u0435\u0440\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438   shift = (rotl(round, 11) ^ 0x546321) * 0x77889910;   \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0434\u043b\u044f \u0447\u0435\u0442\u044b\u0440\u043d\u0430\u0434\u0446\u0430\u0442\u044b\u0445 \u0440\u0430\u0443\u043d\u0434\u043e\u0432 \u043e\u0431\u0435\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.   shift &lt;&lt;= guard(r14);   shift &lt;&lt;= guard(f0 * f1);   state[0] ^= shift;    \/\/ \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0443\u043d\u0434 <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-354725","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/354725","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=354725"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/354725\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=354725"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=354725"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=354725"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}