{"id":1562,"date":"2017-02-12T23:58:54","date_gmt":"2017-02-12T15:58:54","guid":{"rendered":"http:\/\/blog.dynox.cn\/?p=1562"},"modified":"2023-08-11T02:03:43","modified_gmt":"2023-08-10T18:03:43","slug":"aes%e6%a0%87%e5%87%86%e5%8f%8arijndael%e7%ae%97%e6%b3%95%e8%a7%a3%e6%9e%90","status":"publish","type":"post","link":"https:\/\/blog.dynox.cn\/?p=1562","title":{"rendered":"AES\u6807\u51c6\u53caRijndael\u7b97\u6cd5\u89e3\u6790"},"content":{"rendered":"<div class=\"gruber-markdown\"><h1>AES\u7b80\u4ecb<\/h1>\n<p>AES, Advanced Encryption Standard\uff0c\u5176\u5b9e\u662f\u4e00\u5957\u6807\u51c6\uff1a<a href=\"http:\/\/csrc.nist.gov\/publications\/fips\/fips197\/fips-197.pdf\">FIPS 197<\/a>\uff0c\u800c\u6211\u4eec\u6240\u8bf4\u7684AES\u7b97\u6cd5\u5176\u5b9e\u662fRijndael\u7b97\u6cd5\u3002<\/p>\n<p>NIST (National INstitute of Standards and Technology) \u57281997\u5e749\u670812\u65e5\u516c\u5f00\u5f81\u96c6\u66f4\u9ad8\u6548\u66f4\u5b89\u5168\u7684\u66ff\u4ee3DES\u52a0\u5bc6\u7b97\u6cd5\uff0c\u7b2c\u4e00\u8f6e\u5171\u670915\u79cd\u7b97\u6cd5\u5165\u9009\uff0c\u5176\u4e2d5\u79cd\u7b97\u6cd5\u5165\u56f4\u4e86\u51b3\u8d5b\uff0c\u5206\u522b\u662fMARS\uff0cRC6\uff0cRijndael\uff0cSerpent\u548cTwofish\u3002\u53c8\u7ecf\u8fc73\u5e74\u7684\u9a8c\u8bc1\u3001\u8bc4\u6d4b\u53ca\u516c\u4f17\u8ba8\u8bba\u4e4b\u540eRijndael\u7b97\u6cd5\u6700\u7ec8\u5165\u9009\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-Mind.png\" alt=\"\u601d\u7ef4\u5bfc\u56fe\" \/><\/p>\n<h2>Rijndael\u7b97\u6cd5<\/h2>\n<p>Rijndael\u7b97\u6cd5\u662f\u7531\u6bd4\u5229\u65f6\u5b66\u8005Joan Daemen\u548cVincent Rijmen\u6240\u63d0\u51fa\u7684\uff0c\u7b97\u6cd5\u7684\u540d\u5b57\u5c31\u7531\u4e24\u4f4d\u4f5c\u8005\u7684\u540d\u5b57\u7ec4\u5408\u800c\u6210\u3002Rijndael\u7684\u4f18\u52bf\u5728\u4e8e\u96c6\u5b89\u5168\u6027\u3001\u6027\u80fd\u3001\u6548\u7387\u3001\u53ef\u5b9e\u73b0\u6027\u53ca\u7075\u6d3b\u6027\u4e0e\u4e00\u4f53\u3002<\/p>\n<h2>Joan Daemen\u548cVincent Rijmen<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-Joan-Vincent.png\" alt=\"Joan Daemen & Vincent Rijmen\" \/><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-Joan.png\" alt=\"Joan Daemen\" \/><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-vincent.png\" alt=\"Vincent Rijmen\" \/><\/p>\n<h2>AES vs Rijndael<\/h2>\n<p>Rijndael\u7b97\u6cd5\u652f\u6301\u591a\u79cd\u5206\u7ec4\u53ca\u5bc6\u94a5\u957f\u5ea6\uff0c\u4ecb\u4e8e128-256\u4e4b\u95f4\u6240\u670932\u7684\u500d\u6570\u5747\u53ef\uff0c\u6700\u5c0f\u652f\u6301128\u4f4d\uff0c\u6700\u5927256\u4f4d\uff0c\u517125\u79cd\u7ec4\u5408\u3002\u800cAES\u6807\u51c6\u652f\u6301\u7684\u5206\u7ec4\u5927\u5c0f\u56fa\u5b9a\u4e3a128\u4f4d\uff0c\u5bc6\u94a5\u957f\u5ea6\u67093\u79cd\u9009\u62e9\uff1a128\u4f4d\u3001192\u4f4d\u53ca256\u4f4d\u3002<\/p>\n<h1>\u52a0\u5bc6\u5b9e\u4f8b<\/h1>\n<p>\u4e0b\u9762\u9488\u5bf916\u5b57\u8282\u7684\u7b80\u5355\u660e\u6587\u5b57\u4e32\u201c0011223344....eeff\u201d\uff0c\u5206\u522b\u7528AES-128\/AES-192\u53caAES-256\u8fdb\u884c\u52a0\u5bc6\u8fd0\u7b97\uff1a<\/p>\n<h2>AES-128<\/h2>\n<p>\u5bc6\u94a5\u9009\u752816\u5b57\u8282\u957f\u7684\u7b80\u5355\u5b57\u4e32\uff1a\u201c00010203....0e0f\u201d  \u6765\uff0c\u4e0a\u9762\u7684\u660e\u6587\u7ecf\u8fc7\u52a0\u5bc6\u53d8\u6362\u540e\u6210\u4e3a&quot;69c4e0d8....6089&quot;\u3002<\/p>\n<pre><code class=\"prettyprint\" class=\"language-assembly\">plain :  00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff\nkey   :  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\ncypher:  69 c4 e0 d8 6a 7b 04 30 d8 cd b7 80 70 b4 c5 5a<\/code><\/pre>\n<h2>AES-192<\/h2>\n<pre><code class=\"prettyprint\" class=\"language-assembly\">plain :  00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff\nkey   :  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d .. .. .. 17\ncypher:  dd a9 7c a4 86 4c df e0 6e af 70 a0 ec 0d 71 91<\/code><\/pre>\n<h2>AES-256<\/h2>\n<pre><code class=\"prettyprint\" class=\"language-assembly\">plain :  00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff\nkey   :  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d .. .. .. 17 .. .. .. 1f\ncypher:  8e a2 b7 ca 51 67 45 bf ea fc 49 90 4b 49 60 89<\/code><\/pre>\n<h1>\u603b\u4f53\u7ed3\u6784<\/h1>\n<p>Rijndael\u7b97\u6cd5\u662f\u57fa\u4e8e\u4ee3\u6362-\u7f6e\u6362\u7f51\u7edc\uff08SPN\uff0cSubstitution-permutation network\uff09\u7684\u8fed\u4ee3\u7b97\u6cd5\u3002\u660e\u6587\u6570\u636e\u7ecf\u8fc7\u591a\u8f6e\u6b21\u7684\u8f6c\u6362\u540e\u65b9\u80fd\u751f\u6210\u5bc6\u6587\uff0c\u6bcf\u4e2a\u8f6e\u6b21\u7684\u8f6c\u6362\u64cd\u4f5c\u7531\u8f6e\u51fd\u6570\u5b9a\u4e49\u3002\u8f6e\u51fd\u6570\u4efb\u52a1\u5c31\u662f\u6839\u636e\u5bc6\u94a5\u7f16\u6392\u5e8f\u5217\uff08\u5373\u8f6e\u5bc6\u7801\uff09\u5bf9\u6570\u636e\u8fdb\u884c\u4e0d\u540c\u7684\u4ee3\u6362\u53ca\u7f6e\u6362\u7b49\u64cd\u4f5c\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-Flow.png\" alt=\"AES & Rijndael Architecture\" \/><\/p>\n<p>\u56fe\u5de6\u4fa7\u4e3a\u8f6e\u51fd\u6570\u7684\u6d41\u7a0b\uff0c\u4e3b\u8981\u5305\u542b4\u79cd\u4e3b\u8981\u8fd0\u7b97\u64cd\u4f5c\uff1a\u5b57\u8282\u4ee3\u6362(SubByte)\u3001\u884c\u79fb\u4f4d(ShiftRow)\u3001\u5217\u6df7\u5408(MixColumn)\u3001\u8f6e\u5bc6\u94a5\u52a0(AddRoundKey)\u3002\u56fe\u53f3\u4fa7\u4e3a\u5bc6\u94a5\u7f16\u6392\u65b9\u6848\uff0c\u5728Rijndael\u4e2d\u79f0\u4e3a\u5bc6\u94a5\u6269\u5c55\u7b97\u6cd5\uff08KeyExpansion\uff09\u3002<\/p>\n<p>AES\u6807\u51c6\u7b97\u6cd5\u5c06128\u4f4d\u7684\u660e\u6587\uff0c\u4ee5\u7279\u5b9a\u6b21\u5e8f\u751f\u6210\u4e00\u4e2a4x4\u7684\u77e9\u9635\uff08\u6bcf\u4e2a\u5143\u7d20\u662f\u4e00\u4e2a\u5b57\u8282\uff0c8\u4f4d\uff09\uff0c\u5373\u521d\u59cb\u72b6\u6001\uff08state\uff09\uff0c\u7ecf\u7531\u8f6e\u51fd\u6570\u7684\u8fed\u4ee3\u8f6c\u6362\u4e4b\u540e\u53c8\u5c06\u4f5c\u4e3a\u4e0b\u4e00\u8f6e\u8fed\u4ee3\u7684\u8f93\u5165\u7ee7\u7eed\u53c2\u4e0e\u8fd0\u7b97\u76f4\u5230\u8fed\u4ee3\u7ed3\u675f\u3002<\/p>\n<p>Rijndael\u7b97\u6cd5\u652f\u6301\u5927\u4e8e128\u4f4d\u7684\u660e\u6587\u5206\u7ec4\uff0c\u6240\u4ee5\u9700\u8981\u5217\u6570\u66f4\u591a\u7684\u77e9\u9635\u6765\u63cf\u8ff0\u3002Rijndael\u8f6e\u51fd\u6570\u7684\u8fd0\u7b97\u662f\u5728\u7279\u6b8a\u5b9a\u4e49\u7684\u6709\u9650\u57dfGF(256)\u4e0a\u8fdb\u884c\u7684\u3002\u6709\u9650\u57df\uff08Finite Field\uff09\u53c8\u540d\u4f3d\u7f57\u74e6\u57df\uff08Galois field\uff09\uff0c\u7b80\u5355\u8a00\u4e4b\u5c31\u662f\u4e00\u4e2a\u6ee1\u8db3\u7279\u5b9a\u89c4\u5219\u7684\u96c6\u5408\uff0c\u96c6\u5408\u4e2d\u7684\u5143\u7d20\u53ef\u4ee5\u8fdb\u884c\u52a0\u51cf\u4e58\u9664\u8fd0\u7b97\uff0c\u4e14\u8fd0\u7b97\u7ed3\u679c\u4e5f\u662f\u5c5e\u4e8e\u6b64\u96c6\u5408\u3002\u66f4\u8be6\u7ec6\u6709\u6709\u5173Rijndael\u7b97\u6cd5\u7684\u6570\u5b66\u63cf\u8ff0\uff0c\u53ef\u4ee5\u53c2\u9605\u672c\u6587\u6700\u540e\u6240\u7f57\u5217\u7684\u53c2\u8003\u8d44\u6599\uff0c\u5728\u6b64\u4e0d\u505a\u71ac\u8ff0\u3002<\/p>\n<h2>\u8f6e\u51fd\u6570<\/h2>\n<p>\u6211\u4eec\u5df2\u7ecf\u5f97\u77e5\u8f6e\u51fd\u6570\u4e3b\u8981\u5305\u542b4\u79cd\u8fd0\u7b97\uff0c\u4f46\u4e0d\u540c\u7684\u8fd0\u7b97\u8f6e\u6240\u505a\u7684\u5177\u4f53\u8fd0\u7684\u7b97\u7ec4\u5408\u5e76\u4e0d\u76f8\u540c\u3002\u4e3b\u8981\u533a\u522b\u662f\u521d\u59cb\u8f6e\uff08Round: 0\uff09\u548c\u6700\u540e\u4e00\u8f6e\uff08Round: Nr\uff09\uff0c\u6240\u6709\u4e2d\u95f4\u8f6e\u7684\u8fd0\u7b97\u90fd\u662f\u76f8\u540c\u7684\uff0c\u4f1a\u4f9d\u6b21\u8fdb\u884c4\u79cd\u8fd0\u7b97\uff0c\u5373\uff1a<\/p>\n<ol>\n<li>\u5b57\u8282\u4ee3\u6362(SubByte)<\/li>\n<li>\u884c\u79fb\u4f4d(ShiftRow)<\/li>\n<li>\u5217\u6df7\u5408(MixColumn)<\/li>\n<li>\u8f6e\u5bc6\u94a5\u52a0(AddRoundKey)<\/li>\n<\/ol>\n<p>\u6839\u636eRinjdael\u7b97\u6cd5\u7684\u5b9a\u4e49\uff0c\u52a0\u5bc6\u8f6e\u6570\u4f1a\u9488\u5bf9\u4e0d\u540c\u7684\u5206\u7ec4\u53ca\u4e0d\u540c\u7684\u5bc6\u94a5\u957f\u5ea6\u9009\u62e9\u4e0d\u540c\u7684\u6570\u503c\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-cons.png\" alt=\"AES \u8fed\u4ee3\u8f6e\" \/><\/p>\n<p>AES\u6807\u51c6\u53ea\u652f\u6301128\u4f4d\u5206\u7ec4\uff08Nb = 4\uff09\u7684\u60c5\u51b5\u3002<\/p>\n<p>\u8f6e\u51fd\u6570\u7684\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff0c\u76f4\u63a5\u5b9e\u73b0\u5728\u52a0\u5bc6\u51fd\u6570\u5185\u90e8\u5faa\u73af\u4e2d\uff1a<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">int aes_encrypt(AES_CYPHER_T mode, uint8_t *data, int len, uint8_t *key)\n{\n    uint8_t w[4 * 4 * 15] = {0}; \/* round key *\/\n    uint8_t s[4 * 4] = {0}; \/* state *\/\n\n    int nr, i, j;\n\n    \/* key expansion *\/\n    aes_key_expansion(mode, key, w);\n\n    \/* start data cypher loop over input buffer *\/\n    for (i = 0; i &amp;lt; len; i += 4 * g_aes_nb[mode]) {\n\n        \/* init state from user buffer (plaintext) *\/\n        for (j = 0; j &amp;lt; 4 * g_aes_nb[mode]; j++)\n            s[j] = data[i + j];\n\n        \/* start AES cypher loop over all AES rounds *\/\n        for (nr = 0; nr &amp;lt;= g_aes_rounds[mode]; nr++) {\n\n            if (nr &amp;gt; 0) {\n\n                \/* do SubBytes *\/\n                aes_sub_bytes(mode, s);\n\n                \/* do ShiftRows *\/\n                aes_shift_rows(mode, s);\n\n                if (nr &amp;lt; g_aes_rounds[mode]) {\n                    \/* do MixColumns *\/\n                    aes_mix_columns(mode, s);\n                }\n            }\n\n            \/* do AddRoundKey *\/\n            aes_add_round_key(mode, s, w, nr);\n        }\n\n        \/* save state (cypher) to user buffer *\/\n        for (j = 0; j &amp;lt; 4 * g_aes_nb[mode]; j++)\n            data[i + j] = s[j];\n    }\n\n    return 0;\n}<\/code><\/pre>\n<h2>\u52a8\u753b\u6f14\u793a\u52a0\u5bc6\u8fc7\u7a0b<\/h2>\n<p>Enrique Zabala\u521b\u5efa\u4e86\u4e00\u4e2aAES-128\u52a0\u5bc6\u7b97\u6cd5\u7684\u52a8\u753b\u6f14\u793a\uff0c\u6e05\u695a\u3001\u76f4\u89c2\u5730\u4ecb\u7ecd\u4e86\u8f6e\u51fd\u6570\u6267\u884c\u7684\u8fc7\u7a0b\u3002<a href=\"http:\/\/www.formaestudio.com\/rijndaelinspector\/archivos\/Rijndael_Animation_v4_eng.swf\">\u70b9\u51fb\u53ef\u76f4\u63a5\u89c2\u770b<\/a>\u3002<\/p>\n<h2>\u8f6e\u51fd\u6570\u62c6\u89e3\uff1a\u5b57\u8282\u4ee3\u6362\uff08Substitute Bytes\uff09<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-SubBytes.png\" alt=\"AES:\u5b57\u8282\u66ff\u6362\" \/><\/p>\n<p>\u5b57\u8282\u4ee3\u6362\uff08SubBytes\uff09\u662f\u5bf9state\u77e9\u9635\u4e2d\u7684\u6bcf\u4e00\u4e2a\u72ec\u7acb\u5143\u7d20\u4e8e<strong>\u7f6e\u6362\u76d2<\/strong> \uff08Substitution-box\uff0cS\u76d2\uff09\u4e2d\u8fdb\u884c\u67e5\u627e\u5e76\u4ee5\u6b64\u66ff\u6362\u8f93\u5165\u72b6\u6001\u7684\u64cd\u4f5c\u3002\u5b57\u8282\u4ee3\u6362\u662f\u53ef\u9006\u7684\u975e\u7ebf\u6027\u53d8\u6362\uff0c\u4e5f\u662fAES\u8fd0\u7b97\u7ec4\u4e2d\u552f\u4e00\u7684\u975e\u7ebf\u6027\u53d8\u6362\u3002\u5b57\u8282\u4ee3\u6362\u9006\u64cd\u4f5c\u4e5f\u662f\u901a\u8fc7\u9006\u5411\u7f6e\u6362\u76d2\u7684\u67e5\u627e\u53ca\u66ff\u6362\u6765\u5b8c\u6210\u7684\u3002<\/p>\n<p>S\u76d2\u662f\u4e8b\u5148\u8bbe\u8ba1\u597d\u768416x16\u7684\u67e5\u8be2\u8868\uff0c\u5373256\u4e2a\u5143\u7d20\u3002\u5176\u8bbe\u8ba1\u4e0d\u662f\u968f\u610f\u7684\uff0c\u8981\u6839\u636e\u8bbe\u8ba1\u539f\u5219\u4e25\u683c\u8ba1\u7b97\u6c42\u5f97\uff0c\u4e0d\u7136\u65e0\u6cd5\u4fdd\u8bc1\u7b97\u6cd5\u7684\u5b89\u5168\u6027\u3002\u65e2\u7136\u662fS\u76d2\u662f\u8ba1\u7b97\u5f97\u6765\uff0c\u6240\u4ee5\u5b57\u8282\u4ee3\u6362\u7684\u64cd\u4f5c\u5b8c\u5168\u53ef\u4ee5\u901a\u8fc7\u8ba1\u7b97\u6765\u5b8c\u6210\uff0c\u4e0d\u8fc7\u901a\u8fc7S\u76d2\u67e5\u8868\u64cd\u4f5c\u66f4\u65b9\u4fbf\u5feb\u6377\uff0c\u56fe\u4e2d\u6240\u793a\u5c31\u662f\u901a\u8fc7S\u76d2\u67e5\u627e\u5bf9\u5e94\u5143\u7d20\u8fdb\u884c\u7684\u66ff\u6362\u64cd\u4f5c\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-sbox.jpg\" alt=\"AES S-BOX\" \/><\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">void aes_sub_bytes(AES_CYPHER_T mode, uint8_t *state)\n{\n    int i, j;\n\n    for (i = 0; i &amp;lt; g_aes_nb[mode]; i++) {\n        for (j = 0; j &amp;lt; 4; j++) {\n            state[i * 4 + j] = aes_sub_sbox(state[i * 4 + j]);\n        }\n    }\n}<\/code><\/pre>\n<p>\u5b9e\u4f8b\u8bf4\u660e\uff1a<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">   input:  00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0\n     sub:  63 ca b7 04 09 53 d0 51 cd 60 e0 e7 ba 70 e1 8c<\/code><\/pre>\n<h2>\u8f6e\u51fd\u6570\u62c6\u89e3\uff1a\u884c\u79fb\u4f4d\uff08Shift Rows\uff09<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-ShiftRows.png\" alt=\"AES: \u884c\u79fb\u4f4d\" \/><\/p>\n<p>\u884c\u79fb\u4f4d\u4e3b\u8981\u76ee\u7684\u662f\u5b9e\u73b0\u5b57\u8282\u5728\u6bcf\u4e00\u884c\u7684\u6269\u6563\uff0c\u5c5e\u4e8e\u7ebf\u6027\u53d8\u6362\u3002<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">void aes_shift_rows(AES_CYPHER_T mode, uint8_t *state)\n{\n    uint8_t *s = (uint8_t *)state;\n    int i, j, r;\n\n    for (i = 1; i &amp;lt; g_aes_nb[mode]; i++) {\n        for (j = 0; j &amp;lt; i; j++) {\n            uint8_t tmp = s[i];\n            for (r = 0; r &amp;lt; g_aes_nb[mode]; r++) {\n                s[i + r * 4] = s[i + (r + 1) * 4];\n            }\n            s[i + (g_aes_nb[mode] - 1) * 4] = tmp;\n        }\n    }\n}<\/code><\/pre>\n<p>\u5b9e\u4f8b\u8bf4\u660e\uff1a<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">     sub:  63 ca b7 04 09 53 d0 51 cd 60 e0 e7 ba 70 e1 8c\n   shift:  63 53 e0 8c 09 60 e1 04 cd 70 b7 51 ba ca d0 e7<\/code><\/pre>\n<h2>\u8f6e\u51fd\u6570\u62c6\u89e3\uff1a\u5217\u6df7\u5408\uff08Mix Columns\uff09<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-MixColumns.png\" alt=\"AES: \u5217\u6df7\u5408\" \/><\/p>\n<p>\u5217\u6df7\u5408\u662f\u901a\u8fc7\u5c06state\u77e9\u9635\u4e0e\u5e38\u77e9\u9635C\u76f8\u4e58\u4ee5\u8fbe\u6210\u5728\u5217\u4e0a\u7684\u6269\u6563\uff0c\u5c5e\u4e8e\u4ee3\u66ff\u53d8\u6362\u3002\u5217\u6df7\u5408\u662fRijndael\u7b97\u6cd5\u4e2d\u6700\u590d\u6742\u7684\u4e00\u6b65\uff0c\u5176\u5b9e\u8d28\u662f\u5728\u6709\u9650\u57dfGF(256)\u4e0a\u7684\u591a\u9879\u5f0f\u4e58\u6cd5\u8fd0\u7b97\u3002<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">void aes_mix_columns(AES_CYPHER_T mode, uint8_t *state)\n{\n    uint8_t y[16] = { 2, 3, 1, 1,  1, 2, 3, 1,  1, 1, 2, 3,  3, 1, 1, 2};\n    uint8_t s[4];\n    int i, j, r;\n\n    for (i = 0; i &amp;lt; g_aes_nb[mode]; i++) {\n        for (r = 0; r &amp;lt; 4; r++) {\n            s[r] = 0;\n            for (j = 0; j &amp;lt; 4; j++) {\n                s[r] = s[r] ^ aes_mul(state[i * 4 + j], y[r * 4 + j]);\n            }\n        }\n        for (r = 0; r &amp;lt; 4; r++) {\n            state[i * 4 + r] = s[r];\n        }\n    }\n}<\/code><\/pre>\n<p>\u5b9e\u4f8b\u8bf4\u660e\uff1a<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">   shift:  63 53 e0 8c 09 60 e1 04 cd 70 b7 51 ba ca d0 e7\n     mix:  5f 72 64 15 57 f5 bc 92 f7 be 3b 29 1d b9 f9 1a<\/code><\/pre>\n<h2>\u8f6e\u51fd\u6570\u62c6\u89e3\uff1a\u8f6e\u5bc6\u94a5\u52a0\uff08Add Round Key\uff09<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-AddRoundKey.png\" alt=\"AES & Rijndael Architecture\" \/><\/p>\n<p>\u5bc6\u94a5\u52a0\u662f\u5c06\u8f6e\u5bc6\u94a5\u7b80\u5355\u5730\u4e0e\u72b6\u6001\u8fdb\u884c\u9010\u6bd4\u7279\u5f02\u6216\u3002\u5b9e\u73b0\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">void aes_add_round_key(AES_CYPHER_T mode, uint8_t *state,\n                       uint8_t *round, int nr)\n{\n    uint32_t *w = (uint32_t *)round;\n    uint32_t *s = (uint32_t *)state;\n    int i;\n\n    for (i = 0; i &amp;lt; g_aes_nb[mode]; i++) {\n        s[i] ^= w[nr * g_aes_nb[mode] + i];\n    }\n}<\/code><\/pre>\n<p>\u5b9e\u4f8b\u8bf4\u660e\uff1a<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">     mix:  5f 72 64 15 57 f5 bc 92 f7 be 3b 29 1d b9 f9 1a\n   round:  d6 aa 74 fd d2 af 72 fa da a6 78 f1 d6 ab 76 fe\n   state:  89 d8 10 e8 85 5a ce 68 2d 18 43 d8 cb 12 8f e4<\/code><\/pre>\n<h2>\u5bc6\u94a5\u6269\u5c55\u7b97\u6cd5\uff08Key Expansion\uff09<\/h2>\n<p>\u5bc6\u94a5\u6269\u5c55\u7b97\u6cd5\u662fRijndael\u7684\u5bc6\u94a5\u7f16\u6392\u5b9e\u73b0\u7b97\u6cd5\uff0c\u5176\u76ee\u7684\u662f\u6839\u636e\u79cd\u5b50\u5bc6\u94a5\uff08\u7528\u6237\u5bc6\u94a5\uff09\u751f\u6210\u591a\u7ec4\u8f6e\u5bc6\u94a5\u3002\u8f6e\u5bc6\u94a5\u4e3a\u591a\u7ec4128\u4f4d\u5bc6\u94a5\uff0c\u5bf9\u5e94\u4e0d\u540c\u5bc6\u94a5\u957f\u5ea6\uff0c\u5206\u522b\u662f11\uff0c13\uff0c15\u7ec4\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-KeyExpansion.png\" alt=\"AES: \u5bc6\u94a5\u6269\u5c55\" \/><\/p>\n<p>\u5b9e\u73b0\u4ee3\u7801\uff1a<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">\/*\n * nr: number of rounds\n * nb: number of columns comprising the state, nb = 4 dwords (16 bytes)\n * nk: number of 32-bit words comprising cipher key, nk = 4, 6, 8 (KeyLength\/(4*8))\n *\/\n\nvoid aes_key_expansion(AES_CYPHER_T mode, uint8_t *key, uint8_t *round)\n{\n    uint32_t *w = (uint32_t *)round;\n    uint32_t  t;\n    int      i = 0;\n\n    do {\n        w[i] = *((uint32_t *)&amp;amp;key[i * 4 + 0]);\n    } while (++i &amp;lt; g_aes_nk[mode]);\n\n    do {\n        if ((i % g_aes_nk[mode]) == 0) {\n            t = aes_rot_dword(w[i - 1]);\n            t = aes_sub_dword(t);\n            t = t ^ aes_swap_dword(g_aes_rcon[i\/g_aes_nk[mode] - 1]);\n        } else if (g_aes_nk[mode] &amp;gt; 6 &amp;amp;&amp;amp; (i % g_aes_nk[mode]) == 4) {\n            t = aes_sub_dword(w[i - 1]);\n        } else {\n            t = w[i - 1];\n        }\n        w[i] = w[i - g_aes_nk[mode]] ^ t;\n\n    } while (++i &amp;lt; g_aes_nb[mode] * (g_aes_rounds[mode] + 1));\n\n    \/* key can be discarded (or zeroed) from memory *\/\n}<\/code><\/pre>\n<p>\u4ee5AES-128\u4e3a\u4f8b\uff0c\u4ece128\u4f4d\u79cd\u5b50\u5bc6\u94a5\u751f\u621011\u7ec4\u8f6e\u5bc6\u94a5\uff08\u6bcf\u7ec4128\u4f4d\uff09\uff1a<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">Input:\n    key :  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\nKey Expansion:\n    00:  rs: 00010203\n    01:  rs: 04050607\n    02:  rs: 08090a0b\n    03:  rs: 0c0d0e0f\n    04:  rot: 0d0e0f0c sub: d7ab76fe rcon: 01000000 xor: fe76abd6 rs: d6aa74fd\n    05:  equ: d6aa74fd rs: d2af72fa\n    06:  equ: d2af72fa rs: daa678f1\n    07:  equ: daa678f1 rs: d6ab76fe\n    08:  rot: ab76fed6 sub: 6238bbf6 rcon: 02000000 xor: f6bb3860 rs: b692cf0b\n    09:  equ: b692cf0b rs: 643dbdf1\n    10:  equ: 643dbdf1 rs: be9bc500\n    11:  equ: be9bc500 rs: 6830b3fe\n    12:  rot: 30b3fe68 sub: 046dbb45 rcon: 04000000 xor: 45bb6d00 rs: b6ff744e\n    13:  equ: b6ff744e rs: d2c2c9bf\n    14:  equ: d2c2c9bf rs: 6c590cbf\n    15:  equ: 6c590cbf rs: 0469bf41\n    16:  rot: 69bf4104 sub: f90883f2 rcon: 08000000 xor: f28308f1 rs: 47f7f7bc\n    17:  equ: 47f7f7bc rs: 95353e03\n    18:  equ: 95353e03 rs: f96c32bc\n    19:  equ: f96c32bc rs: fd058dfd\n    20:  rot: 058dfdfd sub: 6b5d5454 rcon: 10000000 xor: 54545d7b rs: 3caaa3e8\n    21:  equ: 3caaa3e8 rs: a99f9deb\n    22:  equ: a99f9deb rs: 50f3af57\n    23:  equ: 50f3af57 rs: adf622aa\n    24:  rot: f622aaad sub: 4293ac95 rcon: 20000000 xor: 95ac9362 rs: 5e390f7d\n    25:  equ: 5e390f7d rs: f7a69296\n    26:  equ: f7a69296 rs: a7553dc1\n    27:  equ: a7553dc1 rs: 0aa31f6b\n    28:  rot: a31f6b0a sub: 0ac07f67 rcon: 40000000 xor: 677fc04a rs: 14f9701a\n    29:  equ: 14f9701a rs: e35fe28c\n    30:  equ: e35fe28c rs: 440adf4d\n    31:  equ: 440adf4d rs: 4ea9c026\n    32:  rot: a9c0264e sub: d3baf72f rcon: 80000000 xor: 2ff7ba53 rs: 47438735\n    33:  equ: 47438735 rs: a41c65b9\n    34:  equ: a41c65b9 rs: e016baf4\n    35:  equ: e016baf4 rs: aebf7ad2\n    36:  rot: bf7ad2ae sub: 08dab5e4 rcon: 1b000000 xor: e4b5da13 rs: 549932d1\n    37:  equ: 549932d1 rs: f0855768\n    38:  equ: f0855768 rs: 1093ed9c\n    39:  equ: 1093ed9c rs: be2c974e\n    40:  rot: 2c974ebe sub: 71882fae rcon: 36000000 xor: ae2f8847 rs: 13111d7f\n    41:  equ: 13111d7f rs: e3944a17\n    42:  equ: e3944a17 rs: f307a78b\n    43:  equ: f307a78b rs: 4d2b30c5<\/code><\/pre>\n<h2>\u52a0\u5bc6\u8fc7\u7a0b\u5b9e\u4f8b<\/h2>\n<pre><code class=\"prettyprint\" class=\"language-c\">Encrypting block ...\n Round 0:\n   input:  00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff\n   round:  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n   state:  00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0\n Round 1:\n   input:  00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0\n     sub:  63 ca b7 04 09 53 d0 51 cd 60 e0 e7 ba 70 e1 8c\n   shift:  63 53 e0 8c 09 60 e1 04 cd 70 b7 51 ba ca d0 e7\n     mix:  5f 72 64 15 57 f5 bc 92 f7 be 3b 29 1d b9 f9 1a\n   round:  d6 aa 74 fd d2 af 72 fa da a6 78 f1 d6 ab 76 fe\n   state:  89 d8 10 e8 85 5a ce 68 2d 18 43 d8 cb 12 8f e4\n Round 2:\n   input:  89 d8 10 e8 85 5a ce 68 2d 18 43 d8 cb 12 8f e4\n     sub:  a7 61 ca 9b 97 be 8b 45 d8 ad 1a 61 1f c9 73 69\n   shift:  a7 be 1a 69 97 ad 73 9b d8 c9 ca 45 1f 61 8b 61\n     mix:  ff 87 96 84 31 d8 6a 51 64 51 51 fa 77 3a d0 09\n   round:  b6 92 cf 0b 64 3d bd f1 be 9b c5 00 68 30 b3 fe\n   state:  49 15 59 8f 55 e5 d7 a0 da ca 94 fa 1f 0a 63 f7\n Round 3:\n   input:  49 15 59 8f 55 e5 d7 a0 da ca 94 fa 1f 0a 63 f7\n     sub:  3b 59 cb 73 fc d9 0e e0 57 74 22 2d c0 67 fb 68\n   shift:  3b d9 22 68 fc 74 fb 73 57 67 cb e0 c0 59 0e 2d\n     mix:  4c 9c 1e 66 f7 71 f0 76 2c 3f 86 8e 53 4d f2 56\n   round:  b6 ff 74 4e d2 c2 c9 bf 6c 59 0c bf 04 69 bf 41\n   state:  fa 63 6a 28 25 b3 39 c9 40 66 8a 31 57 24 4d 17\n Round 4:\n   input:  fa 63 6a 28 25 b3 39 c9 40 66 8a 31 57 24 4d 17\n     sub:  2d fb 02 34 3f 6d 12 dd 09 33 7e c7 5b 36 e3 f0\n   shift:  2d 6d 7e f0 3f 33 e3 34 09 36 02 dd 5b fb 12 c7\n     mix:  63 85 b7 9f fc 53 8d f9 97 be 47 8e 75 47 d6 91\n   round:  47 f7 f7 bc 95 35 3e 03 f9 6c 32 bc fd 05 8d fd\n   state:  24 72 40 23 69 66 b3 fa 6e d2 75 32 88 42 5b 6c\n Round 5:\n   input:  24 72 40 23 69 66 b3 fa 6e d2 75 32 88 42 5b 6c\n     sub:  36 40 09 26 f9 33 6d 2d 9f b5 9d 23 c4 2c 39 50\n   shift:  36 33 9d 50 f9 b5 39 26 9f 2c 09 2d c4 40 6d 23\n     mix:  f4 bc d4 54 32 e5 54 d0 75 f1 d6 c5 1d d0 3b 3c\n   round:  3c aa a3 e8 a9 9f 9d eb 50 f3 af 57 ad f6 22 aa\n   state:  c8 16 77 bc 9b 7a c9 3b 25 02 79 92 b0 26 19 96\n Round 6:\n   input:  c8 16 77 bc 9b 7a c9 3b 25 02 79 92 b0 26 19 96\n     sub:  e8 47 f5 65 14 da dd e2 3f 77 b6 4f e7 f7 d4 90\n   shift:  e8 da b6 90 14 77 d4 65 3f f7 f5 e2 e7 47 dd 4f\n     mix:  98 16 ee 74 00 f8 7f 55 6b 2c 04 9c 8e 5a d0 36\n   round:  5e 39 0f 7d f7 a6 92 96 a7 55 3d c1 0a a3 1f 6b\n   state:  c6 2f e1 09 f7 5e ed c3 cc 79 39 5d 84 f9 cf 5d\n Round 7:\n   input:  c6 2f e1 09 f7 5e ed c3 cc 79 39 5d 84 f9 cf 5d\n     sub:  b4 15 f8 01 68 58 55 2e 4b b6 12 4c 5f 99 8a 4c\n   shift:  b4 58 12 4c 68 b6 8a 01 4b 99 f8 2e 5f 15 55 4c\n     mix:  c5 7e 1c 15 9a 9b d2 86 f0 5f 4b e0 98 c6 34 39\n   round:  14 f9 70 1a e3 5f e2 8c 44 0a df 4d 4e a9 c0 26\n   state:  d1 87 6c 0f 79 c4 30 0a b4 55 94 ad d6 6f f4 1f\n Round 8:\n   input:  d1 87 6c 0f 79 c4 30 0a b4 55 94 ad d6 6f f4 1f\n     sub:  3e 17 50 76 b6 1c 04 67 8d fc 22 95 f6 a8 bf c0\n   shift:  3e 1c 22 c0 b6 fc bf 76 8d a8 50 67 f6 17 04 95\n     mix:  ba a0 3d e7 a1 f9 b5 6e d5 51 2c ba 5f 41 4d 23\n   round:  47 43 87 35 a4 1c 65 b9 e0 16 ba f4 ae bf 7a d2\n   state:  fd e3 ba d2 05 e5 d0 d7 35 47 96 4e f1 fe 37 f1\n Round 9:\n   input:  fd e3 ba d2 05 e5 d0 d7 35 47 96 4e f1 fe 37 f1\n     sub:  54 11 f4 b5 6b d9 70 0e 96 a0 90 2f a1 bb 9a a1\n   shift:  54 d9 90 a1 6b a0 9a b5 96 bb f4 0e a1 11 70 2f\n     mix:  e9 f7 4e ec 02 30 20 f6 1b f2 cc f2 35 3c 21 c7\n   round:  54 99 32 d1 f0 85 57 68 10 93 ed 9c be 2c 97 4e\n   state:  bd 6e 7c 3d f2 b5 77 9e 0b 61 21 6e 8b 10 b6 89\n Round 10:\n   input:  bd 6e 7c 3d f2 b5 77 9e 0b 61 21 6e 8b 10 b6 89\n     sub:  7a 9f 10 27 89 d5 f5 0b 2b ef fd 9f 3d ca 4e a7\n   shift:  7a d5 fd a7 89 ef 4e 27 2b ca 10 0b 3d 9f f5 9f\n   round:  13 11 1d 7f e3 94 4a 17 f3 07 a7 8b 4d 2b 30 c5\n   state:  69 c4 e0 d8 6a 7b 04 30 d8 cd b7 80 70 b4 c5 5a\nOutput:\n  cypher:  69 c4 e0 d8 6a 7b 04 30 d8 cd b7 80 70 b4 c5 5a<\/code><\/pre>\n<h2>\u89e3\u5bc6\u8f6e\u51fd\u6570<\/h2>\n<p>\u5bf9Rijndael\u7b97\u6cd5\u6765\u8bf4\u89e3\u5bc6\u8fc7\u7a0b\u5c31\u662f\u52a0\u5bc6\u8fc7\u7a0b\u7684\u9006\u5411\u8fc7\u7a0b\uff0c\u5176\u89e3\u5bc6\u8f6e\u51fd\u6570\u5b9e\u73b0\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">int aes_decrypt(AES_CYPHER_T mode, uint8_t *data, int len, uint8_t *key)\n{\n    uint8_t w[4 * 4 * 15] = {0}; \/* round key *\/\n    uint8_t s[4 * 4] = {0}; \/* state *\/\n\n    int nr, i, j;\n\n    \/* key expansion *\/\n    aes_key_expansion(mode, key, w);\n\n    \/* start data cypher loop over input buffer *\/\n    for (i = 0; i &amp;lt; len; i += 4 * g_aes_nb[mode]) {\n\n        \/* init state from user buffer (cyphertext) *\/\n        for (j = 0; j &amp;lt; 4 * g_aes_nb[mode]; j++)\n            s[j] = data[i + j];\n\n        \/* start AES cypher loop over all AES rounds *\/\n        for (nr = g_aes_rounds[mode]; nr &amp;gt;= 0; nr--) {\n\n            \/* do AddRoundKey *\/\n            aes_add_round_key(mode, s, w, nr);\n\n            if (nr &amp;gt; 0) {\n                if (nr &amp;lt; g_aes_rounds[mode]) {\n                    \/* do MixColumns *\/\n                    inv_mix_columns(mode, s);\n                }\n\n                \/* do ShiftRows *\/\n                inv_shift_rows(mode, s);\n\n                \/* do SubBytes *\/\n                inv_sub_bytes(mode, s);\n            }\n        }\n\n        \/* save state (cypher) to user buffer *\/\n        for (j = 0; j &amp;lt; 4 * g_aes_nb[mode]; j++)\n            data[i + j] = s[j];\n    }\n\n    return 0;\n}<\/code><\/pre>\n<h2>\u89e3\u5bc6\u8fc7\u7a0b\u5b9e\u4f8b<\/h2>\n<pre><code class=\"prettyprint\" class=\"language-c\">Decrypting block ...\n Round 10:\n   input:  69 c4 e0 d8 6a 7b 04 30 d8 cd b7 80 70 b4 c5 5a\n   round:  13 11 1d 7f e3 94 4a 17 f3 07 a7 8b 4d 2b 30 c5\n   shift:  7a d5 fd a7 89 ef 4e 27 2b ca 10 0b 3d 9f f5 9f\n     sub:  7a 9f 10 27 89 d5 f5 0b 2b ef fd 9f 3d ca 4e a7\n   state:  bd 6e 7c 3d f2 b5 77 9e 0b 61 21 6e 8b 10 b6 89\n Round 9:\n   input:  bd 6e 7c 3d f2 b5 77 9e 0b 61 21 6e 8b 10 b6 89\n   round:  54 99 32 d1 f0 85 57 68 10 93 ed 9c be 2c 97 4e\n     mix:  e9 f7 4e ec 02 30 20 f6 1b f2 cc f2 35 3c 21 c7\n   shift:  54 d9 90 a1 6b a0 9a b5 96 bb f4 0e a1 11 70 2f\n     sub:  54 11 f4 b5 6b d9 70 0e 96 a0 90 2f a1 bb 9a a1\n   state:  fd e3 ba d2 05 e5 d0 d7 35 47 96 4e f1 fe 37 f1\n Round 8:\n   input:  fd e3 ba d2 05 e5 d0 d7 35 47 96 4e f1 fe 37 f1\n   round:  47 43 87 35 a4 1c 65 b9 e0 16 ba f4 ae bf 7a d2\n     mix:  ba a0 3d e7 a1 f9 b5 6e d5 51 2c ba 5f 41 4d 23\n   shift:  3e 1c 22 c0 b6 fc bf 76 8d a8 50 67 f6 17 04 95\n     sub:  3e 17 50 76 b6 1c 04 67 8d fc 22 95 f6 a8 bf c0\n   state:  d1 87 6c 0f 79 c4 30 0a b4 55 94 ad d6 6f f4 1f\n Round 7:\n   input:  d1 87 6c 0f 79 c4 30 0a b4 55 94 ad d6 6f f4 1f\n   round:  14 f9 70 1a e3 5f e2 8c 44 0a df 4d 4e a9 c0 26\n     mix:  c5 7e 1c 15 9a 9b d2 86 f0 5f 4b e0 98 c6 34 39\n   shift:  b4 58 12 4c 68 b6 8a 01 4b 99 f8 2e 5f 15 55 4c\n     sub:  b4 15 f8 01 68 58 55 2e 4b b6 12 4c 5f 99 8a 4c\n   state:  c6 2f e1 09 f7 5e ed c3 cc 79 39 5d 84 f9 cf 5d\n Round 6:\n   input:  c6 2f e1 09 f7 5e ed c3 cc 79 39 5d 84 f9 cf 5d\n   round:  5e 39 0f 7d f7 a6 92 96 a7 55 3d c1 0a a3 1f 6b\n     mix:  98 16 ee 74 00 f8 7f 55 6b 2c 04 9c 8e 5a d0 36\n   shift:  e8 da b6 90 14 77 d4 65 3f f7 f5 e2 e7 47 dd 4f\n     sub:  e8 47 f5 65 14 da dd e2 3f 77 b6 4f e7 f7 d4 90\n   state:  c8 16 77 bc 9b 7a c9 3b 25 02 79 92 b0 26 19 96\n Round 5:\n   input:  c8 16 77 bc 9b 7a c9 3b 25 02 79 92 b0 26 19 96\n   round:  3c aa a3 e8 a9 9f 9d eb 50 f3 af 57 ad f6 22 aa\n     mix:  f4 bc d4 54 32 e5 54 d0 75 f1 d6 c5 1d d0 3b 3c\n   shift:  36 33 9d 50 f9 b5 39 26 9f 2c 09 2d c4 40 6d 23\n     sub:  36 40 09 26 f9 33 6d 2d 9f b5 9d 23 c4 2c 39 50\n   state:  24 72 40 23 69 66 b3 fa 6e d2 75 32 88 42 5b 6c\n Round 4:\n   input:  24 72 40 23 69 66 b3 fa 6e d2 75 32 88 42 5b 6c\n   round:  47 f7 f7 bc 95 35 3e 03 f9 6c 32 bc fd 05 8d fd\n     mix:  63 85 b7 9f fc 53 8d f9 97 be 47 8e 75 47 d6 91\n   shift:  2d 6d 7e f0 3f 33 e3 34 09 36 02 dd 5b fb 12 c7\n     sub:  2d fb 02 34 3f 6d 12 dd 09 33 7e c7 5b 36 e3 f0\n   state:  fa 63 6a 28 25 b3 39 c9 40 66 8a 31 57 24 4d 17\n Round 3:\n   input:  fa 63 6a 28 25 b3 39 c9 40 66 8a 31 57 24 4d 17\n   round:  b6 ff 74 4e d2 c2 c9 bf 6c 59 0c bf 04 69 bf 41\n     mix:  4c 9c 1e 66 f7 71 f0 76 2c 3f 86 8e 53 4d f2 56\n   shift:  3b d9 22 68 fc 74 fb 73 57 67 cb e0 c0 59 0e 2d\n     sub:  3b 59 cb 73 fc d9 0e e0 57 74 22 2d c0 67 fb 68\n   state:  49 15 59 8f 55 e5 d7 a0 da ca 94 fa 1f 0a 63 f7\n Round 2:\n   input:  49 15 59 8f 55 e5 d7 a0 da ca 94 fa 1f 0a 63 f7\n   round:  b6 92 cf 0b 64 3d bd f1 be 9b c5 00 68 30 b3 fe\n     mix:  ff 87 96 84 31 d8 6a 51 64 51 51 fa 77 3a d0 09\n   shift:  a7 be 1a 69 97 ad 73 9b d8 c9 ca 45 1f 61 8b 61\n     sub:  a7 61 ca 9b 97 be 8b 45 d8 ad 1a 61 1f c9 73 69\n   state:  89 d8 10 e8 85 5a ce 68 2d 18 43 d8 cb 12 8f e4\n Round 1:\n   input:  89 d8 10 e8 85 5a ce 68 2d 18 43 d8 cb 12 8f e4\n   round:  d6 aa 74 fd d2 af 72 fa da a6 78 f1 d6 ab 76 fe\n     mix:  5f 72 64 15 57 f5 bc 92 f7 be 3b 29 1d b9 f9 1a\n   shift:  63 53 e0 8c 09 60 e1 04 cd 70 b7 51 ba ca d0 e7\n     sub:  63 ca b7 04 09 53 d0 51 cd 60 e0 e7 ba 70 e1 8c\n   state:  00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0\n Round 0:\n   input:  00 10 20 30 40 50 60 70 80 90 a0 b0 c0 d0 e0 f0\n   round:  00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n   state:  00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff\nOutput:\n   plain:  00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff<\/code><\/pre>\n<h1>\u7b97\u6cd5\u8bbe\u8ba1\u601d\u60f3<\/h1>\n<h2>\u52a0\u5bc6\u7b97\u6cd5\u7684\u4e00\u822c\u8bbe\u8ba1\u51c6\u5219<\/h2>\n<ul>\n<li>\u6df7\u6dc6 (Confusion)\n\u6700\u5927\u9650\u5ea6\u5730\u590d\u6742\u5316\u5bc6\u6587\u3001\u660e\u6587\u4e0e\u5bc6\u94a5\u4e4b\u95f4\u7684\u5173\u7cfb\uff0c\u901a\u5e38\u7528\u975e\u7ebf\u6027\u53d8\u6362\u7b97\u6cd5\u8fbe\u5230\u6700\u5927\u5316\u7684\u6df7\u6dc6\u3002<\/li>\n<li>\u6269\u6563 (Diffusion)\n\u660e\u6587\u6216\u5bc6\u94a5\u6bcf\u53d8\u52a8\u4e00\u4f4d\u5c06\u6700\u5927\u5316\u5730\u5f71\u54cd\u5bc6\u6587\u4e2d\u7684\u4f4d\u6570\uff0c\u901a\u5e38\u91c7\u7528\u7ebf\u6027\u53d8\u6362\u7b97\u6cd5\u8fbe\u5230\u6700\u5927\u5316\u7684\u6269\u6563\u3002<\/li>\n<\/ul>\n<h2>AES\u8bc4\u5224\u8981\u6c42<\/h2>\n<p>NIST\u5728\u5f81\u96c6\u7b97\u6cd5\u7684\u65f6\u5019\u5c31\u63d0\u51fa\u4e86\u51e0\u9879\u786c\u6027\u8981\u6c42\uff1a<\/p>\n<ul>\n<li>\u5206\u7ec4\u52a0\u5bc6\u7b97\u6cd5\uff1a\u652f\u6301128\u4f4d\u5206\u7ec4\u5927\u5c0f\uff0c128\/192\/256\u4f4d\u5bc6\u94a5<\/li>\n<li>\u5b89\u5168\u6027\u4e0d\u4f4e\u4e8e3DES\uff0c\u4f46\u5b9e\u65bd\u4e0e\u6267\u884c\u8981\u6bd43DES\u7684\u66f4\u9ad8\u6548<\/li>\n<li>\u4f18\u5316\u8fc7\u7684ANSI C\u7684\u5b9e\u73b0\u4ee3\u7801<\/li>\n<li>KAT(Known-Answer tests)\u53caMCT(Monte Carlo Tests)\u6d4b\u8bd5\u53ca\u9a8c\u8bc1<\/li>\n<li>\u8f6f\u4ef6\u53ca\u786c\u4ef6\u5b9e\u73b0\u7684\u4fbf\u6377<\/li>\n<li>\u53ef\u62b5\u5fa1\u5df2\u77e5\u653b\u51fb<\/li>\n<\/ul>\n<h2>Rijndael\u8bbe\u8ba1\u601d\u60f3<\/h2>\n<ol>\n<li>\u5b89\u5168\u6027\uff08Security\uff09\n\u7b97\u6cd5\u8db3\u591f\u5f3a\uff0c\u6297\u653b\u51fb<\/li>\n<li>\u7ecf\u6d4e\u6027\uff08Efficiency\uff09\n\u7b97\u6cd5\u8fd0\u7b97\u6548\u7387\u9ad8<\/li>\n<li>\u5bc6\u94a5\u6377\u53d8\uff08Key Agility\uff09\n\u66f4\u6539\u5bc6\u94a5\u6240\u5f15\u5165\u7684\u635f\u5931\u5c3d\u91cf\u5c0f\uff0c\u5373\u6700\u5c0f\u6d88\u8017\u7684\u5bc6\u94a5\u6269\u5c55\u7b97\u6cd5<\/li>\n<li>\u9002\u5e94\u6027 \uff08Versatility\uff09\n\u9002\u7528\u4e8e\u4e0d\u540c\u7684CPU\u67b6\u6784\uff0c\u8f6f\u4ef6\u6216\u786c\u4ef6\u5e73\u53f0\u7684\u5b9e\u73b0<\/li>\n<li>\u8bbe\u8ba1\u7b80\u5355\uff08Simplicity\uff09\n\u8f6e\u51fd\u6570\u7684\u8bbe\u8ba1\u7cbe\u7b80\uff0c\u53ea\u662f\u591a\u8f6e\u8fed\u4ee3<\/li>\n<\/ol>\n<h2>S\u76d2\u8bbe\u8ba1<\/h2>\n<p>S\u76d2\u662f\u7531\u4e00\u4e2a\u6709\u9650\u57dfGF(256)\u4e0a\u7684\u4e58\u6cd5\u6c42\u9006\u5e76\u4e32\u8054\u7ebf\u6027\u4eff\u5c04\u53d8\u6362\u6240\u6784\u9020\u51fa\u6765\u7684\uff0c\u4e0d\u662f\u4e00\u4e2a\u968f\u610f\u6784\u9020\u7684\u7b80\u5355\u67e5\u8be2\u8868\u3002\u56e0\u5176\u8fd0\u7b97\u590d\u6742\uff0c\u4f17\u591a\u7684AES \u8f6f\u4ef6\u53ca\u786c\u4ef6\u5b9e\u73b0\u76f4\u63a5\u4f7f\u7528\u4e86\u67e5\u627e\u8868(LUP, Look-up table)\uff0c\u4f46\u67e5\u8be2\u8868\u7684\u65b9\u5f0f\u5e76\u4e0d\u9002\u5408\u6240\u6709\u573a\u666f\uff0c\u9488\u5bf9\u7279\u5b9a\u7684\u786c\u4ef6\u6700\u5c0f\u5316\u9762\u79ef\u8bbe\u8ba1\u9700\u6c42\uff0c\u5219\u8981\u91c7\u7528\u4f18\u5316\u7684\u7ec4\u5408\u903b\u8f91\u4ee5\u5f97\u5230\u540c\u4ef7\u7684S\u76d2\u66ff\u6362\u3002<\/p>\n<h1>\u5de5\u4f5c\u6a21\u5f0f<\/h1>\n<p>\u5206\u7ec4\u52a0\u5bc6\u7b97\u6cd5\u662f\u6309\u5206\u7ec4\u5927\u5c0f\u6765\u8fdb\u884c\u52a0\u89e3\u5bc6\u64cd\u4f5c\u7684\uff0c\u5982DES\u7b97\u6cd5\u7684\u5206\u7ec4\u662f64\u4f4d\uff0c\u800cAES\u662f128\u4f4d\uff0c\u4f46\u5b9e\u9645\u660e\u6587\u7684\u957f\u5ea6\u4e00\u822c\u8981\u8fdc\u5927\u4e8e\u5206\u7ec4\u5927\u5c0f\uff0c\u8fd9\u6837\u7684\u60c5\u51b5\u5982\u4f55\u5904\u7406\u5462\uff1f<\/p>\n<p>\u8fd9\u6b63\u662f&quot;mode of operation&quot;\u5373\u5de5\u4f5c\u6a21\u5f0f\u8981\u89e3\u51b3\u7684\u95ee\u9898\uff1a\u660e\u6587\u6570\u636e\u6d41\u600e\u6837\u6309\u5206\u7ec4\u5927\u5c0f\u5207\u5206\uff0c\u6570\u636e\u4e0d\u5bf9\u9f50\u7684\u60c5\u51b5\u600e\u4e48\u5904\u7406\u7b49\u7b49\u3002<\/p>\n<p>\u65e9\u57281981\u5e74\uff0cDES\u7b97\u6cd5\u516c\u5e03\u4e4b\u540e\uff0cNIST\u5728\u6807\u51c6\u6587\u732eFIPS 81\u4e2d\u516c\u5e03\u4e864\u79cd\u5de5\u4f5c\u6a21\u5f0f\uff1a<\/p>\n<ul>\n<li>\n<p>\u7535\u5b50\u5bc6\u7801\u672c\uff1aElectronic Code Book Mode (ECB)<\/p>\n<\/li>\n<li>\n<p>\u5bc6\u7801\u5206\u7ec4\u94fe\u63a5\uff1aCipher Block Chaining Mode (CBC)<\/p>\n<\/li>\n<li>\n<p>\u5bc6\u6587\u53cd\u9988\uff1aCipher Feedback Mode (CFB)<\/p>\n<\/li>\n<li>\u8f93\u51fa\u53cd\u9988\uff1aOutput Feedback Mode (OFB)<\/li>\n<\/ul>\n<p>2001\u5e74\u53c8\u9488\u5bf9AES\u52a0\u5165\u4e86\u65b0\u7684\u5de5\u4f5c\u6a21\u5f0f\uff1a<\/p>\n<ul>\n<li>\u8ba1\u6570\u5668\u6a21\u5f0f\uff1aCounter Mode (CTR)<\/li>\n<\/ul>\n<p>\u540e\u6765\u53c8\u9646\u7eed\u5f15\u5165\u5176\u5b83\u65b0\u7684\u5de5\u4f5c\u6a21\u5f0f\u3002\u5728\u6b64\u4ec5\u4ecb\u7ecd\u51e0\u79cd\u5e38\u7528\u7684\uff1a<\/p>\n<h2>ECB\uff1a\u7535\u5b50\u5bc6\u7801\u672c\u6a21\u5f0f<\/h2>\n<p>ECB\u6a21\u5f0f\u53ea\u662f\u5c06\u660e\u6587\u6309\u5206\u7ec4\u5927\u5c0f\u5207\u5206\uff0c\u7136\u540e\u7528\u540c\u6837\u7684\u5bc6\u94a5\u6b63\u5e38\u52a0\u5bc6\u5207\u5206\u597d\u7684\u660e\u6587\u5206\u7ec4\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-ecb.png\" alt=\"AES: \u7535\u5b50\u5bc6\u7801\u672c\u6a21\u5f0f\" \/><\/p>\n<p>ECB\u7684\u7406\u60f3\u5e94\u7528\u573a\u666f\u662f\u77ed\u6570\u636e\uff08\u5982\u52a0\u5bc6\u5bc6\u94a5\uff09\u7684\u52a0\u5bc6\u3002\u6b64\u6a21\u5f0f\u7684\u95ee\u9898\u662f\u65e0\u6cd5\u9690\u85cf\u539f\u660e\u6587\u6570\u636e\u7684\u6a21\u5f0f\uff0c\u56e0\u4e3a\u540c\u6837\u7684\u660e\u6587\u5206\u7ec4\u52a0\u5bc6\u5f97\u5230\u7684\u5bc6\u6587\u4e5f\u662f\u4e00\u6837\u7684\u3002<\/p>\n<p>\u4e3e\u4f8b\u6765\u8bf4\u660e\uff0c\u4e0b\u56fe\u4e3a\u660e\u6587\u56fe\u7247\uff1a\n<img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-Leaf-Plain.png\" alt=\"AES: Leaf\u660e\u6587\" \/><\/p>\n<p>\u7ecfECB\u6a21\u5f0f\u52a0\u5bc6\u7684\u56fe\u7247\uff1a\n<img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-Leaf-ECB.png\" alt=\"AES: Leaf ECB\u52a0\u5bc6\" \/><\/p>\n<p>\u7ecfCBC\u6a21\u5f0f\u52a0\u5bc6\u7684\u56fe\u7247\uff1a\n<img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-Leaf-CBC.jpg\" alt=\"AES: Leaf CBC\u52a0\u5bc6\" \/><\/p>\n<h2>CBC\uff1a\u5bc6\u7801\u5206\u7ec4\u94fe\u63a5\u6a21\u5f0f<\/h2>\n<p>\u6b64\u6a21\u5f0f\u662f1976\u5e74\u7531IBM\u6240\u53d1\u660e\uff0c\u5f15\u5165\u4e86IV\uff08\u521d\u59cb\u5316\u5411\u91cf\uff1aInitialization Vector\uff09\u7684\u6982\u5ff5\u3002IV\u662f\u957f\u5ea6\u4e3a\u5206\u7ec4\u5927\u5c0f\u7684\u4e00\u7ec4\u968f\u673a\uff0c\u901a\u5e38\u60c5\u51b5\u4e0b\u4e0d\u7528\u4fdd\u5bc6\uff0c\u4e0d\u8fc7\u5728\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u9488\u5bf9\u540c\u4e00\u5bc6\u94a5\u4e0d\u5e94\u591a\u6b21\u4f7f\u7528\u540c\u4e00\u7ec4IV\u3002\nCBC\u8981\u6c42\u7b2c\u4e00\u4e2a\u5206\u7ec4\u7684\u660e\u6587\u5728\u52a0\u5bc6\u8fd0\u7b97\u524d\u5148\u4e0eIV\u8fdb\u884c\u5f02\u6216\uff1b\u4ece\u7b2c\u4e8c\u7ec4\u5f00\u59cb\uff0c\u6240\u6709\u7684\u660e\u6587\u5148\u4e0e\u524d\u4e00\u5206\u7ec4\u52a0\u5bc6\u540e\u7684\u5bc6\u6587\u8fdb\u884c\u5f02\u6216\u3002[\u533a\u5757\u94fe(blockchain)\u7684\u9f3b\u7956\uff01]<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-cbc.png\" alt=\"AES: \u5bc6\u7801\u5206\u7ec4\u94fe\u63a5\u6a21\u5f0f\" \/><\/p>\n<p>CBC\u6a21\u5f0f\u76f8\u6bd4ECB\u5b9e\u73b0\u4e86\u66f4\u597d\u7684\u6a21\u5f0f\u9690\u85cf\uff0c\u4f46\u56e0\u4e3a\u5176\u5c06\u5bc6\u6587\u5f15\u5165\u8fd0\u7b97\uff0c\u52a0\u89e3\u5bc6\u64cd\u4f5c\u65e0\u6cd5\u5e76\u884c\u64cd\u4f5c\u3002\u540c\u65f6\u5f15\u5165\u7684IV\u5411\u91cf\uff0c\u8fd8\u9700\u8981\u52a0\u3001\u89e3\u5bc6\u53cc\u65b9\u5171\u540c\u77e5\u6653\u65b9\u53ef\u3002<\/p>\n<p>\u5b9e\u73b0\u4ee3\u7801\uff1a<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">int aes_encrypt_cbc(AES_CYPHER_T mode, uint8_t *data, int len,\n                    uint8_t *key, uint8_t *iv)\n{\n    uint8_t w[4 * 4 * 15] = {0}; \/* round key *\/\n    uint8_t s[4 * 4] = {0}; \/* state *\/\n    uint8_t v[4 * 4] = {0}; \/* iv *\/\n\n    int nr, i, j;\n\n    \/* key expansion *\/\n    aes_key_expansion(mode, key, w);\n    memcpy(v, iv, sizeof(v));\n\n    \/* start data cypher loop over input buffer *\/\n    for (i = 0; i &amp;lt; len; i += 4 * g_aes_nb[mode]) {\n        \/* init state from user buffer (plaintext) *\/\n        for (j = 0; j &amp;lt; 4 * g_aes_nb[mode]; j++)\n            s[j] = data[i + j] ^ v[j];\n\n        \/* start AES cypher loop over all AES rounds *\/\n        for (nr = 0; nr &amp;lt;= g_aes_rounds[mode]; nr++) {\n\n            if (nr &amp;gt; 0) {\n\n                \/* do SubBytes *\/\n                aes_sub_bytes(mode, s);\n\n                \/* do ShiftRows *\/\n                aes_shift_rows(mode, s);\n\n                if (nr &amp;lt; g_aes_rounds[mode]) {\n                    \/* do MixColumns *\/\n                    aes_mix_columns(mode, s);\n                }\n            }\n\n            \/* do AddRoundKey *\/\n            aes_add_round_key(mode, s, w, nr);\n        }\n\n        \/* save state (cypher) to user buffer *\/\n        for (j = 0; j &amp;lt; 4 * g_aes_nb[mode]; j++)\n            data[i + j] = v[j] = s[j];\n    }\n\n    return 0;\n}<\/code><\/pre>\n<h2>CFB\uff1a\u5bc6\u6587\u53cd\u9988\u6a21\u5f0f<\/h2>\n<p>\u4e0eCBC\u6a21\u5f0f\u7c7b\u4f3c\uff0c\u4f46\u4e0d\u540c\u7684\u5730\u65b9\u5728\u4e8e\uff0cCFB\u6a21\u5f0f\u5148\u751f\u6210\u5bc6\u7801\u6d41\u5b57\u5178\uff0c\u7136\u540e\u7528\u5bc6\u7801\u5b57\u5178\u4e0e\u660e\u6587\u8fdb\u884c\u5f02\u6216\u64cd\u4f5c\u5e76\u6700\u7ec8\u751f\u6210\u5bc6\u6587\u3002\u540e\u4e00\u5206\u7ec4\u7684\u5bc6\u7801\u5b57\u5178\u7684\u751f\u6210\u9700\u8981\u524d\u4e00\u5206\u7ec4\u7684\u5bc6\u6587\u53c2\u4e0e\u8fd0\u7b97\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-cfb.png\" alt=\"AES: \u5bc6\u6587\u53cd\u9988\u6a21\u5f0f\" \/><\/p>\n<p>CFB\u6a21\u5f0f\u662f\u7528\u5206\u7ec4\u7b97\u6cd5\u5b9e\u73b0\u6d41\u7b97\u6cd5\uff0c\u660e\u6587\u6570\u636e\u4e0d\u9700\u8981\u6309\u5206\u7ec4\u5927\u5c0f\u5bf9\u9f50\u3002<\/p>\n<h2>OFB\uff1a\u8f93\u51fa\u53cd\u9988\u6a21\u5f0f<\/h2>\n<p>OFB\u6a21\u5f0f\u4e0eCFB\u6a21\u5f0f\u4e0d\u540c\u7684\u5730\u65b9\u662f\uff1a\u751f\u6210\u5b57\u5178\u7684\u65f6\u5019\u4f1a\u91c7\u7528\u660e\u6587\u53c2\u4e0e\u8fd0\u7b97\uff0cCFB\u91c7\u7528\u7684\u662f\u5bc6\u6587\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-ofb.png\" alt=\"AES: \u8f93\u51fa\u53cd\u9988\u6a21\u5f0f\" \/><\/p>\n<h2>CTR\uff1a\u8ba1\u6570\u5668\u6a21\u5f0f\u6a21\u5f0f<\/h2>\n<p>CTR\u6a21\u5f0f\u540c\u6837\u4f1a\u4ea7\u751f\u6d41\u5bc6\u7801\u5b57\u5178\uff0c\u4f46\u540c\u662f\u4f1a\u5f15\u5165\u4e00\u4e2a\u8ba1\u6570\uff0c\u4ee5\u4fdd\u8bc1\u4efb\u610f\u957f\u65f6\u95f4\u5747\u4e0d\u4f1a\u4ea7\u751f\u91cd\u590d\u8f93\u51fa\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-ctr.png\" alt=\"AES: \u8ba1\u6570\u5668\u6a21\u5f0f\" \/><\/p>\n<p>CTR\u6a21\u5f0f\u53ea\u9700\u8981\u5b9e\u73b0\u52a0\u5bc6\u7b97\u6cd5\u4ee5\u751f\u6210\u5b57\u5178\uff0c\u660e\u6587\u6570\u636e\u4e0e\u4e4b\u5f02\u6216\u540e\u5f97\u5230\u5bc6\u6587\uff0c\u53cd\u4e4b\u4fbf\u662f\u89e3\u5bc6\u8fc7\u7a0b\u3002CTR\u6a21\u5f0f\u53ef\u4ee5\u91c7\u7528\u5e76\u884c\u7b97\u6cd5\u5904\u7406\u4ee5\u63d0\u5347\u541e\u91cf\uff0c\u53e6\u5916\u52a0\u5bc6\u6570\u636e\u5757\u7684\u8bbf\u95ee\u53ef\u4ee5\u662f\u968f\u673a\u7684\uff0c\u4e0e\u524d\u540e\u4e0a\u4e0b\u6587\u65e0\u5173\u3002<\/p>\n<h2>CCM\uff1aCounter with CBC-MAC<\/h2>\n<p>CCM\u6a21\u5f0f\uff0c\u5168\u79f0\u662fCounter with Cipher Block Chaining-Message Authentication Code\uff0c\u662fCTR\u5de5\u4f5c\u6a21\u5f0f\u548cCMAC\u8ba4\u8bc1\u7b97\u6cd5\u7684\u7ec4\u5408\u4f53\uff0c\u53ef\u4ee5\u540c\u65f6\u6570\u636e\u52a0\u5bc6\u548c\u9274\u522b\u670d\u52a1\u3002<\/p>\n<p>\u660e\u6587\u6570\u636e\u901a\u8fc7CTR\u6a21\u5f0f\u52a0\u5bc6\u6210\u5bc6\u6587\uff0c\u7136\u540e\u5728\u5bc6\u6587\u540e\u9762\u518d\u9644\u52a0\u4e0a\u8ba4\u8bc1\u6570\u636e\uff0c\u6240\u4ee5\u6700\u7ec8\u7684\u5bc6\u6587\u4f1a\u6bd4\u660e\u6587\u8981\u957f\u3002\u5177\u4f53\u7684\u52a0\u5bc6\u6d41\u7a0b\u5982\u4e0b\u63cf\u8ff0\uff1a\u5148\u5bf9\u660e\u6587\u6570\u636e\u8ba4\u8bc1\u5e76\u4ea7\u751f\u4e00\u4e2atag\uff0c\u5728\u540e\u7eed\u52a0\u5bc6\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u6b64tag\u548cIV\u751f\u6210\u6821\u9a8c\u503cU\u3002\u7136\u540e\u7528CTR\u6a21\u5f0f\u6765\u52a0\u5bc6\u539f\u8f93\u5165\u660e\u6587\u6570\u636e\uff0c\u5728\u5bc6\u6587\u7684\u540e\u9762\u9644\u4e0a\u6821\u9a8c\u7801\uff35\u3002<\/p>\n<h2>GCM\uff1a\u4f3d\u7f57\u74e6\u8ba1\u6570\u5668\u6a21\u5f0f<\/h2>\n<p>\u7c7b\u578bCCM\u6a21\u5f0f\uff0cGCM\u6a21\u5f0f\u662fCTR\u548cGHASH\u7684\u7ec4\u5408\uff0cGHASH\u64cd\u4f5c\u5b9a\u4e49\u4e3a\u5bc6\u6587\u7ed3\u679c\u4e0e\u5bc6\u94a5\u4ee5\u53ca\u6d88\u606f\u957f\u5ea6\u5728GF\uff082^128\uff09\u57df\u4e0a\u76f8\u4e58\u3002GCM\u6bd4CCM\u7684\u4f18\u52bf\u662f\u5728\u4e8e\u66f4\u9ad8\u5e76\u884c\u5ea6\u53ca\u66f4\u597d\u7684\u6027\u80fd\u3002TLS 1.2\u6807\u51c6\u4f7f\u7528\u7684\u5c31\u662fAES-GCM\u7b97\u6cd5\uff0c\u5e76\u4e14Intel CPU\u63d0\u4f9b\u4e86GHASH\u7684\u786c\u4ef6\u52a0\u901f\u529f\u80fd\u3002<\/p>\n<h1>\u786c\u4ef6\u52a0\u901f<\/h1>\n<p>AES\u4f5c\u4e3a\u4e3b\u5bfc\u7684\u52a0\u5bc6\u6807\u51c6\uff0c\u5176\u5e94\u7528\u8d8a\u6765\u8d8a\u5e7f\u6cdb\uff0c\u7279\u522b\u662f\u9488\u5bf9\u7f51\u7edc\u6570\u636e\u7684\u52a0\u5bc6\u9700\u6c42\uff0c\u8d8a\u6765\u8d8a\u591a\u7684\u786c\u4ef6\u90fd\u96c6\u6210AES 128\/192\/256\u4f4d\u7b97\u6cd5\u53ca\u4e0d\u540c\u7684\u5de5\u4f5c\u6a21\u5f0f\u7684\u786c\u4ef6\u52a0\u901f\u7684\u5b9e\u73b0\u3002<\/p>\n<h2>AES_NI: X86\u67b6\u6784<\/h2>\n<p>Intel\u4e8e2010\u53d1\u53d1\u5e03\u4e86\u652f\u6301AES\u52a0\u901f\u7684CPU\uff0c\u5b9e\u73b0\u4e86\u9ad8\u9636\u7684AES\u52a0\u89e3\u5bc6\u6307\u4ee4\u5373AES_NI\uff1aAES New Instructions\u3002AES_NI\u5305\u542b6\u6307\u4ee4\uff1a\u5176\u4e2d4\u6761\u7528\u4e8e\u52a0\u89e3\u5bc6\uff0c2\u6761\u7528\u4e8e\u5bc6\u94a5\u6269\u5c55\u3002\u6839\u636e<a href=\"https:\/\/software.intel.com\/sites\/default\/files\/article\/165683\/aes-wp-2012-09-22-v01.pdf\">AES_NI\u767d\u76ae\u4e66<\/a>\u4e2d\u6240\u8bf4\uff0cAES_NI\u53ef\u4ee5\u5e26\u67652-3\u500d\u7684\u6027\u80fd\u63d0\u5347\u3002<\/p>\n<table>\n<thead>\n<tr>\n<th>Instruction<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>AESENC<\/td>\n<td>Perform one round of an AES encryption flow<\/td>\n<\/tr>\n<tr>\n<td>AESENCLAST<\/td>\n<td>Perform the last round of an AES encryption flow<\/td>\n<\/tr>\n<tr>\n<td>AESDEC<\/td>\n<td>Perform one round of an AES decryption flow<\/td>\n<\/tr>\n<tr>\n<td>AESDECLAST<\/td>\n<td>Perform the last round of an AES decryption flow<\/td>\n<\/tr>\n<tr>\n<td>AESKEYGENASSIST<\/td>\n<td>Assist in AES round key generation<\/td>\n<\/tr>\n<tr>\n<td>AESIMC<\/td>\n<td>Assist in AES Inverse Mix Columns<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u76ee\u524dOpenSSL\uff0cLinux's Crypto API\u4ee5\u53caWindows Cryptography API\u4e2d\u5747\u5df2\u52a0\u5165\u5bf9AES_NI\u7684\u652f\u6301\u3002<\/p>\n<h3>AES_NI: \u6d4b\u8bd5<\/h3>\n<p>\u6d4b\u8bd5\u73af\u5883\uff1a<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz 4 Cores with HyperThread (Enabled or Disabled)\nUbuntu 16.04 AMD64, OpenSSL 1.0.2g-fips  1 Mar 2016<\/code><\/pre>\n<p>\u6d4b\u8bd5\u65b9\u6cd5\uff1a<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">\u5173\u95ed\u786c\u4ef6\u52a0\u901f1\/2\/4\/8\u7ebf\u7a0bAES-256\/128-CBC\uff1a\nOPENSSL_ia32cap=&amp;quot;~0x200000200000000&amp;quot; openssl speed -multi {1\/2\/4\/8} -elapsed -evp {aes-256\/128-cbc}\n\n\u5f00\u542f\u786c\u4ef6\u52a0\u901f1\/2\/4\/8\u7ebf\u7a0bAES-256\/128-CBC\uff1a\nopenssl speed -multi {1\/2\/4\/8} -elapsed -evp {aes-256\/128-cbc}\n\n\u8d85\u7ebf\u7a0b\u7684\u5f00\u6237\u4e0e\u5173\u95ed\u53ea\u80fd\u901a\u8fc7UEFI\/BIOS\u6765\u8bbe\u7f6e\uff0c\u6d4b\u8bd5\u547d\u4ee4\u540c\u4e0a\u3002<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/blog.dynox.cn\/wp-content\/uploads\/2017\/02\/AES-Perf.png\" alt=\"AEAEAES: CPU\u52a0\u901f\u6027\u80fd\u5bf9\u6bd4\" \/><\/p>\n<p>\u4ece\u56fe\u4e2d\u53ef\u4ee5\u5f97\u5230\u5982\u4e0b\u7ed3\u8bba\uff1a<\/p>\n<ol>\n<li>AES_NI\u52a0\u901f\u53ef\u4ee5\u63d0\u5347\u6027\u80fd1\u500d\u591a\uff0cAESNI-128\u57fa\u672c\u4e0a\u90fd\u662fAES-128\u76842.2\u500d\u5de6\u53f3\u3002<\/li>\n<li>AES-128\u4e0eAES-256\u7684\u6027\u80fd\u6bd4\u57fa\u672c\u57281.36\u5de6\u53f3\uff0815\/11\uff0c\u5ffd\u7565\u5bc6\u94a5\u7f16\u6392\u7528\u65f6\u7684\u60c5\u51b5\u4e0b\uff09<\/li>\n<li>\u6bd4\u8f83\u6709\u8da3\u7684\u4e00\u70b9\u53d1\u73b0\u662f\uff0c\u8d85\u7ebf\u7a0b\u6240\u5e26\u6765\u7684\u5f71\u54cd\u6bd4\u9884\u60f3\u7684\u8981\u5927\u5f97\u591a\u3002\u9488\u5bf9\u9ad8\u5e76\u884c\u7684\u60c5\u5f62\uff0c\u5728\u5f00\u542fAES_NI\u65f6\u8d85\u7ebf\u7a0b\u53ef\u4ee5\u5e26\u6765\u63a5\u8fd11\u500d\u7684\u6027\u80fd\u63d0\u5347\uff1b\u4f46\u5728\u5173\u95edAES_NI\u7684\u60c5\u51b5\u4e0b\u5bf9\u6027\u80fd\u63d0\u5347\u7684\u8d21\u732e\u8981\u5c0f\u7684\u591a\u3002\u8d85\u7ebf\u7a0b\u867d\u7136\u903b\u8f91\u4e0a\u8ba9\u6211\u4eec\u89c9\u5f97\u4e00\u6838\u53d8\u6210\u4e86\u4e24\u6838\uff0c\u5176\u5b9e\u8d28\u53ea\u662f\u540c\u4e00\u7269\u7406\u6838\u4e0a\u7684\u961f\u5217\u7ba1\u7406\u673a\u5236\uff0c\u5173\u95edAES_NI\u7684\u60c5\u51b5\u4e0b\u7684\u6d4b\u8bd5\u6570\u636e\u57fa\u672c\u9a8c\u8bc1\u4e86\u8fd9\u4e00\u70b9\u3002\u53e6\u4e00\u65b9\u9762AES_NI\u786c\u4ef6\u52a0\u901f\u662f\u57fa\u4e8e\u7269\u7406\u6838\u7684\uff0c\u4e0d\u53ef\u80fd\u662f\u9488\u5bf9\u8d85\u7ebf\u7a0b\u7684\uff0c\u6240\u4ee5\u8d85\u7ebf\u7a0b\u4e0eAES_NI\u7ec4\u5408\u6240\u5e26\u6765\u7684\u5de8\u5927\u7684\u6027\u80fd\u63d0\u5347\u8ba9\u4eba\u6709\u4e9b\u8d39\u89e3\uff0c\u6bd4\u8f83\u53ef\u80fd\u7684\u89e3\u91ca\u662fAES_NI\u786c\u4ef6\u52a0\u901f\u5f15\u64ce\u7684\u6f5c\u529b\u8db3\u591f\u5f3a\u5927\u4ee5\u81f3\u4e8e\u4e00\u4e2a\u7269\u7406\u6838\u5fc3\u4e0d\u80fd\u5b8c\u5168\u53d1\u6325\u5176\u6548\u80fd\uff0c\u6240\u4ee5\u5728\u8d85\u7ebf\u7a0b\u5f00\u542f\u7684\u60c5\u51b5\u4e0b\u80fd\u6709\u66f4\u597d\u7684\u8868\u73b0\u3002<\/li>\n<\/ol>\n<h2>ARM\u53ca\u5176\u5b83\u4f53\u7cfb<\/h2>\n<p>2011\u5e74\u53d1\u5e03\u7684ARMv8-A\u5904\u7406\u5668\u67b6\u6784\u5f00\u59cb\u652f\u6301AES\u52a0\u901f\u6307\u4ee4\uff0c\u5176\u6307\u4ee4\u96c6\u4e0eAES_NI\u4e0d\u517c\u5bb9\u4f46\u5b9e\u73b0\u4e86\u7c7b\u4f3c\u7684\u529f\u80fd\u3002\u9664ARM\u5916\uff0cSUN SPARC(T4, T5, M5\u4ee5\u540e)\u53caIBM Power7+\u67b6\u6784\u7684CPU\u5747\u5df2\u652f\u6301AES\u52a0\u901f\u3002<\/p>\n<h1>\u5b9e\u73b0\u4e0a\u7684\u5b89\u5168\u6027\u8003\u8651<\/h1>\n<h2>\u5185\u5b58\u4e0e\u4ea4\u6362<\/h2>\n<p>\u7a0b\u5e8f\u5982\u679c\u5c06\u5bc6\u94a5\u5b58\u50a8\u5728\u53ef\u4ea4\u6362\u5185\u5b58\u9875\u4e2d\uff0c\u5728\u5185\u5b58\u5403\u7d27\u7684\u60c5\u51b5\u4e0b\u6709\u53ef\u80fd\u4f1a\u4ea4\u6362\u51fa\u6765\u5e76\u5199\u5165\u78c1\u76d8\u3002\u5982\u8f85\u4ee5\u4ee3\u7801\u9006\u5411\u7b49\uff0c\u5bc6\u94a5\u5f88\u6709\u53ef\u80fd\u4f1a\u6cc4\u9732\u3002<\/p>\n<p>\u5e94\u7528\u5c42\u6700\u597d\u7528mlock(Linux)\u6216VirtualLock(Windows)\u6765\u9632\u6b62\u5185\u5b58\u9875\u88ab\u4ea4\u6362\u81f3\u78c1\u76d8\u3002<\/p>\n<p>\u4f46\u56e0\u4e3a\u5bc6\u94a5\u5728\u5185\u5b58\u4e2d\uff0c\u6240\u4ee5\u4efb\u4f55\u80fd\u8bbf\u95ee\u5185\u5b58\u7684\u65b9\u5f0f\u5747\u6709\u53ef\u80fd\u5bfc\u81f4\u5bc6\u94a5\u7684\u6cc4\u6f0f\u3002\u66fe\u6d41\u884c\u7684\u4e00\u79cd\u653b\u51fb\u662f\u901a\u8fc71394 DMA\u65b9\u5f0f\u6765\u8bbf\u95ee\u76ee\u6807\u673a\u5185\u5b58\uff0cLinux\/Windows Login bypass\uff0cWindows bitlock\u7b49\u6f0f\u6d1e\u5747\u7531\u8d77\u5f15\u8d77\u3002\u8f83\u65b0\u7684CPU\u4e3a\u786c\u4ef6\u865a\u62df\u5316\u6240\u5f15\u5165\u7684IO MMU \uff08Intel VT-d or AMD-Vi\uff09\u53ef\u4ee5\u6709\u6548\u5730\u9650\u5236\u786c\u4ef6\u5bf9\u5185\u5b58\u7684\u8bbf\u95ee\u6743\u9650\u3002<\/p>\n<h2>\u4f20\u7edf\u653b\u51fb<\/h2>\n<p>AES\u4ece\u4ea7\u751f\u81f3\u4eca\u4f9d\u7136\u662f\u6700\u5b89\u5168\u7684\u52a0\u5bc6\u7b97\u6cd5\uff0c\u4f20\u7edf\u653b\u51fb\u624b\u6bb5\u4f9d\u7136\u65e0\u6cd5\u64bc\u52a8\u5176\u5b89\u5168\u6027\u3002\u867d\u7136\u5df2\u6709<a href=\"https:\/\/www.schneier.com\/blog\/archives\/2009\/07\/another_new_aes.html\">\u653b\u51fb\u624b\u6bb5<\/a>\u663e\u793a\u53ef\u4ee5\u5c06AES-256\u7684\u66b4\u529b\u641c\u7d22\u6b21\u6570\u4ece2^256\u6b21\u964d\u81f32^119\u6b21\uff0c\u4f46\u4f9d\u7136\u6ca1\u6709\u5b9e\u9645\u64cd\u4f5c\u4ef7\u503c\u3002<\/p>\n<p>\u4e0d\u8fc7\u968f\u7740\u8ba1\u7b97\u529b\u7684\u63d0\u5347\uff0c\u7279\u522b\u662f\u91cf\u5b50\u8ba1\u7b97\u673a\u7684\u53d1\u5c55\uff0cAES\u5c06\u4e0d\u518d\u662f\u5b89\u5168\u7684\u3002\u4e0d\u8fc7\u53ef\u4ee5\u80af\u5b9a\u7684\u662f\uff1a\u4e00\u5b9a\u4f1a\u51fa\u73b0\u66f4\u5b89\u5168\u7684\u52a0\u5bc6\u7b97\u6cd5\u3002<\/p>\n<h2>\u65c1\u8def\u653b\u51fb<\/h2>\n<p>\u65c1\u8def\u653b\u51fb\uff08Side-channel attack, SCA\uff09\u662f\u6307\u7ed5\u8fc7\u5bf9\u52a0\u5bc6\u7b97\u6cd5\u7684\u6b63\u9762\u5bf9\u6297\u53ca\u5206\u6790\uff0c\u5229\u7528\u786c\u4ef6\u5b9e\u73b0\u52a0\u5bc6\u7b97\u6cd5\u7684\u903b\u8f91\u7535\u8def\u5728\u8fd0\u7b97\u4e2d\u6240\u6cc4\u9732\u7684\u4fe1\u606f\uff0c\u5982\u6267\u884c\u65f6\u95f4\u3001\u529f\u8017\u3001\u7535\u78c1\u8f90\u5c04\u7b49\uff0c\u5e76\u7ed3\u5408\u7edf\u8ba1\u7406\u8bba\u6765\u5b9e\u73b0\u5bf9\u5bc6\u7801\u7cfb\u7edf\u653b\u51fb\u7684\u624b\u6bb5\u3002<\/p>\n<h3>\u65c1\u8def\u653b\u51fb\u6761\u4ef6<\/h3>\n<p>\u65c1\u8def\u653b\u51fb\u6210\u529f\u7684\u5fc5\u8981\u6761\u4ef6\uff1a<\/p>\n<ol>\n<li>\u5728\u6cc4\u6f0f\u7684\u7269\u7406\u4fe1\u53f7\u4e0e\u5904\u7406\u7684\u6570\u636e\u4e4b\u95f4\u5efa\u7acb\u5173\u8054<\/li>\n<li>\u5728\u4fe1\u606f\u6cc4\u6f0f\u6a21\u578b\u4e2d\u5904\u7406\u7684\u6570\u636e\u4e0e\u82af\u7247\u4e2d\u5904\u7406\u7684\u6570\u636e\u4e4b\u95f4\u5efa\u7acb\u5173\u8054<\/li>\n<\/ol>\n<p>\u667a\u80fd\u5361CPU\u7684\u5b9e\u73b0\u903b\u8f91\u76f8\u5bf9\u6bd4\u8f83\u7b80\u5355\uff0c\u5e76\u4e14\u90fd\u662f\u5355\u7ebf\u7a0b\u5904\u7406\u673a\u5236\uff0c\u56e0\u6b64\u53ef\u4ee5\u5f88\u597d\u7684\u5efa\u7acb\u8d77\u5bc6\u7801-\u65f6\u5e8f\u6216\u5bc6\u7801-\u529f\u8017\u4e4b\u95f4\u7684\u5173\u8054\u3002<\/p>\n<h3>\u65f6\u5e8f\u653b\u51fb<\/h3>\n<p>\u4e0d\u540c\u7684\u6570\u503c\u53ca\u4e0d\u540c\u7684\u8fd0\u7b97\u6240\u9700\u65f6\u95f4\u662f\u4e0d\u540c\u7684\uff0c\u5728\u7b97\u6cd5(\u8fd0\u7b97\u903b\u8f91)\u56fa\u5b9a\u7684\u524d\u63d0\u4e0b\u5b8c\u5168\u53ef\u4ee5\u6839\u636e\u8fd0\u884c\u65f6\u95f4\u53cd\u63a8\u51fa\u5177\u4f53\u7684\u64cd\u4f5c\u6570\u3002\u4e3e\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\uff1a<\/p>\n<pre><code class=\"prettyprint\" class=\"language-c\">if (strelen(passwd) != sizeof(fixed_passwd))\n  return 0;\n\nfor (i = 0; i &amp;lt; sizeof(fixed_passwd); i++)\n  if (passwd[i] != fixed_passwd[i])\n    return 0;<\/code><\/pre>\n<p>\u8fd9\u6bb5\u4ee3\u7801\u5728\u5bc6\u7801\u7684\u5224\u65ad\u4e0a\u5c31\u5b58\u5728\u65f6\u5e8f\u653b\u51fb\u7684\u6f0f\u6d1e\uff0c\u5982\u679c\u7b2c\u4e00\u4e2a\u5b57\u7b26\u4e0d\u5339\u914d\u5219\u76f4\u63a5\u9000\u51fa\uff0c\u53ea\u6709\u5728\u5f53\u524d\u5b57\u7b26\u5339\u914d\u7684\u60c5\u51b5\u4e0b\u624d\u4f1a\u7ee7\u7eed\u4e0b\u4e00\u4e2a\u5b57\u7b26\u7684\u6bd4\u8f83\u3002<\/p>\n<p>\u6240\u4ee5\u5982\u679c\u5b9e\u9645\u5bc6\u7801\u957f\u5ea6\u4e3a8\u4f4d\u4e14\u53ea\u80fd\u7528\u5b57\u6bcd\u53ca\u6570\u5b57\uff0c\u5219\u7406\u8bba\u4e0a\u66b4\u529b\u641c\u7d22\u6b21\u6570\u4e3a (26 <em>  2 + 10) ^ 8\u3002\u4f46\u56e0\u4e3a\u7b97\u6cd5\u7684\u5b9e\u73b0\u6ca1\u6709\u8003\u8651\u5230\u65f6\u5e8f\u653b\u51fb\uff0c\u5982\u679c\u5c06\u6267\u884c\u65f6\u95f4\u52a0\u5165\u8003\u91cf\uff0c\u5219\u641c\u7d22\u6b21\u6570\u5c06\u964d\u4f4e\u81f3(26 <\/em> 2 + 10) * 8\u3002<\/p>\n<p>\u672c\u6587\u793a\u4f8b\u4ee3\u7801\u4e2daes_mul()\u7684\u5b9e\u73b0\u4e5f\u6709\u65f6\u5e8f\u653b\u51fb\u7684\u6f0f\u6d1e\uff0c\u5e76\u4e14\u5b9e\u73b0\u6548\u7387\u4e5f\u6bd4\u8f83\u4f4e\uff0c\u5f53\u7136\u4e3b\u8981\u76ee\u7684\u662f\u4e3a\u4e86\u7b97\u6cd5\u6f14\u793a\u3002<\/p>\n<h3>\u529f\u8017\u653b\u51fb<\/h3>\n<p>\u5f53\u4fe1\u53f7\u53d1\u751f0-1\u8df3\u53d8\u65f6\uff0c\u9700\u8981\u7535\u6e90\u5bf9\u7535\u5bb9\u8fdb\u884c\u5145\u7535\uff1b\u800c\u5728\u5176\u5b83\u4e09\u79cd\u60c5\u51b5(0-0, 1-1, 1-0)\u4e0b\u5219\u4e0d\u4f1a\u8fdb\u884c\u5145\u7535\u64cd\u4f5c\uff0c\u56e0\u6b64\u53ef\u4ee5\u5f88\u5bb9\u6613\u533a\u5206\u51fa\u524d\u8005\u6765\uff0c\u8fd9\u5c31\u662f\u529f\u8017\u653b\u51fb\u539f\u7406\u7684\u7b80\u5355\u89e3\u91ca\u3002<\/p>\n<p>\u529f\u8017\u653b\u51fb\u4e00\u822c\u5206\u4e3a\u7b80\u5355\u529f\u8017\u653b\u51fb(Simple Power Analysis\uff0cSPA)\uff0c\u5dee\u5206\u529f\u8017\u653b\u51fb(Differential Power Analysis, DPA)\uff0c\u9ad8\u9636DPA\u7b49\u3002SPA\u53ef\u4ee5\u63ed\u793a\u51fa\u6267\u884c\u64cd\u4f5c\u548c\u80fd\u8017\u6cc4\u9732\u95f4\u7684\u5173\u7cfb\uff0c\u800cDPA\u5219\u80fd\u591f\u63ed\u793a\u51fa\u5904\u7406\u6570\u636e\u548c\u80fd\u8017\u6cc4\u9732\u95f4\u7684\u5173\u7cfb\u3002<\/p>\n<p>DPA\u5229\u7528\u4e0d\u540c\u6570\u636e\u5bf9\u5e94\u7684\u6761\u4ef6\u529f\u8017\u5206\u5e03\u7684\u5dee\u5f02\u8fdb\u884c\u7edf\u8ba1\u5206\u6790\u4ee5\u627e\u51fa\u6570\u503c\u4e0e\u529f\u8017\u7684\u5fae\u5f31\u5173\u8054\u6027\uff0c\u5e76\u5229\u7528\u6b64\u5173\u8054\u6027\u6781\u5927\u7684\u964d\u4f4e\u5bc6\u94a5\u7684\u641c\u7d22\u7a7a\u95f4\uff0c\u8fdb\u800c\u5b8c\u6210\u9ad8\u6548\u4e14\u4f4e\u6210\u672c\u7684\u653b\u51fb\u3002<\/p>\n<p>\u4e0a\u6d77\u4ea4\u5927\u7684\u6559\u6388<a href=\"http:\/\/yuyu.hk\/\">\u90c1\u6631<\/a>\u5c31\u901a\u8fc7\u529f\u8017\u653b\u51fb\u6210\u529f\u7834\u89e3\u4e86\u6765\u81ea\u591a\u5bb6\u624b\u673a\u5236\u9020\u5546\u4ee5\u53ca\u670d\u52a1\u4f9b\u5e94\u5546\u7684SIM\u5361\u7684\u5bc6\u94a5\u3002\u66f4\u8be6\u7ec6\u4fe1\u606f\u53ef\u89c1\u4e8e\u4ed6\u5728Blackhat 2015\u5e74\u7684<a href=\"http:\/\/yuyu.hk\/files\/us-15-Yu-Cloning-3G-4G-Sim-Cards.pdf\">\u6f14\u793a\u7a3f: Cloning 3G\/4G SIM Cards with a PC and an Oscilloscope: Lessons Learned in Physical Security<\/a>\u3002<\/p>\n<p>\u4ee5\u8272\u5217\u7279\u62c9\u7ef4\u592b\u5927\u5b66\u7684\u7814\u7a76\u4eba\u5458\u5229\u7528\u65c1\u8def\u653b\u51fb\uff0c\u6210\u529f\u4eceAndroid\u548ciOS\u8bbe\u5907\u4e0a\u7a83\u53d6\u5230\u7528\u4e8e\u52a0\u5bc6\u6bd4\u7279\u5e01\u94b1\u5305\u3001Apple Pay\u8d26\u53f7\u548c\u5176\u4ed6\u9ad8\u4ef7\u503c\u8d44\u4ea7\u7684\u5bc6\u94a5\uff0c\u8be6\u7ec6\u8bf7\u53c2\u9605<a href=\"https:\/\/www.cs.tau.ac.il\/~tromer\/mobilesc\/mobilesc.pdf\">\u8bba\u6587: ECDSA Key Extraction from Mobile Devices via Nonintrusive Physical Side Channels<\/a>\u3002<\/p>\n<h1>\u53c2\u8003\u8d44\u6599<\/h1>\n<ol>\n<li>\u5bc6\u7801\u5b66\u539f\u7406\u4e0e\u5b9e\u8df5(\u7b2c\u4e8c\u7248)\uff0cDouglas R. Stinson\uff0c<strong>\u51af\u767b\u56fd<\/strong>\u8bd1<\/li>\n<li><a href=\"http:\/\/csrc.nist.gov\/archive\/aes\/rijndael\/Rijndael-ammended.pdf\">AES Proposal: Rijndael by Joan Daemen and Vincent Rijmen<\/a><\/li>\n<li><a href=\"http:\/\/csrc.nist.gov\/publications\/fips\/fips197\/fips-197.pdf\">FIPS 197: <strong>Announcing the AES<\/strong> <\/a><\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Advanced_Encryption_Standard\">Advanced Encryption Standard - <strong>Wikipedia<\/strong><\/a><\/li>\n<li><a href=\"http:\/\/www.springer.com\/gp\/book\/9783540425809\">The Design of Rijndael by Joan Daemen &amp; Vincent Rijmen<\/a><\/li>\n<li>The Block Cipher Companion, <strong>L. Knudsen &amp; M. Robshaw<\/strong>, 2011<\/li>\n<li>\u52a0\u5bc6\u82af\u7247\u7684\u65c1\u9053\u653b\u51fb\u9632\u5fa1\u5bf9\u7b56\u7814\u7a76(\u535a\u58eb\u5b66\u4f4d\u8bba\u6587),  <strong>\u674e\u6d77\u519b<\/strong>, 2008<\/li>\n<li><a href=\"https:\/\/g2ex.github.io\/2016\/05\/31\/Power-Analysis-Attacks-on-Smart-Card\/\">\u65c1\u8def\u4e4b\u80fd\u91cf\u5206\u6790\u653b\u51fb\u603b\u7ed3<\/a><\/li>\n<li>AES\u7b97\u6cd5\u4ecb\u7ecd: <strong>\u4e07\u5929\u6dfb<\/strong>\uff0c2015\/3\/23<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/AES_instruction_set\">AES_NI - <strong>Wikipedia<\/strong><\/a><\/li>\n<li><a href=\"https:\/\/software.intel.com\/en-us\/articles\/intel-advanced-encryption-standard-aes-instructions-set\/\">AES_NI v3.01 - <strong>Intel<\/strong><\/a><\/li>\n<\/ol>\n<h1>\u76f8\u5173\u4ee3\u7801<\/h1>\n<ol>\n<li><a href=\"https:\/\/github.com\/matt-wu\/AES\/\">https:\/\/github.com\/matt-wu\/AES\/<\/a><\/li>\n<\/ol>\n<p>&lt;\u6700\u65e9\u7684\u624b\u5de5\u8ba1\u7b97AES-128\u7684\u60f3\u6cd5\u6e90\u4e8e2016\u5e74\u5e95\u8bfb\u8fc7\u7684\u4e00\u672c\u4e66\u300aHow Software Works: The Magic Behind Encryption ...\u300b\uff0c\u5728\u9605\u8bfb\u8fc7\u7a0b\u4e2d\u53d1\u73b0AES\u4e00\u8282\u4e2d\u7684\u6570\u636e\u5168\u5bf9\u4e0d\u4e0a\uff0c\u7136\u540e\u4e8e17\u5e74\u521d\u5f00\u59cb\u7ffb\u9605AES\u53caRijndael\u7b97\u6cd5\u6807\u51c6\u7b49\u8d44\u6599\uff0c\u7b49\u770b\u5b8c\u6240\u6709\u6587\u6863\u540e\u624d\u53d1\u73b0\u6b64\u4e66\u5bf9AES\u7684\u4ecb\u7ecd\u771f\u662f\u7b80\u5316\u5f97\u6ca1\u8fb9\u4e86\uff0c\u540e\u6765\u53c8\u505a\u4e86\u5927\u91cf\u7684\u5ef6\u4f38\u9605\u8bfb\uff0c\u6625\u8282\u671f\u95f4\u6839\u636eFIPS 197\u53ca\u300aThe Design of Rijndael\u300b\u5b9e\u73b0\u4e86AES 128\/192\/256 ECB\/CBC\u7684\u8ba1\u7b97\u8fc7\u7a0b\uff0c\u4e4b\u540e\u5f00\u59cb\u672cblog\u7684\u4e66\u5199\uff0c\u4e2d\u95f4\u65ad\u65ad\u7eed\u7eed\u76f4\u81f3\u4eca\u65e5\u624d\u5b8c\u5de5\uff0c\u672c\u6587\u4f30\u8ba1\u7528\u65f6\u7ea640\u5c0f\u65f6\u3002\u5b66\u4e60\u4ece\u6765\u4e0d\u662f\u5bb9\u6613\u7684\u4e8b\uff01\u4f46\u8d8a\u662f\u4e0d\u5bb9\u6613\u7684\u4e8b\u60c5\u505a\u8d77\u6765\u624d\u66f4\u6709\u4e50\u8da3\uff01&gt;<\/p><\/div>","protected":false},"excerpt":{"rendered":"<p>AES\u7b80\u4ecb AES, Advanced Encryption Standard\uff0c\u5176\u5b9e\u662f\u4e00\u5957\u6807\u51c6\uff1aFIPS 19 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[8,9],"tags":[599,604,601,600,602,603],"views":4409,"_links":{"self":[{"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=\/wp\/v2\/posts\/1562"}],"collection":[{"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1562"}],"version-history":[{"count":6,"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=\/wp\/v2\/posts\/1562\/revisions"}],"predecessor-version":[{"id":1733,"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=\/wp\/v2\/posts\/1562\/revisions\/1733"}],"wp:attachment":[{"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1562"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1562"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.dynox.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1562"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}