{"id":50,"date":"2026-04-14T15:17:03","date_gmt":"2026-04-14T07:17:03","guid":{"rendered":"https:\/\/www.seekinthevortex.cn\/?p=50"},"modified":"2026-04-14T15:17:03","modified_gmt":"2026-04-14T07:17:03","slug":"ctf%e4%b8%ad%e4%b8%80%e4%ba%9b%e5%8a%a0%e5%af%86%e7%ae%97%e6%b3%95%e4%bb%a3%e7%a0%81%e7%9a%84%e4%bb%8b%e7%bb%8d","status":"publish","type":"post","link":"https:\/\/www.seekinthevortex.cn\/index.php\/2026\/04\/14\/ctf%e4%b8%ad%e4%b8%80%e4%ba%9b%e5%8a%a0%e5%af%86%e7%ae%97%e6%b3%95%e4%bb%a3%e7%a0%81%e7%9a%84%e4%bb%8b%e7%bb%8d\/","title":{"rendered":"CTF\u4e2d\u4e00\u4e9b\u52a0\u5bc6\u7b97\u6cd5\u4ee3\u7801\u7684\u4ecb\u7ecd"},"content":{"rendered":"<h1>\u788e\u788e\u5ff5<\/h1>\n<p>\u6700\u8fd1\u8d8a\u53d1\u89c9\u5f97\u5bf9\u5e38\u7528\u52a0\u5bc6\u7b97\u6cd5\u7684\u7814\u7a76\u6bd4\u8f83\u7c97\u7cd9,\u501f\u7740\u5b8c\u5584\u793e\u56e2\u6587\u6863\u7684\u673a\u4f1a,\u518d\u7ee7\u7eed\u4fee\u6539\u4e00\u4e0b\u6211\u7684\u6587\u7ae0.<\/p>\n<h1>\u4e00\u4e9b\u524d\u7f6e\u5c0f\u77e5\u8bc6<\/h1>\n<h1>\u4e3a\u4ec0\u4e48\u9700\u8981\u52a0\u5bc6\u6a21\u5f0f<\/h1>\n<p>\u50cf RC6 \u8fd9\u6837\u7684\u5206\u7ec4\u52a0\u5bc6\u7b97\u6cd5\uff0c\u662f\u56fa\u5b9a\u957f\u5ea6\u52a0\u5bc6\u7684\uff1a<\/p>\n<ul>\n<li>RC6-32\/20\/16 \u6bcf\u6b21\u53ea\u80fd\u52a0\u5bc6 <strong>128 bit\uff0816 \u5b57\u8282\uff09<\/strong> \u6570\u636e\u5757<\/li>\n<li>\u5982\u679c\u660e\u6587\u8d85\u8fc7 16 \u5b57\u8282\uff0c\u5c31\u5fc5\u987b\u628a\u6570\u636e\u5207\u6210\u5757\uff0c\u7136\u540e\u7528\u4e00\u5b9a\u7684\u201c\u6a21\u5f0f\uff08mode\uff09\u201d\u6765\u5904\u7406\u591a\u5757\u6570\u636e<\/li>\n<li>\u4e0d\u540c\u6a21\u5f0f\u4f1a\u5f71\u54cd\u5b89\u5168\u6027\u548c\u52a0\u5bc6\u7ed3\u679c\u7684\u53ef\u9884\u6d4b<br \/>\n\u5e38\u89c1\u7684\u51e0\u79cd\u6a21\u5f0f\uff1aECB, CBC, CFB, OFB, CTR &#8230;<br \/>\n\u6211\u4eec\u73b0\u4e3b\u5728\u4e3b\u8981\u770b <strong>ECB<\/strong> \u548c <strong>CBC<\/strong> \u4e24\u79cd\u4e3b\u8981\u7684\u52a0\u5bc6\u65b9\u5f0f<\/li>\n<\/ul>\n<h2>\u4e8c\u3001ECB \u6a21\u5f0f<\/h2>\n<ul>\n<li>\u628a\u660e\u6587\u5206\u6210\u4e00\u4e2a\u4e2a 16 \u5b57\u8282\u7684\u72ec\u7acb\u5757<\/li>\n<li>\u6bcf\u4e2a\u5757<strong>\u5355\u72ec\u7528\u5bf9\u5e94\u7684\u52a0\u5bc6<\/strong>\uff08\u4e92\u4e0d\u5f71\u54cd\uff09<\/li>\n<li>\u89e3\u5bc6\u65f6\u4e5f\u662f\u6bcf\u5757\u72ec\u7acb\u89e3\u5bc6<\/li>\n<\/ul>\n<h2>\u4e09\u3001CBC \u6a21\u5f0f<\/h2>\n<p><strong>\u5de5\u4f5c\u539f\u7406<\/strong><\/p>\n<ol>\n<li>\u7b2c\u4e00\u4e2a\u660e\u6587\u5757 <code>P1<\/code> \u5148\u4e0e\u4e00\u4e2a <strong>\u521d\u59cb\u5316\u5411\u91cf IV\uff08\u968f\u673a\uff09<\/strong> \u5f02\u6216\uff0c\u518d\u52a0\u5bc6<\/li>\n<li>\u6bcf\u4e2a\u540e\u7eed\u5757 <code>Pi<\/code> \u5728\u52a0\u5bc6\u524d\u5148\u4e0e<strong>\u524d\u4e00\u4e2a\u5bc6\u6587\u5757 Ci-1<\/strong> \u8fdb\u884c\u5f02\u6216\uff0c\u7136\u540e\u518d\u52a0\u5bc6<\/li>\n<li>\u89e3\u5bc6\u65f6\u53cd\u8fc7\u6765\uff1a\u5148\u89e3\u5bc6\uff0c\u518d\u5f02\u6216\u524d\u4e00\u5757\u5bc6\u6587\u6216 IV<\/li>\n<\/ol>\n<pre><code class=\"language-cpp\">\u52a0\u5bc6:  C1 = E( P1 \u2295 IV )\n\t   Ci = E( Pi \u2295 Ci-1 )\n\n\u89e3\u5bc6:  P1 = D( C1 ) \u2295 IV\n       Pi = D( Ci ) \u2295 Ci-1\n<\/code><\/pre>\n<h2>\u56db\u3001PKCS#7 \u81ea\u52a8\u8865\u9f50<\/h2>\n<h3>\u4e3a\u4ec0\u4e48\u8981\u8865\u9f50<\/h3>\n<ul>\n<li>\u5206\u7ec4\u52a0\u5bc6\u7b97\u6cd5\u9700\u8981\u56fa\u5b9a\u5757\u5927\u5c0f\uff0c\u6bd4\u5982 RC6 \u4e00\u6b21\u53ea\u80fd\u52a0\u5bc6 16 \u5b57\u8282<\/li>\n<li>\u5982\u679c\u660e\u6587\u4e0d\u662f 16 \u5b57\u8282\u7684\u6574\u6570\u500d\uff0c\u5c31\u9700\u8981\u8865\u9f50\u5230\u6574\u5757\u5927\u5c0f<\/li>\n<li>\u5373\u4f7f\u521a\u597d\u5bf9\u9f50\uff0c\u4e5f\u8981\u8865\u4e00\u5757\uff0c\u4ee5\u9632\u6b62\u89e3\u5bc6\u65f6\u65e0\u6cd5\u5224\u65ad\u586b\u5145\u957f\u5ea6<\/li>\n<\/ul>\n<h3>PKCS#7 \u89c4\u5219<\/h3>\n<ul>\n<li>\u5047\u8bbe\u8981\u8865 k \u4e2a\u5b57\u8282\uff0c\u5c31\u7528 <strong>k<\/strong> \u4f5c\u4e3a\u586b\u5145\u5b57\u8282\u7684\u503c<\/li>\n<li>\u6bcf\u4e2a\u586b\u5145\u5b57\u8282\u90fd\u76f8\u540c<\/li>\n<li>\u6700\u5c11\u8865 1 \u4e2a\u5b57\u8282\uff0c\u6700\u591a\u8865 16 \u4e2a\u5b57\u8282<\/li>\n<\/ul>\n<p><strong>\u4e3e\u4f8b<\/strong><br \/>\n\u5757\u5927\u5c0f 16 \u5b57\u8282\uff0c\u660e\u6587\u957f\u5ea6 13 \u5b57\u8282\uff1a<\/p>\n<pre><code class=\"language-cpp\">\u660e\u6587:    [41 42 43 44 45 46 47 48 49 4A 4B 4C 4D]\n\u586b\u5145:    [03 03 03]  \u2190\uff083 \u4e2a\u5b57\u8282\uff0c\u503c\u4e3a 03\uff09\n\u660e\u6587:    [41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 03 03 03]\n\u603b\u957f\u5ea6:  16 \u5b57\u8282\n<\/code><\/pre>\n<h3>\u4ee3\u7801\u5b9e\u73b0<\/h3>\n<pre><code class=\"language-cpp\">#include &lt;stdio.h&gt;\n#include &lt;stdint.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;cstddef&gt;\n#include &lt;cstring&gt;\n\n\/**\n * \u53c2\u6570\uff1a\n *   data         - \u6307\u5411\u539f\u59cb\u6570\u636e\u7684\u6307\u9488\uff08\u4e0d\u4fee\u6539\u8be5\u6307\u9488\u5185\u5bb9\uff09\n *   data_len     - \u539f\u59cb\u6570\u636e\u957f\u5ea6\uff08\u5b57\u8282\uff09\n *   block_size   - \u5757\u5927\u5c0f\uff08\u5b57\u8282\uff09\uff0c\u4f8b\u5982 AES \u4e3a 16\n *   padded_data  - \u8f93\u51fa\u53c2\u6570\uff1a\u8fd4\u56de\u5206\u914d\u7684\u586b\u5145\u540e\u6570\u636e\u6307\u9488 \uff08\u8c03\u7528\u8005\u8d1f\u8d23 free\uff09\n *   padded_len   - \u8f93\u51fa\u53c2\u6570\uff1a\u8fd4\u56de\u586b\u5145\u540e\u6570\u636e\u7684\u957f\u5ea6\uff08\u5b57\u8282\uff09\n *\/\nvoid pkcs7_pad(uint8_t *data, size_t data_len, size_t block_size, uint8_t **padded_data, size_t *padded_len) {\n    size_t pad_len = block_size - (data_len % block_size); \/\/ \u8ba1\u7b97\u9700\u8981\u586b\u5145\u7684\u5b57\u8282\n\n    *padded_len = data_len + pad_len; \/\/ \u8ba1\u7b97\u586b\u5145\u540e\u7684\u603b\u957f\u5ea6,\u662f16\u7684\u500d\u6570\n    *padded_data = (uint8_t *)malloc(*padded_len); \/\/ \u5206\u914d\u65b0\u7684\u5185\u5b58\n\n    if (*padded_data == NULL) {\n        fprintf(stderr, &quot;Memory allocation failed\\n&quot;);\n        exit(1);\n    }\n    memcpy(*padded_data, data, data_len);\n    for (size_t i = 0; i &lt; pad_len; i++) {\n        (*padded_data)[data_len + i] = (uint8_t)pad_len;\n    }\n}\n\nint main(void) {\n    uint8_t data[] = { 0x01, 0x02, 0x03, 0x04, 0x05 }; \/\/ \u539f\u59cb\u6570\u636e\n    size_t block_size = 16; \/\/ \u5757\u5927\u5c0f\n    uint8_t *padded_data = NULL;\n    size_t padded_len = 0;\n\n    pkcs7_pad(data, sizeof(data), block_size, &amp;padded_data, &amp;padded_len);\n\n    printf(&quot;Original data length: %zu\\n&quot;, sizeof(data));\n    printf(&quot;Padded data length: %zu\\n\\n&quot;, padded_len);\n\n    printf(&quot;No padded data: &quot;);\n    for (size_t i = 0; i &lt; sizeof(data); i++) {\n        printf(&quot;%02X &quot;, data[i]);\n    }\n    puts(&quot;\\n&quot;);\n\n    printf(&quot;Padded data: &quot;);\n    for (size_t i = 0; i &lt; padded_len; i++) {\n        printf(&quot;%02X &quot;, padded_data[i]);\n    }\n\n\tfree(padded_data);\n\treturn 0;\n}\n\n\/*\nOriginal data length: 5\nPadded data length: 16\n\nNo padded data: 01 02 03 04 05\n\nPadded data: 01 02 03 04 05 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B\n*\/\n<\/code><\/pre>\n<h1>\u4e3b\u8981\u7684\u7b97\u6cd5\u4ecb\u7ecd<\/h1>\n<h2>Tea\/XTea\/XXTea\/IDEA\/RC4\/RC5\/RC6\/AES\/DES\/IDEA\/MD5\/SHA256\/SHA1\u7b49\u52a0\u5bc6\u7b97\u6cd5<\/h2>\n<h1>TEA\u7cfb\u5217\u7b97\u6cd5<\/h1>\n<h2>\u53c2\u6570\u89e3\u6790<\/h2>\n<p>\u4e00\u79cd\u7b80\u5355\u7684\u5c0f\u578b\u52a0\u5bc6\u65b9\u5f0f,\u6807\u51c6\u8f6e\u6570\u4e3a32\u8f6e<\/p>\n<ul>\n<li>\u5206\u7ec4\u5927\u5c0f: 64\u4f4d (8\u5b57\u8282)<\/li>\n<li>\u5bc6\u94a5\u5927\u5c0f: 128\u4f4d (16\u5b57\u8282)<\/li>\n<\/ul>\n<p><a href=\"https:\/\/www.cnblogs.com\/zpchcbd\/p\/15974293.html\">https:\/\/www.cnblogs.com\/zpchcbd\/p\/15974293.html<\/a><br \/>\n\u53ef\u4ee5\u53c2\u7167\u8fd9\u7bc7\u535a\u5ba2\uff0c\u5199\u7684\u6bd4\u8f83\u8be6\u7ec6<\/p>\n<h2>\u6d41\u7a0b\u5206\u6790<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251102173601.png\" alt=\"image.png|300\"><\/p>\n<p>(\u7ea2\u5706\u5f62\u5341\u5b57\u4e3a\u5f02\u6216, \u7eff\u8272\u65b9\u5f62\u5341\u5b57\u4e3a\u52a0)<\/p>\n<p>\u6839\u636e\u7b97\u6cd5\u6d41\u7a0b\u56fe\u53ef\u4ee5\u770b\u51fa<\/p>\n<ul>\n<li>\u5c06\u8f93\u5165\u5206\u6210\u4e24\u5757,\u79f0\u4e3av[0],v[1]<\/li>\n<li>\u5bf9v[1]\u8fdb\u884c\u4e09\u6b21\u5904\u7406(\u4f4d\u79fb\u8fd0\u7b97\u4e0e\u548c\u8fd0\u7b97)\u540e\u4e09\u8005\u5f02\u6216\u5f97\u5230\u4e2d\u95f4\u503c<\/li>\n<li>v[0]\u52a0\u4e0a\u4e2d\u95f4\u503c\u5f97\u5230\u65b0v[0]<\/li>\n<li>\u5bf9v[1]\u8fdb\u884c\u76f8\u540c\u7684\u5904\u7406\u5f97\u5230\u65b0v[1]<\/li>\n<li>\u91cd\u590d32\u8f6e<\/li>\n<\/ul>\n<p>\u6ce8\u610f: \u56fe\u4e2d\u7684Delta\u8868\u793a\u6bcf\u4e00\u8f6e\u7684sum\u503c\u52a0\u4e0aDelta<\/p>\n<h2>\u6807\u51c6TEA<\/h2>\n<pre><code class=\"language-cpp\">#include &lt;stdio.h&gt;\n#include &lt;stdint.h&gt;\n#include &lt;cstring&gt;\n\/\/\u52a0\u5bc6\u51fd\u6570\n\nvoid encrypt (uint32_t* value, uint32_t* key) {\n\n    uint32_t v0=value[0], v1=value[1], sum=0, i;           \/* set up *\/\n    uint32_t delta=0x9e3779b9;                \n    uint32_t k0=key[0], k1=key[1], k2=key[2], k3=key[3];   \/* cache key *\/\n\n    for (i=0; i &lt; 32; i++) {                       \/* basic cycle start *\/\n        sum += delta;\n        v0 += ((v1&lt;&lt;4) + k0) ^ (v1 + sum) ^ ((v1&gt;&gt;5) + k1);\n        v1 += ((v0&lt;&lt;4) + k2) ^ (v0 + sum) ^ ((v0&gt;&gt;5) + k3);\n    }                                              \/* end cycle *\/\n    value[0]=v0; value[1]=v1;\n}\n\n\/\/\u89e3\u5bc6\u51fd\u6570\n\nvoid decrypt (uint32_t* value, uint32_t* key) {\n\n    uint32_t v0=value[0], v1=value[1], sum=0xC6EF3720, i; \n    uint32_t delta=0x9e3779b9;                     \n    uint32_t k0=key[0], k1=key[1], k2=key[2], k3=key[3]; \n\n    for (i=0; i&lt;32; i++) {                     \n        v1 -= ((v0&lt;&lt;4) + k2) ^ (v0 + sum) ^ ((v0&gt;&gt;5) + k3);\n        v0 -= ((v1&lt;&lt;4) + k0) ^ (v1 + sum) ^ ((v1&gt;&gt;5) + k1);\n        sum -= delta;\n    }                                      \n    value[0]=v0; value[1]=v1;\n}\n\nint main()\n{\n    uint32_t key[4]={2,2,3,4};\n    const char* plaintext=&quot;HelloWorld_Welcome_to_encode_!!!&quot;; \/\/\u660e\u6587\n\n    int plaintext_len = strlen(plaintext);\n    uint32_t tmp[8];\n\n    memcpy(tmp, plaintext, 32);\n    printf(&quot;Plaintext: %s\\n&quot;, plaintext);\n\n    for (int i = 0; i &lt; 8; i += 2) {\n        encrypt(&amp;tmp[i], key);\n    }\n\n    printf(&quot;After encryption:\\n&quot;);\n    for (int i = 0; i &lt; 8; i++) {\n        printf(&quot;%08x &quot;, tmp[i]);\n    }\n\n    printf(&quot;\\nAfter decryption:\\n&quot;);\n    for (int i = 0; i &lt; 8; i += 2) {\n        decrypt(&amp;tmp[i], key);\n    }\n    printf(&quot;%s\\n&quot;, (char*)tmp);\n    \/\/ v\u4e3a\u8981\u52a0\u5bc6\u7684\u6570\u636e\u662f\u4e24\u4e2a32\u4f4d\u65e0\u7b26\u53f7\u6574\u6570(\u56db\u4e2a\u5b57\u8282)\n    \/\/ k\u4e3a\u52a0\u5bc6\u89e3\u5bc6\u5bc6\u94a5\uff0c\u4e3a4\u4e2a32\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\uff0c\u5373\u5bc6\u94a5\u957f\u5ea6\u4e3a128\u4f4d\n    return 0;\n\n}\n\/* shell output -&gt;\n\nPlaintext: HelloWorld_Welcome_to_encode_!!!\nAfter encryption:\nea99cb31 4a00a721 f12d7a1a 166346d9 71d37571 78b3a20a 8143ce11 c85e323c\nAfter decryption:\nHelloWorld_Welcome_to_encode_!!!\n\n*\/\n<\/code><\/pre>\n<h2>XTEA\u7b97\u6cd5<\/h2>\n<p>TEA\u7b97\u6cd5\u7684\u5347\u7ea7\u7248,\u52a0\u5165\u4e86\u66f4\u591a\u7684\u5904\u7406\u673a\u5236\u548c\u64cd\u4f5c.<\/p>\n<h3>\u7b97\u6cd5\u89e3\u6790<\/h3>\n<p>&lt;img src=&quot;https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251102174853.png&quot; width=&quot;30%&quot;&gt;<\/p>\n<ul>\n<li>\u540c\u7406\u6309\u7167\u5de6\u53f3\u5206\u5757<\/li>\n<li>\u5bf9\u53f3\u5757\u8fdb\u884c\u4e00\u7cfb\u5217\u5904\u7406\u5f97\u5230\u4e2d\u95f4\u503c\u5e76\u4e0e\u5de6\u5757\u76f8\u52a0<\/li>\n<li>\u5bf9\u5de6\u5757\u8fdb\u884c\u76f8\u540c\u5904\u7406<\/li>\n<li>\u5faa\u73af<\/li>\n<\/ul>\n<pre><code class=\"language-cpp\">#include &lt;stdint.h&gt;\n#include &lt;stdio.h&gt;\n\n\/* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] *\/\n\nvoid encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {\n    unsigned int i;\n    uint32_t v0 = v[0], v1 = v[1], sum = 0, delta = 0x9E3779B9;\n    for (i = 0; i &lt; num_rounds; i++) {\n        v0 += (((v1 &lt;&lt; 4) ^ (v1 &gt;&gt; 5)) + v1) ^ (sum + key[sum &amp; 3]);\n        sum += delta;\n        v1 += (((v0 &lt;&lt; 4) ^ (v0 &gt;&gt; 5)) + v0) ^ (sum + key[(sum &gt;&gt; 11) &amp; 3]);\n    }\n    v[0] = v0;\n    v[1] = v1;\n}\n\nvoid decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {\n    unsigned int i;\n    uint32_t v0 = v[0], v1 = v[1], delta = 0x9E3779B9, sum = delta * num_rounds;  \/\/ \u73b0\u5728\u662f\u4e2d\u6587\n    for (i = 0; i &lt; num_rounds; i++) {\n        v1 -= (((v0 &lt;&lt; 4) ^ (v0 &gt;&gt; 5)) + v0) ^ (sum + key[(sum &gt;&gt; 11) &amp; 3]);\n        sum -= delta;\n        v0 -= (((v1 &lt;&lt; 4) ^ (v1 &gt;&gt; 5)) + v1) ^ (sum + key[sum &amp; 3]);\n    }\n    v[0] = v0;\n    v[1] = v1;\n}\n\nint main() {\n    uint32_t v[2] = {1, 2};\n    uint32_t const k[4] = {2, 2, 3, 4};\n    unsigned int r = 32;  \/\/ num_rounds\u5efa\u8bae\u53d6\u503c\u4e3a32\n    \/\/ v\u4e3a\u8981\u52a0\u5bc6\u7684\u6570\u636e\u662f\u4e24\u4e2a32\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\u4e2d\u6587\n    \/\/ k\u4e3a\u52a0\u5bc6\u89e3\u5bc6\u5bc6\u94a5\uff0c\u4e3a4\u4e2a32\u4f4d\u65e0\u7b26\u53f7\u6574\u6570\uff0c\u5373\u5bc6\u94a5\u957f\u5ea6\u4e3a128\u4f4d\n    printf(&quot;\u52a0\u5bc6\u524d\u539f\u59cb\u6570\u636e\uff1a%u %u\\n&quot;, v[0], v[1]);\n    encipher(r, v, k);\n    printf(&quot;\u52a0\u5bc6\u540e\u7684\u6570\u636e\uff1a%u %u\\n&quot;, v[0], v[1]);\n    decipher(r, v, k);\n    printf(&quot;\u89e3\u5bc6\u540e\u7684\u6570\u636e\uff1a%u %u\\n&quot;, v[0], v[1]);\n    \/\/ \u73b0\u5728\u4f7f\u7528\u4e2d\u6587\u6ce8\u91ca\n    return 0;\n}\n<\/code><\/pre>\n<h2>XXTEA\u7b97\u6cd5<\/h2>\n<h3>\u7b97\u6cd5\u89e3\u6790<\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251102181648.png\" alt=\"image.png|700\"><\/p>\n<pre><code class=\"language-cpp\">#include &lt;stdio.h&gt;\n#include &lt;stdint.h&gt;\n#define DELTA 0x9e3779b9\n#define MX (((z&gt;&gt;5^y&lt;&lt;2) + (y&gt;&gt;3^z&lt;&lt;4)) ^ ((sum^y) + (key[(idx&amp;3)^e] ^ z)))\n\n\/* Block TEA \u52a0\u5bc6\/\u89e3\u5bc6\u51fd\u6570\n * \u53c2\u6570\uff1a\n *   plain_text: \u5f85\u5904\u7406\u7684\u6570\u636e\u6570\u7ec4\n *   length: \u6570\u7ec4\u957f\u5ea6\uff0832\u4f4d\u5b57\u7684\u4e2a\u6570\uff09\n *   key: 128\u4f4d\u5bc6\u94a5\uff084\u4e2a32\u4f4d\u5b57\uff09\n *\/\nvoid btea(uint32_t *plain_text, int length, uint32_t const key[4])\n{\n    uint32_t y, z, sum;        \/* y,z: \u76f8\u90bb\u6570\u636e\u5757; sum: \u8f6e\u5e38\u91cf\u7d2f\u52a0\u503c *\/\n    unsigned idx, rounds, e;      \/* p: \u4f4d\u7f6e\u8ba1\u6570\u5668; rounds: \u52a0\u5bc6\u8f6e\u6570; e: \u8f6e\u5bc6\u94a5\u9009\u62e9\u56e0\u5b50 *\/\n\n    \/* \u52a0\u5bc6\u8fc7\u7a0b\uff08\u81f3\u5c11\u9700\u89812\u4e2a32\u4f4d\u5b57\uff09 *\/\n    if (length &gt; 1)\n    {\n        \/* \u8ba1\u7b97\u52a0\u5bc6\u8f6e\u6570\uff1a\u57fa\u78406\u8f6e + \u6839\u636e\u6570\u636e\u957f\u5ea6\u52a8\u6001\u8c03\u6574\u7684\u8f6e\u6570 *\/\n        rounds = 6 + 52\/length;\n        sum = 0;               \/* \u521d\u59cb\u5316\u8f6e\u5e38\u91cf\u7d2f\u52a0\u503c *\/\n        z = plain_text[length-1];  \/* \u83b7\u53d6\u6700\u540e\u4e00\u4e2a\u6570\u636e\u5757 *\/\n        do\n        {\n            sum += DELTA; \/\/ sum\u7d2f\u52a0\n            e = (sum &gt;&gt; 2) &amp; 3; \/\/ \u8ba1\u7b97e\n            for (idx=0; idx&lt;length-1; idx++)\n            {\n                y = plain_text[idx+1]; \/\/ \u83b7\u53d6\u4e0b\u4e00\u4e2a\u6570\u636e\u5757\n                z = plain_text[idx] += MX; \/\/ \u66f4\u65b0\u5f53\u524d\u6570\u636e\u5757\n            }\n            y = plain_text[0];\n            z = plain_text[length-1] += MX;\n        }\n        while (--rounds);\n    }\n    else if (length &lt; -1)      \/* Decoding Part *\/\n    {\n        length = -length;\n        rounds = 6 + 52\/length;\n        sum = rounds*DELTA;\n        y = plain_text[0];\n        do\n        {\n            e = (sum &gt;&gt; 2) &amp; 3;\n            for (idx=length-1; idx&gt;0; idx--)\n            {\n                z = plain_text[idx-1];\n                y = plain_text[idx] -= MX;\n            }\n            z = plain_text[length-1];\n            y = plain_text[0] -= MX;\n            sum -= DELTA;\n        }\n        while (--rounds);\n    }\n}\n\n\/* \u6d4b\u8bd5\u4e3b\u51fd\u6570\n * \u6f14\u793a Block TEA (XXTEA) \u7b97\u6cd5\u7684\u52a0\u5bc6\u548c\u89e3\u5bc6\u8fc7\u7a0b\n *\/\nint main()\n{\n    \/* \u6d4b\u8bd5\u6570\u636e\u521d\u59cb\u5316\n     * v: \u5f85\u52a0\u5bc6\u6570\u636e\uff0c2\u4e2a32\u4f4d\u6574\u6570\n     * k: 128\u4f4d\u5bc6\u94a5\uff0c4\u4e2a32\u4f4d\u6574\u6570\n     * n: \u6570\u636e\u957f\u5ea6\u53c2\u6570\n     *    - |n| \u8868\u793a\u6570\u636e\u957f\u5ea6\uff0832\u4f4d\u5b57\u7684\u4e2a\u6570\uff09\n     *    - n &gt; 0 \u8868\u793a\u52a0\u5bc6\n     *    - n &lt; 0 \u8868\u793a\u89e3\u5bc6\n     *\/\n    uint32_t v[2] = {1, 2};           \/* \u6d4b\u8bd5\u6570\u636e *\/\n    uint32_t const k[4] = {2,2,3,4};  \/* \u6d4b\u8bd5\u5bc6\u94a5 *\/\n    int n = 2;                         \/* \u6b63\u503c\u8868\u793a\u52a0\u5bc6 *\/\n\n    printf(&quot;\u52a0\u5bc6\u524d\u539f\u59cb\u6570\u636e\uff1a%u %u\\n&quot;, v[0], v[1]);\n    \n    \/* \u52a0\u5bc6\u8fc7\u7a0b\uff1a\u4f7f\u7528\u6b63\u6570\u957f\u5ea6\u53c2\u6570 *\/\n    btea(v, n, k);\n    printf(&quot;\u52a0\u5bc6\u540e\u7684\u6570\u636e\uff1a%u %u\\n&quot;, v[0], v[1]);\n    \n    \/* \u89e3\u5bc6\u8fc7\u7a0b\uff1a\u4f7f\u7528\u8d1f\u6570\u957f\u5ea6\u53c2\u6570 *\/\n    btea(v, -n, k);\n    printf(&quot;\u89e3\u5bc6\u540e\u7684\u6570\u636e\uff1a%u %u\\n&quot;, v[0], v[1]);\n    \n    return 0;\n}\n<\/code><\/pre>\n<h1>RC4\u7b97\u6cd5<\/h1>\n<p><strong>RC4\u7b97\u6cd5\u662f\u4e00\u79cd\u5bf9\u79f0\u52a0\u5bc6\u7b97\u6cd5<\/strong><\/p>\n<ul>\n<li>\u5bc6\u94a5\u5927\u5c0f: \u53ef\u53d8,\u901a\u8fc7KSA\u62d3\u5c55\u5c55\u5f97\u5230\u4e00\u4e2a256\u5b57\u8282\u7684\u72b6\u6001\u6570\u7ec4<\/li>\n<li>PRGA: \u7528 S \u751f\u6210\u4e00\u4e2a\u4f2a\u968f\u673a\u5b57\u8282\u6d41\uff0c\u5168\u7a0b\u4e0e\u5bc6\u94a5\u6709\u5173.<\/li>\n<li>\u660e\u6587\u548c\u751f\u6210\u7684\u5bc6\u94a5\u6309\u4f4d\u5f02\u6216,\u5f97\u5230\u5bc6\u6587,\u89e3\u5bc6\u65f6\u518d\u5f02\u6216\u4e00\u6b21\u5373\u53ef\u6062\u590d\u539f\u6587<\/li>\n<\/ul>\n<pre><code class=\"language-python\">def KSA(key):\n    &quot;&quot;&quot; KSA \u5bc6\u94a5\u62d3\u5c55 &quot;&quot;&quot;\n    S = list(range(256))\n    j = 0\n    for i in range(256):\n        j = (j + S[i] + key[i % len(key)]) % 256\n        S[i], S[j] = S[j], S[i]\n    return S\n \ndef PRGA(S):\n    &quot;&quot;&quot; PRGA &quot;&quot;&quot;\n    i, j = 0, 0\n    while True:\n        i = (i + 1) % 256\n        j = (j + S[i]) % 256\n        S[i], S[j] = S[j], S[i]\n        K = S[(S[i] + S[j]) % 256]\n        yield K\n \ndef RC4(key, text):\n    &quot;&quot;&quot; RC4 \u52a0\u5bc6\u6d41\u7a0b &quot;&quot;&quot;\n    S = KSA(key)\n    keystream = PRGA(S)\n    res = []\n    for char in text:\n        res.append(char ^ next(keystream))\n    return bytes(res)\n\ndef main():\n    # \u6d4b\u8bd5\n    key = b&quot;HelloRc4!&quot;\n    plaintext = b&quot;This is a secret message.&quot;\n    print(&quot;Plaintext:&quot;, plaintext)\n\n    # \u52a0\u5bc6\n    cipher = RC4(key, plaintext)\n    print(&quot;Ciphertext (hex):&quot;, cipher.hex(), end=&quot;\\n&quot;)\n\n    # \u89e3\u5bc6\n    print(&quot;Decrypting...&quot;)\n    decrypted = RC4(key, cipher)\n    try: \n        print(&quot;Decrypted text:&quot;, decrypted.decode(&quot;utf-8&quot;))\n    except UnicodeDecodeError:\n        print(&quot;Decrypted text (bytes):&quot;, decrypted)\n\nif __name__ == &quot;__main__&quot;:\n    main()\n<\/code><\/pre>\n<pre><code class=\"language-cpp\">#include &lt;stdio.h&gt;\n#include &lt;string.h&gt;\n\n\/\/ RC4\u5bc6\u94a5\u8c03\u5ea6\u7b97\u6cd5 (KSA)\nvoid RC4_KSA(unsigned char *key, int keyLength, unsigned char *S) {\n    int i, j = 0;\n    unsigned char temp;\n    \n    for (i = 0; i &lt; 256; i++) {\n        S[i] = i;\n    }\n    \n    for (i = 0; i &lt; 256; i++) {\n        j = (j + S[i] + key[i % keyLength]) % 256;\n        \n        \/\/ \u4ea4\u6362 S[i] \u548c S[j]\n        temp = S[i];\n        S[i] = S[j];\n        S[j] = temp;\n    }\n}\n\n\/\/ RC4\u4f2a\u968f\u673a\u751f\u6210\u7b97\u6cd5 (PRGA)\nvoid RC4_PRGA(unsigned char *S, unsigned char *data, int dataLength) {\n    int i = 0, j = 0, k;\n    unsigned char temp;\n    \n    for (k = 0; k &lt; dataLength; k++) {\n        i = (i + 1) % 256;\n        j = (j + S[i]) % 256;\n        \n        \/\/ \u4ea4\u6362 S[i] \u548c S[j]\n        temp = S[i];\n        S[i] = S[j];\n        S[j] = temp;\n        \n        \/\/ \u83b7\u53d6\u4f2a\u968f\u673a\u5b57\u8282\u5e76\u4e0e\u6570\u636e\u8fdb\u884c\u5f02\u6216\n        data[k] ^= S[(S[i] + S[j]) % 256];\n    }\n}\n\nint main() {\n    unsigned char key[] = &quot;Key&quot;;  \/\/ \u5bc6\u94a5\n    unsigned char data[] = &quot;Plaintext&quot;;  \/\/ \u660e\u6587\u6570\u636e\n    \n    int keyLength = strlen((char *)key);\n    int dataLength = strlen((char *)data);\n    \n    unsigned char S[256];  \/\/ \u72b6\u6001\u5411\u91cf\n\n    \/\/ \u5bc6\u94a5\u8c03\u5ea6\u7b97\u6cd5 (KSA)\n    RC4_KSA(key, keyLength, S);\n    \n    \/\/ \u4f2a\u968f\u673a\u751f\u6210\u7b97\u6cd5 (PRGA) \u7528\u4e8e\u52a0\u5bc6\u6570\u636e\n    RC4_PRGA(S, data, dataLength);\n\n    printf(&quot;Encrypted text: &quot;);\n    for (int i = 0; i &lt; dataLength; i++) {\n        printf(&quot;%02X &quot;, data[i]);\n    }\n    printf(&quot;\\n&quot;);\n\n    \/\/ \u89e3\u5bc6\u65f6\uff0c\u76f4\u63a5\u4f7f\u7528\u76f8\u540c\u7684\u52a0\u5bc6\u8fc7\u7a0b\n    RC4_KSA(key, keyLength, S);\n    RC4_PRGA(S, data, dataLength);\n\n    printf(&quot;Decrypted text: %s\\n&quot;, data);\n    \n    return 0;\n}\n\n<\/code><\/pre>\n<h1>RC5\u7b97\u6cd5<\/h1>\n<p><strong>\u4e00\u79cd\u5206\u7ec4\u5bf9\u79f0\u52a0\u5bc6\u7b97\u6cd5<\/strong><\/p>\n<h2>\u53c2\u6570\u89e3\u6790<\/h2>\n<ol>\n<li>RC5\u6709\u4e09\u4e2a\u4e3b\u8981\u53c2\u6570:<\/li>\n<\/ol>\n<pre><code class=\"language-cpp\">RC5-W\/R\/B\n<\/code><\/pre>\n<ul>\n<li><strong>w<\/strong>\uff1a\u5b57\u957f\uff08word size\uff09\uff0c\u5e38\u7528 32\uff08\u4f4d\uff09\u3001\u4e5f\u53ef\u4ee5\u662f 16\u300164<\/li>\n<li><strong>r<\/strong>\uff1a\u52a0\u5bc6\u8f6e\u6570\uff08rounds\uff09\uff0c\u5e38\u7528 12 \u6216 20<\/li>\n<li><strong>b<\/strong>\uff1a\u5bc6\u94a5\u957f\u5ea6\uff08bytes\uff09\uff0c\u53d6\u503c 0~255 \u5b57\u8282\uff0c\u5e38\u7528 16 \u5b57\u8282\uff08128 \u4f4d\uff09<\/li>\n<\/ul>\n<ol start=\"2\">\n<li>\u5206\u7ec4\u5927\u5c0f<\/li>\n<\/ol>\n<ul>\n<li><strong>\u6570\u636e\u5757\u5927\u5c0f<\/strong> = <code>2 \u00d7 w<\/code> \u4f4d\n<ul>\n<li>\u5982\u679c w = 32\uff0c\u5219\u6570\u636e\u5757\u5927\u5c0f\u4e3a <strong>64 \u4f4d\uff088 \u5b57\u8282\uff09<\/strong><\/li>\n<li>\u5982\u679c w = 64\uff0c\u5219\u6570\u636e\u5757\u5927\u5c0f\u4e3a <strong>128 \u4f4d\uff0816 \u5b57\u8282\uff09<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ol start=\"2\">\n<li>\u5bc6\u94a5\u5927\u5c0f<\/li>\n<\/ol>\n<ul>\n<li>\u5bc6\u94a5\u957f\u5ea6 <strong>b<\/strong> \u53ef\u4ee5\u4ece 0 \u5230 255 \u5b57\u8282\u53ef\u53d8<\/li>\n<li>\u5e38\u7528\u8bbe\u7f6e:\n<ul>\n<li><strong>128 \u4f4d\u5bc6\u94a5\uff0816 \u5b57\u8282\uff09<\/strong><\/li>\n<li>192 \u4f4d\uff0824 \u5b57\u8282\uff09<\/li>\n<li>256 \u4f4d\uff0832 \u5b57\u8282\uff09<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>\u7b97\u6cd5\u5b9e\u73b0<\/h2>\n<pre><code class=\"language-cpp\">#include &lt;stdio.h&gt;\n#include &lt;stdint.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;string.h&gt;\n\n#define WORD uint32_t\n#define w 32              \/\/ \u5b57\u957f\n#define r 12              \/\/ \u8f6e\u6570\n#define b 16              \/\/ \u5bc6\u94a5\u5b57\u8282\u6570\n#define c (b \/ 4)         \/\/ \u5bc6\u94a5\u5b57\u7684\u4e2a\u6570\n#define t (2 * (r + 1))   \/\/ \u5b50\u5bc6\u94a5\u8868\u7684\u5927\u5c0f\n\n#define P32 0xB7E15163\n#define Q32 0x9E3779B9\n\nWORD S[t];                \/\/ \u5b50\u5bc6\u94a5\u8868\n\n\/\/ \u5de6\u5faa\u73af\nWORD ROTL(WORD x, WORD y) {\n    return (x &lt;&lt; (y &amp; (w - 1))) | (x &gt;&gt; (w - (y &amp; (w - 1))));\n}\n\n\/\/ \u53f3\u5faa\u73af\nWORD ROTR(WORD x, WORD y) {\n    return (x &gt;&gt; (y &amp; (w - 1))) | (x &lt;&lt; (w - (y &amp; (w - 1))));\n}\n\n\/\/ \u5bc6\u94a5\u6269\u5c55\nvoid RC5_KeySchedule(const uint8_t *key) {\n    WORD L[c];\n    memset(L, 0, sizeof(L));\n\n    \/\/ \u5c06\u5bc6\u94a5\u8f6c\u6362\u4e3a L \u6570\u7ec4\n    for (int i = b - 1; i &gt;= 0; i--) {\n        L[i \/ 4] = (L[i \/ 4] &lt;&lt; 8) + key[i];\n    }\n\n    \/\/ \u521d\u59cb\u5316 S \u8868\n    S[0] = P32;\n    for (int i = 1; i &lt; t; i++) {\n        S[i] = S[i - 1] + Q32;\n    }\n\n    \/\/ \u6df7\u5408 S \u548c L\n    WORD A = 0, B = 0;\n    int i = 0, j = 0;\n    for (int k = 0; k &lt; 3 * ((t &gt; c) ? t : c); k++) {\n        A = S[i] = ROTL(S[i] + A + B, 3);\n        B = L[j] = ROTL(L[j] + A + B, A + B);\n        i = (i + 1) % t;\n        j = (j + 1) % c;\n    }\n}\n\n\/\/ \u52a0\u5bc6 64 \u4f4d\u660e\u6587\uff08\u4e24\u4e2a 32 \u4f4d\u5b57\uff09\nvoid RC5_Encrypt(WORD *pt, WORD *ct) {\n    WORD A = pt[0] + S[0];\n    WORD B = pt[1] + S[1];\n    for (int i = 1; i &lt;= r; i++) {\n        A = ROTL(A ^ B, B) + S[2 * i];\n        B = ROTL(B ^ A, A) + S[2 * i + 1];\n    }\n    ct[0] = A;\n    ct[1] = B;\n}\n\n\/\/ \u89e3\u5bc6\nvoid RC5_Decrypt(WORD *ct, WORD *pt) {\n    WORD B = ct[1];\n    WORD A = ct[0];\n    for (int i = r; i &gt;= 1; i--) {\n        B = ROTR(B - S[2 * i + 1], A) ^ A; \n        A = ROTR(A - S[2 * i], B) ^ B;\n    }\n    pt[1] = B - S[1];\n    pt[0] = A - S[0];\n}\n\n\/\/ \u5341\u516d\u8fdb\u5236\u6253\u5370\nvoid print_hex(const char *label, WORD *data) {\n    printf(&quot;%s: %08X %08X\\n&quot;, label, data[0], data[1]);\n}\n\n\/\/ \u793a\u4f8b\u4e3b\u51fd\u6570\nint main() {\n    \/\/ 16\u5b57\u8282\u5bc6\u94a5\n    uint8_t key[b] = {\n        0x91, 0x5F, 0x46, 0x19, 0xBE, 0x41, 0xB2, 0x51,\n        0x63, 0x55, 0xA5, 0x01, 0x10, 0xA9, 0xCE, 0x91\n    };\n\n    WORD plaintext[2]  = { 0x12345678, 0x9ABCDEF0 };\n    WORD ciphertext[2] = { 0, 0 }; \/\/ \u52a0\u5bc6\u7f13\u51b2\u533a\n    WORD decrypted[2]  = { 0, 0 }; \/\/ \u89e3\u5bc6\u7f13\u51b2\u533a\n\n    RC5_KeySchedule(key); \/\/ \u5bc6\u94a5\u62d3\u5c55,\u751f\u6210\u5b50\u5bc6\u94a5\u6570\u7ec4\n    RC5_Encrypt(plaintext, ciphertext); \/\/ RC5\u52a0\u5bc6\n    RC5_Decrypt(ciphertext, decrypted); \/\/ RC5\u89e3\u5bc6\n\n    print_hex(&quot;Plaintext&quot;, plaintext);\n    print_hex(&quot;Ciphertext&quot;, ciphertext);\n    print_hex(&quot;Decrypted&quot;, decrypted);\n\n    return 0;\n}\n\n<\/code><\/pre>\n<h1>RC6\u7b97\u6cd5<\/h1>\n<p><strong>\u4e00\u79cd\u5206\u7ec4\u5bf9\u79f0\u52a0\u5bc6\u7b97\u6cd5<\/strong><br \/>\n\u662fRC5\u7684\u6539\u8fdb\u7248<\/p>\n<h2>\u53c2\u6570\u5206\u6790<\/h2>\n<ol>\n<li>RC6\u7528\u4e00\u4e0b\u53c2\u6570\u8868\u793a<\/li>\n<\/ol>\n<pre><code class=\"language-cpp\">RC6-w\/r\/b\n<\/code><\/pre>\n<ul>\n<li><strong>w<\/strong>\uff1a\u5b57\u957f\uff08word size\uff09\uff0c\u5e38\u7528 <strong>32 \u4f4d<\/strong><\/li>\n<li><strong>r<\/strong>\uff1a\u8f6e\u6570\uff08rounds\uff09\uff0cAES \u7ade\u8d5b\u7248\u672c\u4f7f\u7528 <strong>20 \u8f6e<\/strong><\/li>\n<li><strong>b<\/strong>\uff1a\u5bc6\u94a5\u957f\u5ea6\uff08bytes\uff09\uff0c\u652f\u6301 0~255 \u5b57\u8282<\/li>\n<\/ul>\n<ol start=\"2\">\n<li>AES \u7ade\u8d5b\u63a8\u8350\u53c2\u6570\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-cpp\">RC6-32\/20\/16\n<\/code><\/pre>\n<ul>\n<li><strong>w = 32 \u4f4d<\/strong>\uff08\u6bcf\u4e2a\u6570\u636e\u5b57\u5360 4 \u5b57\u8282\uff09<\/li>\n<li><strong>\u5206\u7ec4\u5927\u5c0f<\/strong> = 4 \u00d7 w = <strong>128 \u4f4d\uff0816 \u5b57\u8282\uff09<\/strong><\/li>\n<li><strong>\u8f6e\u6570 r = 20<\/strong><\/li>\n<li><strong>\u5bc6\u94a5\u957f\u5ea6<\/strong> = 16 \u5b57\u8282\uff08128 \u4f4d\uff09<\/li>\n<\/ul>\n<h2>\u7b97\u6cd5\u5b9e\u73b0<\/h2>\n<pre><code class=\"language-cpp\">#include &lt;stdio.h&gt;\n#include &lt;stdint.h&gt;\n\n#define w 32                \/\/ \u5b57\u957f\n#define r 20                \/\/ \u8f6e\u6570\n#define b 16                \/\/ \u5bc6\u94a5\u957f\u5ea6\n#define Pw 0xB7E15163        \/\/ Magic constants for key schedule (for w=32)\n#define Qw 0x9E3779B9        \/\/ Magic constants for key schedule (for w=32)\n\n\/\/ \u8f6e\u4f4d\u79fb\u5b9e\u73b0\n#define ROTL(x, y) (((x) &lt;&lt; ((y) &amp; (w - 1))) | ((x) &gt;&gt; (w - ((y) &amp; (w - 1)))))\n#define ROTR(x, y) (((x) &gt;&gt; ((y) &amp; (w - 1))) | ((x) &lt;&lt; (w - ((y) &amp; (w - 1)))))\n\n\/\/ \u5b50\u5bc6\u94a5\u6570\u7ec4\nuint32_t S[2 * r + 4];\n\n\/\/--------------------------------------\n\/\/ \u5bc6\u94a5\u6269\u5c55\u51fd\u6570\uff08b\u5b57\u8282\u7528\u6237\u5bc6\u94a5 -&gt; S[] \u5b50\u5bc6\u94a5\uff09\n\/\/--------------------------------------\nvoid RC6_key_schedule(uint8_t *K) {\n    int i, j, s, v;\n    uint32_t L[(b + 3) \/ 4]; \/\/ \u5c06\u5b57\u8282\u5bc6\u94a5\u8f6c\u6362\u4e3a\u5b57\u6570\u7ec4\n    uint32_t A, B;\n\n    \/\/ Step 1: \u628a\u7528\u6237\u5bc6\u94a5K[]\u88c5\u5165L[]\uff0c\u4f4e\u4f4d\u4f18\u5148\n    for (i = b - 1, L[(b + 3) \/ 4 - 1] = 0; i != -1; i--)\n        L[i \/ 4] = (L[i \/ 4] &lt;&lt; 8) + K[i];\n\n    \/\/ Step 2: \u521d\u59cb\u5316\u5b50\u5bc6\u94a5S[]\n    S[0] = Pw;\n    for (i = 1; i &lt; 2 * r + 4; i++)\n        S[i] = S[i - 1] + Qw;\n\n    \/\/ Step 3: \u6df7\u5408\u64cd\u4f5c\n    A = B = i = j = 0;\n    v = 3 * ((b + 3) \/ 4 &gt; 2 * r + 4 ? (b + 3) \/ 4 : 2 * r + 4);\n    for (s = 0; s &lt; v; s++) {\n        A = S[i] = ROTL(S[i] + A + B, 3);\n        B = L[j] = ROTL(L[j] + A + B, (A + B));\n        i = (i + 1) % (2 * r + 4);\n        j = (j + 1) % ((b + 3) \/ 4);\n    }\n}\n\n\/\/--------------------------------------\n\/\/ \u52a0\u5bc6\u51fd\u6570\n\/\/--------------------------------------\nvoid RC6_encrypt(uint32_t *pt, uint32_t *ct) {\n    uint32_t A = pt[0], B = pt[1], C = pt[2], D = pt[3];\n    uint32_t t, u;\n    int i;\n\n    B += S[0];\n    D += S[1];\n    for (i = 1; i &lt;= r; i++) {\n        t = ROTL(B * (2 * B + 1), 5);\n        u = ROTL(D * (2 * D + 1), 5);\n        A = ROTL(A ^ t, u) + S[2 * i];\n        C = ROTL(C ^ u, t) + S[2 * i + 1];\n        \/\/ Rotate registers\n        {\n            uint32_t tmp = A;\n            A = B; B = C; C = D; D = tmp;\n        }\n    }\n    A += S[2 * r + 2];\n    C += S[2 * r + 3];\n    ct[0] = A; ct[1] = B; ct[2] = C; ct[3] = D;\n}\n\n\/\/--------------------------------------\n\/\/ \u89e3\u5bc6\u51fd\u6570\n\/\/--------------------------------------\nvoid RC6_decrypt(uint32_t *ct, uint32_t *pt) {\n    uint32_t A = ct[0], B = ct[1], C = ct[2], D = ct[3];\n    uint32_t t, u;\n    int i;\n\n    C -= S[2 * r + 3];\n    A -= S[2 * r + 2];\n    for (i = r; i &gt;= 1; i--) {\n        \/\/ Rotate registers backward\n        {\n            uint32_t tmp = D;\n            D = C; C = B; B = A; A = tmp;\n        }\n        t = ROTL(B * (2 * B + 1), 5);\n        u = ROTL(D * (2 * D + 1), 5);\n        C = ROTR(C - S[2 * i + 1], t) ^ u;\n        A = ROTR(A - S[2 * i], u) ^ t;\n    }\n    D -= S[1];\n    B -= S[0];\n    pt[0] = A; pt[1] = B; pt[2] = C; pt[3] = D;\n}\n\n\/\/--------------------------------------\n\/\/ \u6d4b\u8bd5\n\/\/--------------------------------------\nint main() {\n    uint8_t key[b] = {0x00,0x01,0x02,0x03,\n                      0x04,0x05,0x06,0x07,\n                      0x08,0x09,0x0A,0x0B,\n                      0x0C,0x0D,0x0E,0x0F};\n    uint32_t plaintext[4]  = {0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210};\n    uint32_t ciphertext[4], decrypted[4];\n\n    RC6_key_schedule(key); \/\/ \u5bc6\u94a5\u62d3\u5c55\n    RC6_encrypt(plaintext, ciphertext);\n    RC6_decrypt(ciphertext, decrypted);\n\n    printf(&quot;Plaintext:  %08X %08X %08X %08X\\n&quot;, plaintext[0], plaintext[1], plaintext[2], plaintext[3]);\n    printf(&quot;Ciphertext: %08X %08X %08X %08X\\n&quot;, ciphertext[0], ciphertext[1], ciphertext[2], ciphertext[3]);\n    printf(&quot;Decrypted:  %08X %08X %08X %08X\\n&quot;, decrypted[0], decrypted[1], decrypted[2], decrypted[3]);\n\n    return 0;\n}\n\n<\/code><\/pre>\n<h1>AES\u7b97\u6cd5<\/h1>\n<p><strong>\u4e00\u79cd\u5bf9\u79f0\u5206\u7ec4\u52a0\u5bc6\u7b97\u6cd5<\/strong><\/p>\n<h2>\u53c2\u6570\u5206\u6790<\/h2>\n<p>\u5bc6\u94a5\u957f\u5ea6\u51b3\u5b9a\u4e86\u52a0\u5bc6\u7684\u56de\u5408\u6570\uff08rounds\uff09\u3002\u5bf9\u4e8e\u4e0d\u540c\u957f\u5ea6\u7684\u5bc6\u94a5\uff0c\u56de\u5408\u6570\u5982\u4e0b\uff1a<\/p>\n<ul>\n<li>128 \u6bd4\u7279\u5bc6\u94a5\uff1a10 \u56de\u5408<\/li>\n<li>192 \u6bd4\u7279\u5bc6\u94a5\uff1a12 \u56de\u5408<\/li>\n<li>256 \u6bd4\u7279\u5bc6\u94a5\uff1a14 \u56de\u5408<\/li>\n<\/ul>\n<p>\u53c2\u8003\u8fde\u63a5:<br \/>\n<a href=\"https:\/\/zh.wikipedia.org\/wiki\/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86\">\u9ad8\u7ea7\u52a0\u5bc6\u6807\u51c6 &#8211; \u7ef4\u57fa\u767e\u79d1\uff0c\u81ea\u7531\u7684\u767e\u79d1\u5168\u4e66<\/a><br \/>\n<a href=\"https:\/\/www.bilibili.com\/video\/BV1i341187fK\/?spm_id_from=333.337.search-card.all.click&amp;vd_source=3fbe06963450d79eb92b1fe509cd4c79\">\u3010AES\u52a0\u5bc6\u7b97\u6cd5\u3011| AES\u52a0\u5bc6\u8fc7\u7a0b\u8be6\u89e3| \u5bf9\u79f0\u52a0\u5bc6| Rijndael-128| \u5bc6\u7801\u5b66| \u4fe1\u606f\u5b89\u5168_\u54d4\u54e9\u54d4\u54e9_bilibili<\/a><\/p>\n<h2>\u4e3b\u52a0\u5bc6\u6d41\u7a0b\u5206\u6790<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251101173710.png\" alt=\"image.png|600\"><\/p>\n<p>(\u6ce8\u610f\u56fe\u7247\u4e2d\u7684aes-128\u7684\u793a\u8303)<br \/>\n\u603b\u4f53\u6d41\u7a0b\u53ef\u4ee5\u603b\u7ed3\u4e3a:<br \/>\n\u660e\u6587-&gt;\u521d\u59cb\u53d8\u6362(AddRoundKey)-&gt;\u6307\u5b9a\u8f6e\u6570\u5faa\u73af\u8fd0\u7b97-&gt;\u6700\u7ec8\u8f6e\u53d8\u6362(\u6ca1\u6709\u5217\u6df7\u5408)-&gt;\u5bc6\u6587<\/p>\n<p>\u5faa\u73af\u8fd0\u7b97\u53c8\u53ef\u4ee5\u5206\u4e3a<\/p>\n<ol>\n<li>\u5b57\u8282\u4ee3\u6362<\/li>\n<li>\u884c\u79fb\u4f4d<\/li>\n<li>\u5217\u6df7\u5408<\/li>\n<li>\u8f6e\u5bc6\u94a5\u52a0<\/li>\n<\/ol>\n<h3>\u521d\u59cb\u53d8\u6362<\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251101172548.png\" alt=\"image.png|600\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251101172823.png\" alt=\"image.png|600\"><\/p>\n<ul>\n<li>\u9996\u5148\u4f1a\u8bfb\u5165\u5341\u516d\u4e2a\u5b57\u8282\u7684\u6570\u636e\u7ec4\u62104&#215;4\u7684\u77e9\u9635<\/li>\n<li>\u518d\u548c\u5b50\u5bc6\u94a5\u77e9\u9635\u8fdb\u884c\u5f02\u6216\u8ba1\u7b97\u53ef\u4ee5\u5f97\u5230\u521d\u59cb\u53d8\u6362\u540e\u768416\u4e2a\u5b57\u8282<\/li>\n<\/ul>\n<h3>\u5b57\u8282\u4ee3\u6362<\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251101173030.png\" alt=\"image.png|600\"><\/p>\n<p>\u5728\u8fd9\u4e2a\u6b65\u9aa4\u4e2d,\u4f1a\u5c06\u4e0a\u4e00\u6b65\u768416\u4e2a\u5b57\u8282\u901a\u8fc7\u67e5<code>sbox\u8868\u5f97\u5230\u6df7\u6dc6\u540e\u768416\u4e2a\u5b57\u8282<\/code><\/p>\n<h3>\u884c\u79fb\u4f4d<\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251101173330.png\" alt=\"image.png|600\"><\/p>\n<p>\u5bf9\u5f97\u5230\u76844&#215;4\u7684\u77e9\u9635,\u6bcf\u4e00\u884c\u8fdb\u884c\u5faa\u73af\u4f4d\u79fb<br \/>\n0\u884c: \u4e0d\u79fb\u52a8<br \/>\n1\u884c: \u5411\u5de6\u5faa\u73af\u4f4d\u79fb1\u4f4d<br \/>\n2\u884c: \u5411\u5de6\u5faa\u73af\u4f4d\u79fb2\u4f4d<br \/>\n3\u884c: \u5411\u5de6\u5faa\u73af\u4f4d\u79fb3\u4f4d<\/p>\n<h3>\u5217\u6df7\u5408<\/h3>\n<p>\u6ce8\u610f: \u662f\u5728GF(<mjx-container class=\"MathJax\" jax=\"SVG\" style=\"direction: ltr; position: relative;\"><svg style=\"overflow: visible; min-height: 1px; min-width: 1px; vertical-align: 0;\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"2.119ex\" height=\"1.887ex\" role=\"img\" focusable=\"false\" viewBox=\"0 -833.9 936.6 833.9\" aria-hidden=\"true\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"scale(1,-1)\"><g data-mml-node=\"math\"><g data-mml-node=\"msup\"><g data-mml-node=\"mn\"><path data-c=\"32\" d=\"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mn\" transform=\"translate(533,363) scale(0.707)\"><path data-c=\"38\" d=\"M70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21Z\" style=\"stroke-width: 3;\"\/><\/g><\/g><\/g><\/g><\/svg><mjx-assistive-mml unselectable=\"on\" display=\"inline\" style=\"top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><msup><mn>2<\/mn><mn>8<\/mn><\/msup><\/math><\/mjx-assistive-mml><\/mjx-container>)\u6709\u9650\u57df\u4e2d\u7684\u77e9\u9635\u4e58\u6cd5.<br \/>\n\u5bf9\u4e0a\u4e00\u6b65\u7684\u7ed3\u679c\u5de6\u4e58\u4e00\u4e2a<code>\u56fa\u5b9a\u7684\u77e9\u9635<\/code><\/p>\n<p>\u901a\u5e38\u56fa\u5b9a\u7684\u77e9\u9635\u662f:<\/p>\n<p><mjx-container class=\"MathJax\" jax=\"SVG\" display=\"true\" style=\"direction: ltr; display: block; text-align: center; margin: 1em 0; position: relative;\"><svg style=\"overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -5.317ex;\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"26.967ex\" height=\"11.765ex\" role=\"img\" focusable=\"false\" viewBox=\"0 -2850 11919.4 5200\" aria-hidden=\"true\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"scale(1,-1)\"><g data-mml-node=\"math\"><g data-mml-node=\"mrow\"><g data-mml-node=\"mo\"><path data-c=\"23A1\" d=\"M319 -645V1154H666V1070H403V-645H319Z\" transform=\"translate(0,1696)\" style=\"stroke-width: 3;\"\/><path data-c=\"23A3\" d=\"M319 -644V1155H403V-560H666V-644H319Z\" transform=\"translate(0,-1706)\" style=\"stroke-width: 3;\"\/><svg width=\"667\" height=\"1802\" y=\"-651\" x=\"0\" viewBox=\"0 450.5 667 1802\"><path data-c=\"23A2\" d=\"M319 0V602H403V0H319Z\" transform=\"scale(1,4.49)\" style=\"stroke-width: 3;\"\/><\/svg><\/g><g data-mml-node=\"mtable\" transform=\"translate(667,0)\"><g data-mml-node=\"mtr\" transform=\"translate(0,2100)\"><g data-mml-node=\"mtd\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"32\" d=\"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><g data-mml-node=\"mtd\" transform=\"translate(2000,0)\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"33\" d=\"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><g data-mml-node=\"mtd\" transform=\"translate(4000,0)\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><g data-mml-node=\"mtd\" transform=\"translate(6000,0)\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><\/g><g data-mml-node=\"mtr\" transform=\"translate(0,700)\"><g data-mml-node=\"mtd\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><g data-mml-node=\"mtd\" transform=\"translate(2000,0)\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"32\" d=\"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><g data-mml-node=\"mtd\" transform=\"translate(4000,0)\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"33\" d=\"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><g data-mml-node=\"mtd\" transform=\"translate(6000,0)\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><\/g><g data-mml-node=\"mtr\" transform=\"translate(0,-700)\"><g data-mml-node=\"mtd\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><g data-mml-node=\"mtd\" transform=\"translate(2000,0)\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><g data-mml-node=\"mtd\" transform=\"translate(4000,0)\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"32\" d=\"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><g data-mml-node=\"mtd\" transform=\"translate(6000,0)\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"33\" d=\"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><\/g><g data-mml-node=\"mtr\" transform=\"translate(0,-2100)\"><g data-mml-node=\"mtd\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"33\" d=\"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><g data-mml-node=\"mtd\" transform=\"translate(2000,0)\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><g data-mml-node=\"mtd\" transform=\"translate(4000,0)\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><g data-mml-node=\"mtd\" transform=\"translate(6000,0)\"><g data-mml-node=\"mn\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><path data-c=\"32\" d=\"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z\" transform=\"translate(500,0)\" style=\"stroke-width: 3;\"\/><\/g><\/g><\/g><\/g><g data-mml-node=\"mo\" transform=\"translate(7667,0)\"><path data-c=\"23A4\" d=\"M0 1070V1154H347V-645H263V1070H0Z\" transform=\"translate(0,1696)\" style=\"stroke-width: 3;\"\/><path data-c=\"23A6\" d=\"M263 -560V1155H347V-644H0V-560H263Z\" transform=\"translate(0,-1706)\" style=\"stroke-width: 3;\"\/><svg width=\"667\" height=\"1802\" y=\"-651\" x=\"0\" viewBox=\"0 450.5 667 1802\"><path data-c=\"23A5\" d=\"M263 0V602H347V0H263Z\" transform=\"scale(1,4.49)\" style=\"stroke-width: 3;\"\/><\/svg><\/g><\/g><g data-mml-node=\"mo\" transform=\"translate(8556.2,0)\"><path data-c=\"2295\" d=\"M56 250Q56 394 156 488T384 583Q530 583 626 485T722 250Q722 110 625 14T390 -83Q249 -83 153 14T56 250ZM364 542Q308 539 251 509T148 418T96 278V270H369V542H364ZM681 278Q675 338 650 386T592 462T522 509T458 535T412 542H409V270H681V278ZM96 222Q104 150 139 95T219 12T302 -29T366 -42H369V230H96V222ZM681 222V230H409V-42H412Q429 -42 456 -36T521 -10T590 37T649 113T681 222Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mrow\" transform=\"translate(9556.4,0)\"><g data-mml-node=\"mo\"><path data-c=\"23A1\" d=\"M319 -645V1154H666V1070H403V-645H319Z\" transform=\"translate(0,1696)\" style=\"stroke-width: 3;\"\/><path data-c=\"23A3\" d=\"M319 -644V1155H403V-560H666V-644H319Z\" transform=\"translate(0,-1706)\" style=\"stroke-width: 3;\"\/><svg width=\"667\" height=\"1802\" y=\"-651\" x=\"0\" viewBox=\"0 450.5 667 1802\"><path data-c=\"23A2\" d=\"M319 0V602H403V0H319Z\" transform=\"scale(1,4.49)\" style=\"stroke-width: 3;\"\/><\/svg><\/g><g data-mml-node=\"mtable\" transform=\"translate(667,0)\"><g data-mml-node=\"mtr\" transform=\"translate(0,2100)\"><g data-mml-node=\"mtd\"><g data-mml-node=\"mi\"><path data-c=\"1D44E\" d=\"M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mn\" transform=\"translate(529,0)\"><path data-c=\"30\" d=\"M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z\" style=\"stroke-width: 3;\"\/><\/g><\/g><\/g><g data-mml-node=\"mtr\" transform=\"translate(0,700)\"><g data-mml-node=\"mtd\"><g data-mml-node=\"mi\"><path data-c=\"1D44E\" d=\"M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mn\" transform=\"translate(529,0)\"><path data-c=\"31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\" style=\"stroke-width: 3;\"\/><\/g><\/g><\/g><g data-mml-node=\"mtr\" transform=\"translate(0,-700)\"><g data-mml-node=\"mtd\"><g data-mml-node=\"mi\"><path data-c=\"1D44E\" d=\"M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mn\" transform=\"translate(529,0)\"><path data-c=\"32\" d=\"M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z\" style=\"stroke-width: 3;\"\/><\/g><\/g><\/g><g data-mml-node=\"mtr\" transform=\"translate(0,-2100)\"><g data-mml-node=\"mtd\"><g data-mml-node=\"mi\"><path data-c=\"1D44E\" d=\"M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mn\" transform=\"translate(529,0)\"><path data-c=\"33\" d=\"M127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463Z\" style=\"stroke-width: 3;\"\/><\/g><\/g><\/g><\/g><g data-mml-node=\"mo\" transform=\"translate(1696,0)\"><path data-c=\"23A4\" d=\"M0 1070V1154H347V-645H263V1070H0Z\" transform=\"translate(0,1696)\" style=\"stroke-width: 3;\"\/><path data-c=\"23A6\" d=\"M263 -560V1155H347V-644H0V-560H263Z\" transform=\"translate(0,-1706)\" style=\"stroke-width: 3;\"\/><svg width=\"667\" height=\"1802\" y=\"-651\" x=\"0\" viewBox=\"0 450.5 667 1802\"><path data-c=\"23A5\" d=\"M263 0V602H347V0H263Z\" transform=\"scale(1,4.49)\" style=\"stroke-width: 3;\"\/><\/svg><\/g><\/g><\/g><\/g><\/svg><mjx-assistive-mml unselectable=\"on\" display=\"block\" style=\"top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; overflow: hidden; width: 100%;\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\" display=\"block\"><mrow data-mjx-texclass=\"INNER\"><mo data-mjx-texclass=\"OPEN\">[<\/mo><mtable columnspacing=\"1em\" rowspacing=\"4pt\"><mtr><mtd><mn>02<\/mn><\/mtd><mtd><mn>03<\/mn><\/mtd><mtd><mn>01<\/mn><\/mtd><mtd><mn>01<\/mn><\/mtd><\/mtr><mtr><mtd><mn>01<\/mn><\/mtd><mtd><mn>02<\/mn><\/mtd><mtd><mn>03<\/mn><\/mtd><mtd><mn>01<\/mn><\/mtd><\/mtr><mtr><mtd><mn>01<\/mn><\/mtd><mtd><mn>01<\/mn><\/mtd><mtd><mn>02<\/mn><\/mtd><mtd><mn>03<\/mn><\/mtd><\/mtr><mtr><mtd><mn>03<\/mn><\/mtd><mtd><mn>01<\/mn><\/mtd><mtd><mn>01<\/mn><\/mtd><mtd><mn>02<\/mn><\/mtd><\/mtr><\/mtable><mo data-mjx-texclass=\"CLOSE\">]<\/mo><\/mrow><mo>\u2295<\/mo><mrow data-mjx-texclass=\"INNER\"><mo data-mjx-texclass=\"OPEN\">[<\/mo><mtable columnspacing=\"1em\" rowspacing=\"4pt\"><mtr><mtd><mi>a<\/mi><mn>0<\/mn><\/mtd><\/mtr><mtr><mtd><mi>a<\/mi><mn>1<\/mn><\/mtd><\/mtr><mtr><mtd><mi>a<\/mi><mn>2<\/mn><\/mtd><\/mtr><mtr><mtd><mi>a<\/mi><mn>3<\/mn><\/mtd><\/mtr><\/mtable><mo data-mjx-texclass=\"CLOSE\">]<\/mo><\/mrow><\/math><\/mjx-assistive-mml><\/mjx-container><\/p>\n<h3>\u8f6e\u5bc6\u94a5\u52a0<\/h3>\n<p>\u5bf9\u4e0a\u4e00\u6b65\u5f97\u5230\u7684\u7ed3\u679c\u4e0e\u4e00\u4e2a<code>\u5b50\u5bc6\u94a5\u77e9\u9635<\/code>\u5f02\u6216<\/p>\n<h2>\u5bc6\u94a5\u62d3\u5c55\u7684\u6d41\u7a0b<\/h2>\n<p>\u5728aes-128\u4e2d,\u5bc6\u94a5\u62d3\u5c55\u4f1a\u5f97\u523010\u4e2a\u5b50\u5bc6\u94a5\u77e9\u9635\u7528\u4e8e\u4e3b\u8981\u52a0\u5bc6\u6d41\u7a0b\u4e2d\u7684\u52a0\u5bc6<\/p>\n<ul>\n<li>\u5982\u679ci\u4e0d\u662f4\u7684\u500d\u6570<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251101174326.png\" alt=\"image.png|600\"><\/p>\n<ul>\n<li>\u5982\u679ci\u662f4\u7684\u500d\u6570,<mjx-container class=\"MathJax\" jax=\"SVG\" style=\"direction: ltr; position: relative;\"><svg style=\"overflow: visible; min-height: 1px; min-width: 1px; vertical-align: -0.566ex;\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"30.158ex\" height=\"2.262ex\" role=\"img\" focusable=\"false\" viewBox=\"0 -750 13329.9 1000\" aria-hidden=\"true\"><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"scale(1,-1)\"><g data-mml-node=\"math\"><g data-mml-node=\"mi\"><path data-c=\"1D44A\" d=\"M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mo\" transform=\"translate(1048,0)\"><path data-c=\"5B\" d=\"M118 -250V750H255V710H158V-210H255V-250H118Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mi\" transform=\"translate(1326,0)\"><path data-c=\"1D456\" d=\"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mo\" transform=\"translate(1671,0)\"><path data-c=\"5D\" d=\"M22 710V750H159V-250H22V-210H119V710H22Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mo\" transform=\"translate(2226.8,0)\"><path data-c=\"3D\" d=\"M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mi\" transform=\"translate(3282.6,0)\"><path data-c=\"1D44A\" d=\"M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mo\" transform=\"translate(4330.6,0)\"><path data-c=\"5B\" d=\"M118 -250V750H255V710H158V-210H255V-250H118Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mi\" transform=\"translate(4608.6,0)\"><path data-c=\"1D456\" d=\"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mo\" transform=\"translate(5175.8,0)\"><path data-c=\"2212\" d=\"M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mn\" transform=\"translate(6176,0)\"><path data-c=\"34\" d=\"M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mo\" transform=\"translate(6676,0)\"><path data-c=\"5D\" d=\"M22 710V750H159V-250H22V-210H119V710H22Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mo\" transform=\"translate(7176.2,0)\"><path data-c=\"2295\" d=\"M56 250Q56 394 156 488T384 583Q530 583 626 485T722 250Q722 110 625 14T390 -83Q249 -83 153 14T56 250ZM364 542Q308 539 251 509T148 418T96 278V270H369V542H364ZM681 278Q675 338 650 386T592 462T522 509T458 535T412 542H409V270H681V278ZM96 222Q104 150 139 95T219 12T302 -29T366 -42H369V230H96V222ZM681 222V230H409V-42H412Q429 -42 456 -36T521 -10T590 37T649 113T681 222Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mi\" transform=\"translate(8176.4,0)\"><path data-c=\"1D447\" d=\"M40 437Q21 437 21 445Q21 450 37 501T71 602L88 651Q93 669 101 677H569H659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437Q640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631Q469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46Q418 46 427 45T436 36Q436 31 433 22Q429 4 424 1L422 0Q419 0 415 0Q410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83H94Q174 46 189 55Q190 56 191 56Q196 59 201 76T241 233Q258 301 269 344Q339 619 339 625Q339 630 310 630H279Q212 630 191 624Q146 614 121 583T67 467Q60 445 57 441T43 437H40Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mo\" transform=\"translate(8880.4,0)\"><path data-c=\"28\" d=\"M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mi\" transform=\"translate(9269.4,0)\"><path data-c=\"1D44A\" d=\"M436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mo\" transform=\"translate(10317.4,0)\"><path data-c=\"5B\" d=\"M118 -250V750H255V710H158V-210H255V-250H118Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mi\" transform=\"translate(10595.4,0)\"><path data-c=\"1D456\" d=\"M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mo\" transform=\"translate(11162.7,0)\"><path data-c=\"2212\" d=\"M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mn\" transform=\"translate(12162.9,0)\"><path data-c=\"31\" d=\"M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mo\" transform=\"translate(12662.9,0)\"><path data-c=\"5D\" d=\"M22 710V750H159V-250H22V-210H119V710H22Z\" style=\"stroke-width: 3;\"\/><\/g><g data-mml-node=\"mo\" transform=\"translate(12940.9,0)\"><path data-c=\"29\" d=\"M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z\" style=\"stroke-width: 3;\"\/><\/g><\/g><\/g><\/svg><mjx-assistive-mml unselectable=\"on\" display=\"inline\" style=\"top: 0px; left: 0px; clip: rect(1px, 1px, 1px, 1px); -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; position: absolute; padding: 1px 0px 0px 0px; border: 0px; display: block; width: auto; overflow: hidden;\"><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><mi>W<\/mi><mo stretchy=\"false\">[<\/mo><mi>i<\/mi><mo stretchy=\"false\">]<\/mo><mo>=<\/mo><mi>W<\/mi><mo stretchy=\"false\">[<\/mo><mi>i<\/mi><mo>\u2212<\/mo><mn>4<\/mn><mo stretchy=\"false\">]<\/mo><mo>\u2295<\/mo><mi>T<\/mi><mo stretchy=\"false\">(<\/mo><mi>W<\/mi><mo stretchy=\"false\">[<\/mo><mi>i<\/mi><mo>\u2212<\/mo><mn>1<\/mn><mo stretchy=\"false\">]<\/mo><mo stretchy=\"false\">)<\/mo><\/math><\/mjx-assistive-mml><\/mjx-container><\/li>\n<\/ul>\n<h3>T\u51fd\u6570\u6d41\u7a0b<\/h3>\n<ol>\n<li>\u5b57\u5faa\u73af<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251101174856.png\" alt=\"image.png|600\"><\/p>\n<ol start=\"2\">\n<li>\u5b57\u8282\u4ee3\u6362<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251101174948.png\" alt=\"image.png|600\"><\/p>\n<ol start=\"3\">\n<li>\u8f6e\u5e38\u91cf\u5f02\u6216,\u5c06\u4e0a\u4e00\u8f6e\u5f97\u5230\u7684\u7ed3\u679c\u548cRcon[j]\u5f02\u6216,j\u662f\u8f6e\u6570<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251101175704.png\" alt=\"image.png|600\"><\/p>\n<h2>\u6bd4\u8d5b\u4e2d\u7684\u9b54\u6539<\/h2>\n<pre><code>1. \u4fee\u6539SBOX\n2. \u4fee\u6539RCON\u8f6e\u5e38\u91cf\n3. \u4fee\u6539\u4f4d\u79fb\u903b\u8f91,\u5e94\u8be5\u4e0d\u5e38\u89c1\n<\/code><\/pre>\n<h2>\u4ee3\u7801\u5b9e\u73b0<\/h2>\n<pre><code class=\"language-cpp\">\/*\n * AES (Advanced Encryption Standard) \u7b97\u6cd5\u8be6\u89e3\uff1a\n * - \u5206\u7ec4\u5bc6\u7801\u7b97\u6cd5\uff0c\u5206\u7ec4\u957f\u5ea6\u56fa\u5b9a\u4e3a128\u4f4d(16\u5b57\u8282)\n * - \u5bc6\u94a5\u957f\u5ea6\u652f\u6301128\u4f4d(10\u8f6e)\u3001192\u4f4d(12\u8f6e)\u3001256\u4f4d(14\u8f6e)\n * - \u6bcf\u8f6e\u5305\u542b4\u4e2a\u53d8\u6362\uff1aSubBytes\u3001ShiftRows\u3001MixColumns\u3001AddRoundKey\n * - \u91c7\u7528SPN (Substitution-Permutation Network) \u7ed3\u6784\n *\n * \u6570\u5b66\u57fa\u7840\uff1a\n * - \u5728GF(2^8)\u6709\u9650\u57df\u4e0a\u8fd0\u7b97\n * - \u4f7f\u7528\u4e0d\u53ef\u7ea6\u591a\u9879\u5f0f m(x) = x^8 + x^4 + x^3 + x + 1 (0x11B)\n * - S-box\u57fa\u4e8e\u6709\u9650\u57df\u9006\u5143\u548c\u4eff\u5c04\u53d8\u6362\u6784\u9020\n *\n * Build: gcc -O2 -std=c99 aes.c -o aes\n *\/\n#include &lt;stdint.h&gt;\n#include &lt;stddef.h&gt;\n#include &lt;string.h&gt;\n#include &lt;stdio.h&gt;\n\n\/*==================== \u5e38\u91cf\u8868\uff1aS-box &amp; Rcon ====================*\/\n\/*\n * AES S-Box\uff08FIPS-197\uff0c\u88684\uff09\n * \u4f5c\u7528\uff1a\u975e\u7ebf\u6027\u66ff\u6362\u8868\uff0c\u63d0\u4f9b\u7b97\u6cd5\u7684\u6df7\u6dc6\u7279\u6027\n * \u6784\u9020\u539f\u7406\uff1a\n *   - \u5bf9\u6bcf\u4e2a\u5b57\u8282\u6c42GF(2^8)\u4e0a\u7684\u4e58\u6cd5\u9006\u5143\uff080x00\u6620\u5c04\u5230\u81ea\u8eab\uff09\n *   - \u5e94\u7528\u4eff\u5c04\u53d8\u6362\uff1ay = A\u00b7x\u207b\u00b9 + b\n *   - \u5176\u4e2dA\u662f8\u00d78\u77e9\u9635\uff0cb\u662f\u5e38\u6570\u5411\u91cf\n * \u7279\u6027\uff1a\u4e25\u683c\u96ea\u5d29\u6548\u5e94\u3001\u975e\u7ebf\u6027\u5ea6\u9ad8\u7b49\n * ========\u7528\u4e8e\u5bc6\u94a5\u62d3\u5c55=======\n *\/\nstatic const uint8_t sbox[256] = {\n  0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,\n  0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,\n  0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,\n  0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,\n  0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,\n  0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,\n  0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,\n  0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,\n  0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,\n  0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,\n  0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,\n  0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,\n  0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,\n  0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,\n  0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,\n  0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16\n};\n\n\/*\n * \u8f6e\u5e38\u91cf Rcon\uff08\u53ea\u9700\u5230 14 \u5373\u53ef\uff09\n * \u4f5c\u7528\uff1a\u5728\u5bc6\u94a5\u6269\u5c55\u8fc7\u7a0b\u4e2d\u63d0\u4f9b\u975e\u7ebf\u6027\u5e38\u6570\n * \u6784\u9020\uff1aRcon[i] = x^(i-1) mod m(x)\uff0c\u5176\u4e2dm(x)=0x11B\n * \u5373\uff1aRcon[1]=0x01, Rcon[2]=0x02, Rcon[3]=0x04, ...\n * \u6ce8\u610f\uff1aRcon[0]\u672a\u4f7f\u7528\uff0c\u7d22\u5f15\u4ece1\u5f00\u59cb\n * ========\u7528\u4e8e\u5bc6\u94a5\u62d3\u5c55========\n *\/\nstatic const uint8_t Rcon[15] = {\n  0x00, \/* unused *\/\n  0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1B,0x36,\n  0x6C,0xD8,0xAB,0x4D\n};\n\n\/*==================== \u5de5\u5177\u5b8f\u4e0e\u4e0a\u4e0b\u6587 ====================*\/\n\n\/* AES \u7b97\u6cd5\u4e0a\u4e0b\u6587\u7ed3\u6784\u4f53\n * - round_keys: \u5b58\u50a8\u8f6e\u5bc6\u94a5\u7684\u6570\u7ec4\n *   - \u6bcf\u8f6e\u9700\u898116\u5b57\u8282\u5bc6\u94a5\n *   - \u6700\u591a\u9700\u898115\u8f6e\uff0c\u56e0\u6b64\u603b\u957f\u5ea6\u4e3a 15*16=240 \u5b57\u8282\n *   - \u6309\u8f6e\u987a\u5e8f\u8fde\u7eed\u5b58\u50a8\uff0c\u6bcf\u8f6e\u5360\u7528\u8fde\u7eed\u768416\u5b57\u8282\n * - Nr: \u52a0\u5bc6\u8f6e\u6570\uff0c\u53d6\u51b3\u4e8e\u5bc6\u94a5\u957f\u5ea6\n *   - AES-128\uff1a10\u8f6e\n *   - AES-192\uff1a12\u8f6e\n *   - AES-256\uff1a14\u8f6e\n *\/\ntypedef struct {\n    uint8_t round_keys[240];  \/* \u8f6e\u5bc6\u94a5\u6570\u7ec4\uff0c\u6bcf\u8f6e16\u5b57\u8282\uff0c\u6700\u591a15\u8f6e *\/\n    int Nr;                   \/* \u52a0\u5bc6\u8f6e\u6570\uff1a128\u4f4d\u5bc6\u94a5=10\u8f6e, 192\u4f4d=12\u8f6e, 256\u4f4d=14\u8f6e *\/\n} aes_ctx;\n\n\/*\n * GF(2^8) \u4e0a\u7684 xtime\uff1a\u4e58\u4ee5 2\n * \u4f5c\u7528\uff1a\u5728GF(2^8)\u6709\u9650\u57df\u4e0a\u8ba1\u7b97 x * 2\n * \u539f\u7406\uff1a\n *   - \u5de6\u79fb1\u4f4d\u76f8\u5f53\u4e8e\u4e58\u4ee52\n *   - \u5982\u679c\u6700\u9ad8\u4f4d\u4e3a1\uff08x &amp; 0x80\uff09\uff0c\u9700\u8981\u6a21\u7ea6\u51cf\uff1a\u5f02\u6216\u4e0d\u53ef\u7ea6\u591a\u9879\u5f0f0x1B\n *   - \u5426\u5219\u76f4\u63a5\u8fd4\u56de\u5de6\u79fb\u7ed3\u679c\n * \u6570\u5b66\uff1ax * 2 = (x &lt;&lt; 1) \u2295 (x\u2087 ? 0x1B : 0x00)\n *\/\nstatic inline uint8_t xtime(uint8_t x) {\n    return (uint8_t)((x &lt;&lt; 1) ^ ((x &amp; 0x80) ? 0x1B : 0x00));\n}\n\n\/*==================== \u6838\u5fc3\u53d8\u6362\uff1aSubBytes \/ ShiftRows \/ MixColumns \/ AddRoundKey ====================*\/\n\n\/* \u5bf9 state \u7684 16 \u5b57\u8282\u9010\u5b57\u8282\u8fc7 S-box *\/\nstatic inline void SubBytes(uint8_t st[16]) {\n    for (int i = 0; i &lt; 16; ++i) st[i] = sbox[st[i]];\n}\n\n\/* AES \u7684\u884c\u79fb\u4f4d\u53d8\u6362\n * \u529f\u80fd\uff1a\u5bf9\u72b6\u6001\u77e9\u9635\u7684\u6bcf\u4e00\u884c\u8fdb\u884c\u5faa\u73af\u5de6\u79fb\n * \u53c2\u6570\uff1a\n *   - st[16]: \u72b6\u6001\u77e9\u9635\uff0c\u6309\u5217\u4f18\u5148\u987a\u5e8f\u5b58\u50a8\uff08\u7d22\u5f15 = 4*\u5217 + \u884c\uff09\n * \u53d8\u6362\u89c4\u5219\uff1a\n *   - \u7b2c0\u884c\uff08row 0\uff09\uff1a\u4e0d\u79fb\u52a8\n *   - \u7b2c1\u884c\uff08row 1\uff09\uff1a\u5faa\u73af\u5de6\u79fb1\u4f4d\n *   - \u7b2c2\u884c\uff08row 2\uff09\uff1a\u5faa\u73af\u5de6\u79fb2\u4f4d\n *   - \u7b2c3\u884c\uff08row 3\uff09\uff1a\u5faa\u73af\u5de6\u79fb3\u4f4d\n * \u6ce8\u610f\uff1a\u8fd9\u662fAES\u52a0\u5bc6\u4e2d\u7684\u5173\u952e\u6b65\u9aa4\u4e4b\u4e00\uff0c\u7528\u4e8e\u63d0\u4f9b\u6269\u6563\u6027\n *\/\nstatic inline void ShiftRows(uint8_t st[16]) {\n    uint8_t t;\n\n    \/* \u7b2c1\u884c\uff1a1\u5b57\u8282\u5faa\u73af\u5de6\u79fb\uff1a\u7d22\u5f15 1,5,9,13 *\/\n    t = st[1];\n    st[1]  = st[5];\n    st[5]  = st[9];\n    st[9]  = st[13];\n    st[13] = t;\n\n    \/* \u7b2c2\u884c\uff1a2\u5b57\u8282\u5faa\u73af\u5de6\u79fb\uff1a\u7d22\u5f15 2,6,10,14 *\/\n    t = st[2];\n    st[2]  = st[10];\n    st[10] = t;\n    t = st[6];\n    st[6]  = st[14];\n    st[14] = t;\n\n    \/* \u7b2c3\u884c\uff1a3\u5b57\u8282\u5faa\u73af\u5de6\u79fb\uff1a\u7d22\u5f15 3,7,11,15 *\/\n    t = st[3];\n    st[3]  = st[15];\n    st[15] = st[11];\n    st[11] = st[7];\n    st[7]  = t;\n}\n\n\/*\n * \u5217\u6df7\u6dc6\uff1a\u5bf9\u6bcf\u4e00\u5217\u505a GF(2^8) \u7ebf\u6027\u53d8\u6362\n * \u4f5c\u7528\uff1a\u5728\u5217\u4e0a\u5e94\u7528\u7ebf\u6027\u53d8\u6362\uff0c\u63d0\u4f9b\u7b97\u6cd5\u7684\u6269\u6563\u7279\u6027\n * \u6570\u5b66\u539f\u7406\uff1a\u6bcf\u5217\u4e58\u4ee5\u56fa\u5b9a\u77e9\u9635 M\uff1a\n *   [02 03 01 01]   [a0]\n *   [01 02 03 01] \u00d7 [a1]\n *   [01 01 02 03]   [a2]\n *   [03 01 01 02]   [a3]\n * \u4f18\u5316\u5b9e\u73b0\uff1a\u4f7f\u7528xtime\u548c\u5f02\u6216\u8fd0\u7b97\u9ad8\u6548\u8ba1\u7b97\n * \u7b97\u6cd5\u6b65\u9aa4\uff1a\n *   1. \u8ba1\u7b97\u5217\u4e2d\u6240\u6709\u5b57\u8282\u7684\u5f02\u6216\uff1at = a0 \u2295 a1 \u2295 a2 \u2295 a3\n *   2. \u5bf9\u6bcf\u5b57\u8282\u5e94\u7528\uff1ab_i = a_i \u2295 t \u2295 xtime(a_i \u2295 a_{i+1})\n *   3. \u5176\u4e2da4 = a0\uff08\u5faa\u73af\uff09\n *\/\nstatic inline void MixColumns(uint8_t st[16]) {\n    for (int c = 0; c &lt; 4; ++c) {\n        uint8_t *col = &amp;st[4*c];\n        uint8_t a0 = col[0], a1 = col[1], a2 = col[2], a3 = col[3];\n        uint8_t t  = (uint8_t)(a0 ^ a1 ^ a2 ^ a3);\n        uint8_t u0 = a0;\n\n        col[0] ^= t ^ xtime((uint8_t)(a0 ^ a1));\n        col[1] ^= t ^ xtime((uint8_t)(a1 ^ a2));\n        col[2] ^= t ^ xtime((uint8_t)(a2 ^ a3));\n        col[3] ^= t ^ xtime((uint8_t)(a3 ^ u0));\n    }\n}\n\n\/* \u52a0\u8f6e\u5bc6\u94a5\uff1ast[i] ^= rk[i] *\/\nstatic inline void AddRoundKey(uint8_t st[16], const uint8_t *rk) {\n    for (int i = 0; i &lt; 16; ++i) st[i] ^= rk[i];\n}\n\n\/*==================== Key Schedule\uff08\u5bc6\u94a5\u6269\u5c55\uff09 ====================*\/\n\n\/* \u65cb\u8f6c 4 \u5b57\u8282\uff1aa0 a1 a2 a3 -&gt; a1 a2 a3 a0 *\/\nstatic inline void RotWord(uint8_t w[4]) {\n    uint8_t t = w[0];\n    w[0] = w[1]; w[1] = w[2]; w[2] = w[3]; w[3] = t;\n}\n\n\/* 4 \u5b57\u8282\u9010\u5b57\u8282 S-box *\/\nstatic inline void SubWord(uint8_t w[4]) {\n    w[0] = sbox[w[0]];\n    w[1] = sbox[w[1]];\n    w[2] = sbox[w[2]];\n    w[3] = sbox[w[3]];\n}\n\n\/* AES \u5bc6\u94a5\u6269\u5c55\u51fd\u6570 \n * \u529f\u80fd\uff1a\u6839\u636e\u539f\u59cb\u5bc6\u94a5\u751f\u6210\u6240\u6709\u8f6e\u5bc6\u94a5\n * \u53c2\u6570\uff1a\n *   - ctx: AES \u4e0a\u4e0b\u6587\u7ed3\u6784\u4f53\u6307\u9488\n *   - key: \u539f\u59cb\u5bc6\u94a5\u6570\u7ec4\n *   - keybits: \u5bc6\u94a5\u957f\u5ea6\uff08\u652f\u6301128\/192\/256\u4f4d\uff09\n * \u8fd4\u56de\u503c\uff1a\n *   - 0: \u6210\u529f\n *   - -1: \u4e0d\u652f\u6301\u7684\u5bc6\u94a5\u957f\u5ea6\n * \u8bf4\u660e\uff1a\n *   - \u751f\u6210\u7684\u8f6e\u5bc6\u94a5\u5b58\u50a8\u5728 ctx-&gt;round_keys \u4e2d\n *   - \u6bcf\u8f6e\u9700\u8981 16 \u5b57\u8282\u5bc6\u94a5\n *   - \u5bc6\u94a5\u6309\u8f6e\u987a\u5e8f\u8fde\u7eed\u5b58\u50a8\n *   - \u652f\u6301 AES-128\/192\/256 \u4e09\u79cd\u89c4\u683c\n *\/\nstatic int aes_init(aes_ctx *ctx, const uint8_t *key, int keybits) {\n    int Nk, Nr;\n    if (keybits == 128) { Nk = 4; Nr = 10; }\n    else if (keybits == 192) { Nk = 6; Nr = 12; }\n    else if (keybits == 256) { Nk = 8; Nr = 14; }\n    else return -1;\n\n    ctx-&gt;Nr = Nr;\n\n    \/* W \u4e00\u5171 Nb*(Nr+1) \u4e2a 32bit \u8bcd\uff1bNb=4 -&gt; 4*(Nr+1) \u4e2a\u8bcd -&gt; (Nr+1)*16 \u5b57\u8282 *\/\n    const int Nb = 4;\n    const int total_words = Nb * (Nr + 1);\n    uint8_t *rk = ctx-&gt;round_keys;\n\n    \/* \u5148\u62f7\u5165\u521d\u59cb\u5bc6\u94a5\uff08Nk*4 \u5b57\u8282\uff09 *\/\n    for (int i = 0; i &lt; Nk*4; ++i) rk[i] = key[i];\n\n    int iword = Nk;          \/* \u5df2\u751f\u6210\u7684\u8bcd\u4e2a\u6570\uff0c\u4ece Nk \u5f00\u59cb *\/\n    int rconi = 1;           \/* Rcon \u7d22\u5f15\uff0c\u4ece 1 \u5f00\u59cb *\/\n    uint8_t temp[4];\n\n    while (iword &lt; total_words) {\n        \/* temp = W[i-1] *\/\n        temp[0] = rk[4*(iword-1) + 0];\n        temp[1] = rk[4*(iword-1) + 1];\n        temp[2] = rk[4*(iword-1) + 2];\n        temp[3] = rk[4*(iword-1) + 3];\n\n        if (iword % Nk == 0) {\n            RotWord(temp);\n            SubWord(temp);\n            temp[0] ^= Rcon[rconi++];\n        } else if (Nk &gt; 6 &amp;&amp; (iword % Nk == 4)) {\n            \/* AES-256 \u989d\u5916\u5b50\u5b57\u8282\u66ff\u6362 *\/\n            SubWord(temp);\n        }\n\n        \/* W[i] = W[i-Nk] XOR temp *\/\n        rk[4*iword + 0] = (uint8_t)(rk[4*(iword-Nk) + 0] ^ temp[0]);\n        rk[4*iword + 1] = (uint8_t)(rk[4*(iword-Nk) + 1] ^ temp[1]);\n        rk[4*iword + 2] = (uint8_t)(rk[4*(iword-Nk) + 2] ^ temp[2]);\n        rk[4*iword + 3] = (uint8_t)(rk[4*(iword-Nk) + 3] ^ temp[3]);\n\n        ++iword;\n    }\n    return 0;\n}\n\n\/*==================== \u5355\u5757\u52a0\u5bc6\uff08ECB \u57fa\u5143\uff09 ====================*\/\n\n\/* AES \u5355\u5757\u52a0\u5bc6\u51fd\u6570\n * \u529f\u80fd\uff1a\u5bf916\u5b57\u8282\u660e\u6587\u5757\u8fdb\u884cAES\u52a0\u5bc6\n * \u53c2\u6570\uff1a\n *   - ctx: AES\u4e0a\u4e0b\u6587\u7ed3\u6784\u4f53\u6307\u9488\uff0c\u5305\u542b\u8f6e\u5bc6\u94a5, \u8f6e\u6570\u7b49\u57fa\u672c\u4fe1\u606f\n *   - in[16]: \u8f93\u5165\u660e\u6587\u5757\uff0816\u5b57\u8282\uff09\n *   - out[16]: \u8f93\u51fa\u5bc6\u6587\u5757\uff0816\u5b57\u8282\uff09\n * \u52a0\u5bc6\u6b65\u9aa4\uff1a\n *   1. \u8f6e0\uff1a\u53ea\u8fdb\u884cAddRoundKey\n *   2. \u8f6e1~(Nr-1)\uff1aSubBytes\u3001ShiftRows\u3001MixColumns\u3001AddRoundKey\n *   3. \u6700\u540e\u4e00\u8f6e\uff1aSubBytes\u3001ShiftRows\u3001AddRoundKey\uff08\u65e0MixColumns\uff09\n * \u6ce8\u610f\uff1a\u8fd9\u662fECB\u6a21\u5f0f\u7684\u57fa\u672c\u5355\u5143\uff0c\u5b9e\u9645\u4f7f\u7528\u5efa\u8bae\u91c7\u7528\u66f4\u5b89\u5168\u7684CBC\u7b49\u6a21\u5f0f\n *\/\nstatic void aes_encrypt_block(const aes_ctx *ctx,\n                              const uint8_t in[16],\n                              uint8_t out[16]) {\n    uint8_t st[16];\n    memcpy(st, in, 16);\n\n    const uint8_t *round_key = ctx-&gt;round_keys;\n\n    \/* \u8f6e 0\uff1aAddRoundKey *\/\n    AddRoundKey(st, round_key);\n    round_key += 16;\n\n    \/* \u8f6e 1..Nr-1 *\/\n    for (int round = 1; round &lt; ctx-&gt;Nr; ++round) {\n        SubBytes(st);\n        ShiftRows(st);\n        MixColumns(st);\n        AddRoundKey(st, round_key);\n        round_key += 16;\n    }\n\n    \/* \u6700\u540e\u4e00\u8f6e\uff1a\u65e0 MixColumns *\/\n    SubBytes(st);\n    ShiftRows(st);\n    AddRoundKey(st, round_key);\n\n    memcpy(out, st, 16);\n}\n\n\/*==================== CBC + PKCS#7 \u586b\u5145\u52a0\u5bc6 ====================*\/\n\/* AES-CBC \u6a21\u5f0f\u52a0\u5bc6\u51fd\u6570\uff08\u5e26PKCS#7\u586b\u5145\uff09\n * \u529f\u80fd\uff1a\u4f7f\u7528CBC\u6a21\u5f0f\u5bf9\u4efb\u610f\u957f\u5ea6\u660e\u6587\u8fdb\u884cAES\u52a0\u5bc6\uff0c\u5e76\u8fdb\u884cPKCS#7\u586b\u5145\n * \u53c2\u6570\uff1a\n *   - ctx: AES\u4e0a\u4e0b\u6587\u7ed3\u6784\u4f53\u6307\u9488\n *   - in: \u8f93\u5165\u660e\u6587\u7f13\u51b2\u533a\n *   - in_len: \u660e\u6587\u957f\u5ea6\uff08\u5b57\u8282\u6570\uff09\n *   - iv_in: \u521d\u59cb\u5316\u5411\u91cf\uff0816\u5b57\u8282\uff09\n *   - out: \u8f93\u51fa\u5bc6\u6587\u7f13\u51b2\u533a\n *   - out_len: \u8fd4\u56de\u5b9e\u9645\u5bc6\u6587\u957f\u5ea6\n * \u8fd4\u56de\u503c\uff1a\n *   - 0: \u6210\u529f\n * \u8bf4\u660e\uff1a\n *   - CBC\u6a21\u5f0f\uff1a\u6bcf\u4e2a\u660e\u6587\u5757\u4e0e\u524d\u4e00\u4e2a\u5bc6\u6587\u5757\u5f02\u6216\u540e\u518d\u52a0\u5bc6\n *   - PKCS#7\u586b\u5145\uff1a\u4e0d\u8db316\u5b57\u8282\u7684\u90e8\u5206\u586b\u5145\u4e3a\u7f3a\u5c11\u7684\u5b57\u8282\u6570\n *   - \u8f93\u51fa\u7f13\u51b2\u533a\u9700\u9884\u7559\u8db3\u591f\u7a7a\u95f4\uff1ain_len + (16 - in_len%16)\u5b57\u8282\n *   - \u8f93\u51fa\u957f\u5ea6\u4e00\u5b9a\u662f16\u7684\u500d\u6570\n *\/\nstatic int aes_cbc_encrypt_pkcs7(const aes_ctx *ctx,\n                                 const uint8_t *in, size_t in_len,\n                                 const uint8_t iv_in[16],\n                                 uint8_t *out, size_t *out_len) {\n    uint8_t iv[16];\n    memcpy(iv, iv_in, 16);\n\n    size_t pad = 16 - (in_len % 16);\n    if (pad == 0) pad = 16; \/* PKCS#7\uff1a\u6574\u5757\u4e5f\u8981\u8865 16 \u4e2a 0x10 *\/\n\n    size_t total = in_len + pad;\n    size_t nblocks = total \/ 16;\n\n    size_t i = 0, b = 0;\n\n    \/* \u5904\u7406\u6574\u5757\u90e8\u5206 *\/\n    for (; b &lt; in_len \/ 16; ++b) {\n        uint8_t buf[16];\n        \/* XOR \u660e\u6587\u4e0e IV\/\u4e0a\u4e00\u5757\u5bc6\u6587 *\/\n        for (int j = 0; j &lt; 16; ++j)\n            buf[j] = (uint8_t)(in[i + j] ^ iv[j]);\n        \/* \u52a0\u5bc6 *\/\n        aes_encrypt_block(ctx, buf, &amp;out[i]);\n        \/* \u66f4\u65b0 IV \u4e3a\u672c\u5757\u5bc6\u6587 *\/\n        memcpy(iv, &amp;out[i], 16);\n        i += 16;\n    }\n\n    \/* \u5904\u7406\u5c3e\u5757 + PKCS#7 \u586b\u5145 *\/\n    {\n        uint8_t last[16];\n        size_t rem = in_len - i; \/* \u5269\u4f59\u5b57\u8282\u6570\uff080..15\uff09 *\/\n\n        \/* \u62f7\u5165\u5269\u4f59\u5b57\u8282 *\/\n        for (size_t j = 0; j &lt; rem; ++j)\n            last[j] = in[i + j];\n        \/* \u586b\u5145 pad \u503c *\/\n        for (size_t j = rem; j &lt; 16; ++j)\n            last[j] = (uint8_t)pad;\n\n        \/* CBC XOR *\/\n        for (int j = 0; j &lt; 16; ++j)\n            last[j] ^= iv[j];\n\n        aes_encrypt_block(ctx, last, &amp;out[i]);\n        i += 16;\n    }\n\n    *out_len = i;\n    (void)nblocks; \/* \u672a\u76f4\u63a5\u4f7f\u7528\uff0c\u4ec5\u6ce8\u91ca\u7528 *\/\n    return 0;\n}\n\n\/*==================== \u53ef\u9009\uff1a\u81ea\u6d4b\uff08FIPS-197 \u5355\u5757\uff09 ====================*\/\n#define AES_TEST\n#ifdef AES_TEST\nstatic void print_hex(const uint8_t *p, size_t n) {\n    for (size_t i = 0; i &lt; n; ++i) printf(&quot;%02x&quot;, p[i]);\n    printf(&quot;\\n&quot;);\n}\n\nint main(void) {\n    \/* FIPS-197 \u9644\u5f55C\uff1aAES-128 \u5355\u5757\u6d4b\u8bd5 *\/\n    const uint8_t key128[16] = {\n        0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,\n        0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f\n    };\n    const uint8_t pt[16] = {\n        0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,\n        0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff\n    };\n    const uint8_t expect_ct[16] = {\n        0x69,0xc4,0xe0,0xd8,0x6a,0x7b,0x04,0x30,\n        0xd8,0xcd,0xb7,0x80,0x70,0xb4,0xc5,0x5a\n    };\n\n    aes_ctx ctx;\n    if (aes_init(&amp;ctx, key128, 128) != 0) {\n        printf(&quot;init failed\\n&quot;);\n        return 1;\n    }\n\n    uint8_t ct[16];\n    aes_encrypt_block(&amp;ctx, pt, ct);\n\n    printf(&quot;AES-128 block enc expect:\\n&quot;);\n    print_hex(expect_ct, 16);\n    printf(&quot;result:\\n&quot;);\n    print_hex(ct, 16);\n\n    \/* \u989d\u5916\u6f14\u793a CBC+PKCS#7 *\/\n    const uint8_t iv[16] = {\n        0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,\n        0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f\n    };\n    const uint8_t msg[] = &quot;Hello AES-CBC with PKCS7!&quot;;\n    uint8_t out[128]; size_t outlen = 0;\n\n    aes_cbc_encrypt_pkcs7(&amp;ctx, msg, sizeof(msg)-1, iv, out, &amp;outlen);\n    printf(&quot;CBC+PKCS7 ciphertext (%zu bytes):\\n&quot;, outlen);\n    print_hex(out, outlen);\n\n    return 0;\n}\n#endif\n\n<\/code><\/pre>\n<h2>\u89e3\u5bc6\u4ee3\u7801<\/h2>\n<pre><code class=\"language-cpp\">\/* aes_decrypt.c - AES-ECB\/CBC decryption (AES-128\/192\/256), no dependencies.\n   Public domain \/ CC0-style. Use at your own risk.\n\n   API:\n     - enum AESKeyLen { AES128 = 16, AES192 = 24, AES256 = 32 };\n     - struct AESCtx { uint32_t rk[60]; int Nr; };\n     - void aes_init(struct AESCtx* ctx, const uint8_t* key, size_t keylen);\n     - void aes_decrypt_block(const struct AESCtx* ctx, const uint8_t in[16], uint8_t out[16]);\n     - void aes_ecb_decrypt(const struct AESCtx* ctx, const uint8_t* in, uint8_t* out, size_t len);\n     - void aes_cbc_decrypt(const struct AESCtx* ctx, const uint8_t* in, uint8_t* out, size_t len, const uint8_t iv[16]);\n     - int  pkcs7_unpad(uint8_t* buf, size_t* inout_len); \/\/ returns 0 on success, -1 on bad padding\n\n   Minimal demo (not compiled by default):\n     \/\/ struct AESCtx ctx; uint8_t key[16]={...}, iv[16]={...};\n     \/\/ aes_init(&amp;ctx, key, AES128);\n     \/\/ aes_cbc_decrypt(&amp;ctx, ciphertext, plaintext, clen, iv);\n     \/\/ size_t plen = clen; if (pkcs7_unpad(plaintext, &amp;plen)==0) { ...use plen... }\n*\/\n#include &lt;stdlib.h&gt;\n#include &lt;stdint.h&gt;\n#include &lt;stddef.h&gt;\n#include &lt;stdio.h&gt;\n#include &lt;string.h&gt;\n\nenum AESKeyLen { AES128 = 16, AES192 = 24, AES256 = 32 };\n\nstruct AESCtx {\n    uint32_t rk[60]; \/* round keys: up to 4*(Nr+1) words = 60 for AES-256 *\/\n    int Nr;          \/* number of rounds: 10\/12\/14 *\/\n};\n\n\/* --------- Tables --------- *\/\nstatic const uint8_t sbox[256] = {\n  \/* 0x00 *\/0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,\n  \/* 0x10 *\/0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,\n  \/* 0x20 *\/0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,\n  \/* 0x30 *\/0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,\n  \/* 0x40 *\/0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,\n  \/* 0x50 *\/0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,\n  \/* 0x60 *\/0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,\n  \/* 0x70 *\/0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,\n  \/* 0x80 *\/0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,\n  \/* 0x90 *\/0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,\n  \/* 0xA0 *\/0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,\n  \/* 0xB0 *\/0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,\n  \/* 0xC0 *\/0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,\n  \/* 0xD0 *\/0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,\n  \/* 0xE0 *\/0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,\n  \/* 0xF0 *\/0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16\n};\n\nstatic const uint8_t inv_sbox[256] = {\n  \/* 0x00 *\/0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,\n  \/* 0x10 *\/0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb,\n  \/* 0x20 *\/0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e,\n  \/* 0x30 *\/0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25,\n  \/* 0x40 *\/0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92,\n  \/* 0x50 *\/0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84,\n  \/* 0x60 *\/0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06,\n  \/* 0x70 *\/0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b,\n  \/* 0x80 *\/0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73,\n  \/* 0x90 *\/0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e,\n  \/* 0xA0 *\/0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b,\n  \/* 0xB0 *\/0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4,\n  \/* 0xC0 *\/0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f,\n  \/* 0xD0 *\/0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef,\n  \/* 0xE0 *\/0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61,\n  \/* 0xF0 *\/0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d\n};\n\nstatic const uint32_t Rcon[10] = {\n    0x01000000U,0x02000000U,0x04000000U,0x08000000U,0x10000000U,\n    0x20000000U,0x40000000U,0x80000000U,0x1B000000U,0x36000000U\n};\n\n\/* --------- Helpers --------- *\/\nstatic inline uint32_t ROTL8(uint32_t x){ return (x&lt;&lt;8)|(x&gt;&gt;24); }\nstatic inline uint8_t xtime(uint8_t x){ return (uint8_t)((x&lt;&lt;1) ^ ((x&amp;0x80)?0x1b:0x00)); }\n\nstatic uint8_t gmul(uint8_t a, uint8_t b){\n    \/* multiply in GF(2^8) *\/\n    uint8_t p = 0;\n    for (int i=0;i&lt;8;i++){\n        if (b &amp; 1) p ^= a;\n        uint8_t hi = a &amp; 0x80;\n        a &lt;&lt;= 1;\n        if (hi) a ^= 0x1b;\n        b &gt;&gt;= 1;\n    }\n    return p;\n}\n\nstatic uint32_t pack_be(const uint8_t b[4]){\n    return ((uint32_t)b[0]&lt;&lt;24)|((uint32_t)b[1]&lt;&lt;16)|((uint32_t)b[2]&lt;&lt;8)|((uint32_t)b[3]);\n}\nstatic void unpack_be(uint32_t w, uint8_t b[4]){\n    b[0]=(uint8_t)(w&gt;&gt;24); b[1]=(uint8_t)(w&gt;&gt;16); b[2]=(uint8_t)(w&gt;&gt;8); b[3]=(uint8_t)w;\n}\n\n\/* SubWord (forward sbox) used in key expansion *\/\nstatic uint32_t SubWord(uint32_t w){\n    uint8_t b[4]; unpack_be(w,b);\n    b[0]=sbox[b[0]]; b[1]=sbox[b[1]]; b[2]=sbox[b[2]]; b[3]=sbox[b[3]];\n    return pack_be(b);\n}\n\n\/* --------- Key Expansion --------- *\/\nvoid aes_init(struct AESCtx* ctx, const uint8_t* key, size_t keylen){\n    int Nk, Nr;\n    if (keylen == AES128){ Nk=4; Nr=10; }\n    else if (keylen == AES192){ Nk=6; Nr=12; }\n    else if (keylen == AES256){ Nk=8; Nr=14; }\n    else { \/* default: treat as 128 *\/\n        Nk=4; Nr=10;\n    }\n    ctx-&gt;Nr = Nr;\n\n    \/* copy initial key words *\/\n    for (int i=0;i&lt;Nk;i++){\n        ctx-&gt;rk[i] = pack_be(key + 4*i);\n    }\n    int i = Nk;\n    for (int rcon_idx=0; i &lt; 4*(Nr+1); i++){\n        uint32_t temp = ctx-&gt;rk[i-1];\n        if (i % Nk == 0){\n            temp = SubWord(ROTL8(temp)) ^ Rcon[rcon_idx++];\n        } else if (Nk &gt; 6 &amp;&amp; (i % Nk) == 4){\n            temp = SubWord(temp);\n        }\n        ctx-&gt;rk[i] = ctx-&gt;rk[i-Nk] ^ temp;\n    }\n}\n\n\/* --------- Inverse cipher (one block) --------- *\/\n\nstatic void AddRoundKey(uint8_t state[16], const uint32_t* rk){\n    for (int c=0;c&lt;4;c++){\n        uint8_t t[4];\n        unpack_be(rk[c], t);\n        state[4*c+0] ^= t[0];\n        state[4*c+1] ^= t[1];\n        state[4*c+2] ^= t[2];\n        state[4*c+3] ^= t[3];\n    }\n}\n\nstatic void InvSubBytes(uint8_t s[16]){\n    for (int i=0;i&lt;16;i++) s[i] = inv_sbox[s[i]];\n}\n\nstatic void InvShiftRows(uint8_t s[16]){\n    uint8_t t;\n\n    \/* Row1: shift right by 1 *\/\n    t = s[13]; s[13]=s[9]; s[9]=s[5]; s[5]=s[1]; s[1]=t;\n    \/* Row2: shift right by 2 *\/\n    t = s[2]; s[2]=s[10]; s[10]=t; t=s[6]; s[6]=s[14]; s[14]=t;\n    \/* Row3: shift right by 3 (left by 1) *\/\n    t = s[3]; s[3]=s[7]; s[7]=s[11]; s[11]=s[15]; s[15]=t;\n}\n\nstatic void InvMixColumns(uint8_t s[16]){\n    for (int c=0;c&lt;4;c++){\n        uint8_t *col = &amp;s[4*c];\n        uint8_t a0=col[0], a1=col[1], a2=col[2], a3=col[3];\n        col[0] = (uint8_t)( gmul(a0,0x0e) ^ gmul(a1,0x0b) ^ gmul(a2,0x0d) ^ gmul(a3,0x09) );\n        col[1] = (uint8_t)( gmul(a0,0x09) ^ gmul(a1,0x0e) ^ gmul(a2,0x0b) ^ gmul(a3,0x0d) );\n        col[2] = (uint8_t)( gmul(a0,0x0d) ^ gmul(a1,0x09) ^ gmul(a2,0x0e) ^ gmul(a3,0x0b) );\n        col[3] = (uint8_t)( gmul(a0,0x0b) ^ gmul(a1,0x0d) ^ gmul(a2,0x09) ^ gmul(a3,0x0e) );\n    }\n}\n\nvoid aes_decrypt_block(const struct AESCtx* ctx, const uint8_t in[16], uint8_t out[16]){\n    uint8_t s[16];\n    memcpy(s, in, 16);\n\n    \/* initial AddRoundKey with last round key *\/\n    AddRoundKey(s, &amp;ctx-&gt;rk[4*ctx-&gt;Nr]);\n\n    for (int round = ctx-&gt;Nr - 1; round &gt;= 1; round--){\n        InvShiftRows(s);\n        InvSubBytes(s);\n        AddRoundKey(s, &amp;ctx-&gt;rk[4*round]);\n        InvMixColumns(s);\n    }\n    \/* final round without InvMixColumns *\/\n    InvShiftRows(s);\n    InvSubBytes(s);\n    AddRoundKey(s, &amp;ctx-&gt;rk[0]);\n\n    memcpy(out, s, 16);\n}\n\n\/* --------- Modes --------- *\/\n\nvoid aes_ecb_decrypt(const struct AESCtx* ctx, const uint8_t* in, uint8_t* out, size_t len){\n    \/* len must be multiple of 16 *\/\n    size_t blocks = len \/ 16;\n    for (size_t i=0;i&lt;blocks;i++){\n        aes_decrypt_block(ctx, in + 16*i, out + 16*i);\n    }\n}\n\nstatic void xor16(uint8_t* dst, const uint8_t* a, const uint8_t* b){\n    for (int i=0;i&lt;16;i++) dst[i] = (uint8_t)(a[i] ^ b[i]);\n}\n\nvoid aes_cbc_decrypt(const struct AESCtx* ctx, const uint8_t* in, uint8_t* out, size_t len, const uint8_t iv[16]){\n    \/* len must be multiple of 16 *\/\n    uint8_t prev[16];\n    memcpy(prev, iv, 16);\n    size_t blocks = len \/ 16;\n\n    for (size_t i=0;i&lt;blocks;i++){\n        uint8_t tmp[16];\n        aes_decrypt_block(ctx, in + 16*i, tmp);\n        xor16(out + 16*i, tmp, prev);\n        memcpy(prev, in + 16*i, 16);\n    }\n}\n\n\/* --------- Optional: PKCS#7 unpad --------- *\/\n\/* buf must hold entire plaintext; inout_len is updated to the unpadded length.\n   Returns 0 on success, -1 on bad padding. *\/\nint pkcs7_unpad(uint8_t* buf, size_t* inout_len){\n    if (*inout_len == 0) return -1;\n    uint8_t pad = buf[*inout_len - 1];\n    if (pad == 0 || pad &gt; 16) return -1;\n    if (*inout_len &lt; pad) return -1;\n    size_t start = *inout_len - pad;\n    for (size_t i=start; i&lt;*inout_len; i++){\n        if (buf[i] != pad) return -1;\n    }\n    *inout_len = start;\n    return 0;\n}\n\nint main(void) {\n    \/* \u4f60\u63d0\u4f9b\u7684 key \u548c iv *\/\n    const uint8_t key[16] = {\n        0x35, 0x38, 0x35, 0x35, 0x65, 0x61, 0x62, 0x35,\n        0x33, 0x61, 0x32, 0x32, 0x37, 0x35, 0x64, 0x33\n    };\n    const uint8_t iv[16]  = {\n        0x62, 0x30, 0x35, 0x31, 0x61, 0x35, 0x37, 0x64,\n        0x36, 0x64, 0x30, 0x35, 0x62, 0x33, 0x39, 0x33\n    };\n\n    \/* \u4f60\u63d0\u4f9b\u7684\u5bc6\u6587 (32 \u5b57\u8282) *\/\n    uint8_t ciphertext[32] = {\n        0x52,0x06,0xC4,0x9D,0x28,0x71,0x26,0x04,\n        0xBA,0x98,0x4D,0x20,0x03,0x81,0x39,0x39,\n        0x8C,0x6E,0x14,0x8C,0x7E,0xBF,0x44,0x5A,\n        0x67,0xF5,0x0A,0x7F,0x61,0x7F,0xCE,0x72\n    };\n    size_t clen = sizeof(ciphertext);\n\n    \/* \u8f93\u51fa\u7f13\u51b2\u533a *\/\n    uint8_t* plaintext = (uint8_t*)malloc(clen);\n    if (!plaintext) {\n        fprintf(stderr, &quot;malloc failed\\n&quot;);\n        return 1;\n    }\n\n    \/* \u521d\u59cb\u5316 AES \u4e0a\u4e0b\u6587\u5e76\u89e3\u5bc6 *\/\n    struct AESCtx ctx;\n    aes_init(&amp;ctx, key, AES128);\n    aes_cbc_decrypt(&amp;ctx, ciphertext, plaintext, clen, iv);\n\n    \/* \u53bb\u6389 PKCS#7 \u586b\u5145 *\/\n    size_t plen = clen;\n    if (pkcs7_unpad(plaintext, &amp;plen) != 0) {\n        fprintf(stderr, &quot;Warning: bad PKCS#7 padding, \u539f\u59cb\u957f\u5ea6\u4fdd\u6301 %zu\\n&quot;, plen);\n    }\n\n    \/* \u6253\u5370\u7ed3\u679c (\u5341\u516d\u8fdb\u5236 + ASCII) *\/\n    printf(&quot;Plaintext (hex): &quot;);\n    char *key_2 = &quot;what's this&quot;;\n    for (size_t i=0; i&lt;plen; i++) {\n        printf(&quot;%02X &quot;, plaintext[i] ^ key_2[i % strlen(key_2)]);\n    }\n    printf(&quot;\\n&quot;);\n\n    printf(&quot;Plaintext (char): &quot;);\n    for (size_t i=0; i&lt;plen; i++) {\n        printf(&quot;%c&quot;, plaintext[i] ^ key_2[i % strlen(key_2)]);\n    }\n    printf(&quot;\\n&quot;);\n\n    printf(&quot;Plaintext (ASCII): &quot;);\n    for (size_t i=0; i&lt;plen; i++) {\n        unsigned char c = plaintext[i];\n        if (c &gt;= 32 &amp;&amp; c &lt;= 126) {\n            putchar(c);\n        } else {\n            printf(&quot;\\\\x%02X&quot;, c);\n        }\n    }\n    printf(&quot;\\n&quot;);\n\n    free(plaintext);\n    return 0;\n}\n<\/code><\/pre>\n<h1>SM4<\/h1>\n<h2>\u53c2\u6570\u5206\u6790<\/h2>\n<ul>\n<li><strong>\u8f93\u5165<\/strong>\uff1a128\u4f4d\u5bc6\u6587\uff0816\u5b57\u8282\uff09\uff0c128\u4f4d\u5bc6\u94a5\uff0816\u5b57\u8282\uff09<\/li>\n<li><strong>\u8f93\u51fa<\/strong>\uff1a128\u4f4d\u660e\u6587\uff0816\u5b57\u8282\uff09<\/li>\n<li><strong>\u8f6e\u6570<\/strong>\uff1a32\u8f6e<\/li>\n<li><strong>\u7ed3\u6784<\/strong>\uff1a\u975e\u7ebf\u6027S\u76d2 + \u7ebf\u6027\u53d8\u6362\uff08\u6269\u6563\uff09+ \u8f6e\u5bc6\u94a5<\/li>\n<\/ul>\n<h2>\u4ee3\u7801\u5b9e\u73b0<\/h2>\n<pre><code class=\"language-cpp\">#include &lt;stdint.h&gt;\n#include &lt;string.h&gt;\n#include &lt;stdio.h&gt;\n\nstatic const uint8_t SBOX[256] = {\n    \/\/ \u6807\u51c6 S-Box \u8868\uff0c\u5171256\u5b57\u8282\n    0xD1, 0x90, 0xE9, 0xFE, 0xCC, 0xE1, 0x3D, 0xB7, 0x16, 0xB6, 0x14, 0xC2, 0x28, 0xFB, 0x2C, 0x05,\n    0x2B, 0x67, 0x9A, 0x76, 0x2A, 0xBE, 0x04, 0xC3, 0xAA, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99,\n    0x9C, 0x42, 0x50, 0xF4, 0x91, 0xEF, 0x98, 0x7A, 0x33, 0x54, 0x0B, 0x43, 0xED, 0xCF, 0xAC, 0x62,\n    0xE4, 0xB3, 0x17, 0xA9, 0x1C, 0x08, 0xE8, 0x95, 0x80, 0xDF, 0x94, 0xFA, 0x75, 0x8F, 0x3F, 0xA6,\n    0x47, 0x07, 0xA7, 0x4F, 0xF3, 0x73, 0x71, 0xBA, 0x83, 0x59, 0x3C, 0x19, 0xE6, 0x85, 0xD6, 0xA8,\n    0x68, 0x6B, 0x81, 0xB2, 0xFC, 0x64, 0xDA, 0x8B, 0xF8, 0xEB, 0x0F, 0x4B, 0x70, 0x56, 0x9D, 0x35,\n    0x1E, 0x24, 0x0E, 0x78, 0x63, 0x58, 0x9F, 0xA2, 0x25, 0x22, 0x7C, 0x3B, 0x01, 0x21, 0xC9, 0x87,\n    0xD4, 0x00, 0x46, 0x57, 0x5E, 0xD3, 0x27, 0x52, 0x4C, 0x36, 0x02, 0xE7, 0xA0, 0xC4, 0xC8, 0x9E,\n    0xEA, 0xBF, 0x8A, 0xD2, 0x40, 0xC7, 0x38, 0xB5, 0xA3, 0xF7, 0xF2, 0xCE, 0xF9, 0x61, 0x15, 0xA1,\n    0xE0, 0xAE, 0x5D, 0xA4, 0x9B, 0x34, 0x1A, 0x55, 0xAD, 0x93, 0x32, 0x30, 0xF5, 0x8C, 0xB1, 0xE3,\n    0x1D, 0xF6, 0xE2, 0x2E, 0x82, 0x66, 0xCA, 0x60, 0xC0, 0x29, 0x23, 0xAB, 0x0D, 0x53, 0x4E, 0x6F,\n    0xD5, 0xDB, 0x37, 0x45, 0xDE, 0xFD, 0x8E, 0x2F, 0x03, 0xFF, 0x6A, 0x72, 0x6D, 0x6C, 0x5B, 0x51,\n    0x8D, 0x1B, 0xAF, 0x92, 0xBB, 0xDD, 0xBC, 0x7F, 0x11, 0xD9, 0x5C, 0x41, 0x1F, 0x10, 0x5A, 0xD8,\n    0x0A, 0xC1, 0x31, 0x88, 0xA5, 0xCD, 0x7B, 0xBD, 0x2D, 0x74, 0xD0, 0x12, 0xB8, 0xE5, 0xB4, 0xB0,\n    0x89, 0x69, 0x97, 0x4A, 0x0C, 0x96, 0x77, 0x7E, 0x65, 0xB9, 0xF1, 0x09, 0xC5, 0x6E, 0xC6, 0x84,\n    0x18, 0xF0, 0x7D, 0xEC, 0x3A, 0xDC, 0x4D, 0x20, 0x79, 0xEE, 0x5F, 0x3E, 0xD7, 0xCB, 0x39, 0x48\n};\n\nstatic const uint32_t FK[4] = { 0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC };\nstatic const uint32_t CK[32] = {\n    0x00070E15, 0x1C232A31, 0x383F464D, 0x545B6269, 0x70777E85, 0x8C939AA1, 0xA8AFB6BD, 0xC4CBD2D9,\n    0xE0E7EEF5, 0xFC030A11, 0x181F262D, 0x343B4249, 0x50575E65, 0x6C737A81, 0x888F969D, 0xA4ABB2B9,\n    0xC0C7CED5, 0xDCE3EAF1, 0xF8FF060D, 0x141B2229, 0x30373E45, 0x4C535A61, 0x686F767D, 0x848B9299,\n    0xA0A7AEB5, 0xBCC3CAD1, 0xD8DFE6ED, 0xF4FB0209, 0x10171E25, 0x2C333A41, 0x484F565D, 0x646B7279\n};\n\n\/\/ \u5b57\u8282\u66ff\u4ee3 + \u7ebf\u6027\u53d8\u6362\nuint32_t sm4_t(uint32_t x)\n{\n    uint8_t a[4];\n    a[0] = SBOX[(x &gt;&gt; 24) &amp; 0xFF];\n    a[1] = SBOX[(x &gt;&gt; 16) &amp; 0xFF];\n    a[2] = SBOX[(x &gt;&gt; 8) &amp; 0xFF];\n    a[3] = SBOX[x &amp; 0xFF];\n    uint32_t t = (a[0] &lt;&lt; 24) | (a[1] &lt;&lt; 16) | (a[2] &lt;&lt; 8) | a[3];\n    return t ^ (t &lt;&lt; 2 | t &gt;&gt; 30) ^ (t &lt;&lt; 10 | t &gt;&gt; 22) ^ (t &lt;&lt; 18 | t &gt;&gt; 14) ^ (t &lt;&lt; 24 | t &gt;&gt; 8);\n}\n\n\/\/ \u7528\u4e8e\u5bc6\u94a5\u6269\u5c55\u7684T\u51fd\u6570\nuint32_t sm4_key_t(uint32_t x)\n{\n    uint8_t a[4];\n    a[0] = SBOX[(x &gt;&gt; 24) &amp; 0xFF];\n    a[1] = SBOX[(x &gt;&gt; 16) &amp; 0xFF];\n    a[2] = SBOX[(x &gt;&gt; 8) &amp; 0xFF];\n    a[3] = SBOX[x &amp; 0xFF];\n    uint32_t t = (a[0] &lt;&lt; 24) | (a[1] &lt;&lt; 16) | (a[2] &lt;&lt; 8) | a[3];\n    return t ^ (t &lt;&lt; 13 | t &gt;&gt; 19) ^ (t &lt;&lt; 23 | t &gt;&gt; 9);\n}\n\n\/\/ \u5bc6\u94a5\u6269\u5c55\uff0c\u751f\u621032\u8f6e\u5bc6\u94a5 rk[]\nvoid sm4_key_schedule(const uint8_t key[16], uint32_t rk[32])\n{\n    uint32_t K[36];\n    for (int i = 0; i &lt; 4; ++i)\n        K[i] = ((uint32_t)key[4*i] &lt;&lt; 24) | ((uint32_t)key[4*i+1] &lt;&lt; 16) | ((uint32_t)key[4*i+2] &lt;&lt; 8) | key[4*i+3];\n    for (int i = 0; i &lt; 4; ++i)\n        K[i] ^= FK[i];\n    for (int i = 0; i &lt; 32; ++i) {\n        K[i+4] = K[i] ^ sm4_key_t(K[i+1] ^ K[i+2] ^ K[i+3] ^ CK[i]);\n        rk[i] = K[i+4];\n    }\n}\n\n\/\/ \u89e3\u5bc6\u51fd\u6570\nvoid sm4_decrypt(const uint8_t input[16], const uint8_t key[16], uint8_t output[16])\n{\n    uint32_t rk[32], X[36];\n    sm4_key_schedule(key, rk);\n\n    \/\/ \u53cd\u8f6c\u8f6e\u5bc6\u94a5\u987a\u5e8f\n    for (int i = 0; i &lt; 16; ++i) {\n        uint32_t tmp = rk[i];\n        rk[i] = rk[31 - i];\n        rk[31 - i] = tmp;\n    }\n\n    \/\/ \u52a0\u8f7d\u660e\u6587\n    for (int i = 0; i &lt; 4; ++i)\n        X[i] = ((uint32_t)input[4*i] &lt;&lt; 24) | ((uint32_t)input[4*i+1] &lt;&lt; 16) | ((uint32_t)input[4*i+2] &lt;&lt; 8) | input[4*i+3];\n\n    \/\/ 32\u8f6e\u52a0\u5bc6\n    for (int i = 0; i &lt; 32; ++i)\n        X[i+4] = X[i] ^ sm4_t(X[i+1] ^ X[i+2] ^ X[i+3] ^ rk[i]);\n\n    \/\/ \u8f93\u51fa\uff08\u5012\u5e8f\uff09\n    for (int i = 0; i &lt; 4; ++i) {\n        output[4*i]   = (X[35 - i] &gt;&gt; 24) &amp; 0xFF;\n        output[4*i+1] = (X[35 - i] &gt;&gt; 16) &amp; 0xFF;\n        output[4*i+2] = (X[35 - i] &gt;&gt; 8) &amp; 0xFF;\n        output[4*i+3] = X[35 - i] &amp; 0xFF;\n    }\n}\n\nint main()\n{\n    uint8_t key[17] = &quot;NCTF24nctfNCTF24&quot;;\n\n    uint8_t cipher[32] = {\n      0xFB, 0x97, 0x3C, 0x3B, 0xF1, 0x99, 0x12, 0xDF, 0x13, 0x30, 0xF7, 0xD8, 0x7F, 0xEB, 0xA0, 0x6C,\n      0x14, 0x5B, 0xA6, 0x2A, 0xA8, 0x05, 0xA5, 0xF3, 0x76, 0xBE, 0xC9, 0x01, 0xF9, 0x36, 0x7B, 0x46\n    };\n\n    uint8_t plain[32];\n    sm4_decrypt(cipher, key, plain);\n    sm4_decrypt(cipher+16, key, plain+16);\n\n    printf(&quot;Decrypted: &quot;);\n    for (int i = 0; i &lt; 32; ++i)\n        printf(&quot;%c&quot;, plain[i]);\n    printf(&quot;\\n&quot;);\n\n    return 0;\n}\n<\/code><\/pre>\n<h1>BASE64\u7f16\u7801<\/h1>\n<p>Base64 \u662f\u4e00\u79cd <strong>\u628a\u4e8c\u8fdb\u5236\u6570\u636e\u5b89\u5168\u585e\u8fdb\u6587\u672c<\/strong> \u7684\u7f16\u7801\u65b9\u5f0f\uff0c\u89c4\u5219\u662f <strong>3\u5b57\u8282\u53d84\u5b57\u7b26\uff0c6\u4f4d\u4e00\u7ec4\u67e5\u8868\uff0c<code>=<\/code>\u8865\u9f50<\/strong>\u3002<\/p>\n<h2>\u4ee3\u7801\u5b9e\u73b0<\/h2>\n<pre><code class=\"language-cpp\">#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;string.h&gt;\n#include &lt;stdint.h&gt;\n\n\/\/ Base64\u5b57\u7b26\u8868\nstatic const char base64_chars[] =\n    &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;\n    &quot;abcdefghijklmnopqrstuvwxyz&quot;\n    &quot;0123456789+\/&quot;;\n\n\/\/ \u662f\u5426\u662f\u5408\u6cd5Base64\u5b57\u7b26\nstatic inline int is_base64(unsigned char c) {\n    return (c &gt;= 'A' &amp;&amp; c &lt;= 'Z') ||\n           (c &gt;= 'a' &amp;&amp; c &lt;= 'z') ||\n           (c &gt;= '0' &amp;&amp; c &lt;= '9') ||\n           (c == '+') || (c == '\/');\n}\n\n\/\/ Base64\u7f16\u7801\nchar *base64_encode(const unsigned char *data, size_t input_length, size_t *output_length) {\n    size_t i, j;\n    *output_length = 4 * ((input_length + 2) \/ 3);\n    char *encoded_data = (char *)malloc(*output_length + 1);\n    if (encoded_data == NULL) return NULL;\n\n    for (i = 0, j = 0; i &lt; input_length;) {\n        uint32_t octet_a = i &lt; input_length ? data[i++] : 0;\n        uint32_t octet_b = i &lt; input_length ? data[i++] : 0;\n        uint32_t octet_c = i &lt; input_length ? data[i++] : 0;\n\n        uint32_t triple = (octet_a &lt;&lt; 16) | (octet_b &lt;&lt; 8) | octet_c;\n\n        encoded_data[j++] = base64_chars[(triple &gt;&gt; 18) &amp; 0x3F];\n        encoded_data[j++] = base64_chars[(triple &gt;&gt; 12) &amp; 0x3F];\n        encoded_data[j++] = (i - 1 &gt; input_length + 1) ? '=' : base64_chars[(triple &gt;&gt; 6) &amp; 0x3F];\n        encoded_data[j++] = (i &gt; input_length) ? '=' : base64_chars[triple &amp; 0x3F];\n    }\n    encoded_data[*output_length] = '\\0';\n    return encoded_data;\n}\n\n\/\/ Base64\u89e3\u7801\nunsigned char *base64_decode(const char *data, size_t input_length, size_t *output_length) {\n    if (input_length % 4 != 0) return NULL;\n\n    size_t alloc_len = input_length \/ 4 * 3;\n    if (data[input_length - 1] == '=') alloc_len--;\n    if (data[input_length - 2] == '=') alloc_len--;\n\n    unsigned char *decoded_data = (unsigned char *)malloc(alloc_len);\n    if (decoded_data == NULL) return NULL;\n\n    int decoding_table[256];\n    memset(decoding_table, -1, 256 * sizeof(int));\n    for (int i = 0; i &lt; 64; i++) {\n        decoding_table[(unsigned char)base64_chars[i]] = i;\n    }\n\n    size_t i, j;\n    for (i = 0, j = 0; i &lt; input_length;) {\n        uint32_t sextet_a = data[i] == '=' ? 0 &amp; i++ : decoding_table[(unsigned char)data[i++]];\n        uint32_t sextet_b = data[i] == '=' ? 0 &amp; i++ : decoding_table[(unsigned char)data[i++]];\n        uint32_t sextet_c = data[i] == '=' ? 0 &amp; i++ : decoding_table[(unsigned char)data[i++]];\n        uint32_t sextet_d = data[i] == '=' ? 0 &amp; i++ : decoding_table[(unsigned char)data[i++]];\n\n        uint32_t triple = (sextet_a &lt;&lt; 18) + (sextet_b &lt;&lt; 12) + (sextet_c &lt;&lt; 6) + sextet_d;\n\n        if (j &lt; alloc_len) decoded_data[j++] = (triple &gt;&gt; 16) &amp; 0xFF;\n        if (j &lt; alloc_len) decoded_data[j++] = (triple &gt;&gt; 8) &amp; 0xFF;\n        if (j &lt; alloc_len) decoded_data[j++] = triple &amp; 0xFF;\n    }\n    *output_length = alloc_len;\n    return decoded_data;\n}\n\n\/\/ \u6d4b\u8bd5\nint main() {\n    const char *text = &quot;Hello RC6 AES Base64!&quot;;\n    printf(&quot;\u539f\u6587: %s\\n&quot;, text);\n\n    size_t enc_len;\n    char *encoded = base64_encode((const unsigned char *)text, strlen(text), &amp;enc_len);\n    printf(&quot;Base64\u7f16\u7801: %s\\n&quot;, encoded);\n\n    size_t dec_len;\n    unsigned char *decoded = base64_decode(encoded, enc_len, &amp;dec_len);\n    decoded[dec_len] = '\\0'; \/\/ \u786e\u4fdd\u5f53\u6210\u5b57\u7b26\u4e32\u53ef\u4ee5\u6253\u5370\n    printf(&quot;Base64\u89e3\u7801: %s\\n&quot;, decoded);\n\n    \/\/ \u91ca\u653e\u5185\u5b58\n    free(encoded);\n    free(decoded);\n    return 0;\n}\n\n<\/code><\/pre>\n<h1>\u7956\u51b2\u4e4b\u5e8f\u5217\u7b97\u6cd5<\/h1>\n<h1>\u54c8\u5e0c\u7b97\u6cd5<\/h1>\n<p><strong>Hash<\/strong>\uff0c\u4e00\u822c\u7ffb\u8bd1\u505a\u201c\u6563\u5217\u201d\uff0c\u4e5f\u6709\u76f4\u63a5\u97f3\u8bd1\u4e3a\u201c\u54c8\u5e0c\u201d\u7684\uff0c<strong>\u5c31\u662f\u628a\u4efb\u610f\u957f\u5ea6\u7684\u8f93\u5165\uff08\u53c8\u53eb\u505a\u9884\u6620\u5c04\uff0c pre-image\uff09\uff0c\u901a\u8fc7\u6563\u5217\u7b97\u6cd5\uff0c\u53d8\u6362\u6210\u56fa\u5b9a\u957f\u5ea6\u7684\u8f93\u51fa<\/strong><br \/>\n\u8be5\u8f93\u51fa\u5c31\u662f\u6563\u5217\u503c\u3002\u8fd9\u79cd\u8f6c\u6362\u662f\u4e00\u79cd\u538b\u7f29\u6620\u5c04\uff0c\u4e5f\u5c31\u662f\uff0c\u6563\u5217\u503c\u7684\u7a7a\u95f4\u901a\u5e38\u8fdc\u5c0f\u4e8e\u8f93\u5165\u7684\u7a7a\u95f4<br \/>\n<strong>\u4e0d\u540c\u7684\u8f93\u5165\u53ef\u80fd\u4f1a\u6563\u5217\u6210\u76f8\u540c\u7684\u8f93\u51fa<\/strong>\uff0c\u800c\u4e0d\u53ef\u80fd\u4ece\u6563\u5217\u503c\u6765\u552f\u4e00\u7684\u786e\u5b9a\u8f93\u5165\u503c\u3002<br \/>\n<strong>\u7b80\u5355\u7684\u8bf4\u5c31\u662f\u4e00\u79cd\u5c06\u4efb\u610f\u957f\u5ea6\u7684\u6d88\u606f\u538b\u7f29\u5230\u67d0\u4e00\u56fa\u5b9a\u957f\u5ea6\u7684\u6d88\u606f\u6458\u8981\u7684\u51fd\u6570\u3002<\/strong><\/p>\n<p>\u5e38\u89c1\u54c8\u5e0c\u7b97\u6cd5\u8f93\u51fa\u957f\u5ea6\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<th>\u7b97\u6cd5<\/th>\n<th>\u8f93\u51fa\u957f\u5ea6<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>MD5<\/td>\n<td>128 \u4f4d\uff0816\u5b57\u8282\uff09<\/td>\n<\/tr>\n<tr>\n<td>SHA-1<\/td>\n<td>160 \u4f4d\uff0820\u5b57\u8282\uff09<\/td>\n<\/tr>\n<tr>\n<td>SHA-256<\/td>\n<td>256 \u4f4d\uff0832\u5b57\u8282\uff09<\/td>\n<\/tr>\n<tr>\n<td>SHA-512<\/td>\n<td>512 \u4f4d\uff0864\u5b57\u8282\uff09<\/td>\n<\/tr>\n<tr>\n<td>SM3<\/td>\n<td>256 \u4f4d (32\u5b57\u8282)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>\u56fd\u5bc6SM3\u7b97\u6cd5<\/h2>\n<p>\u63a8\u8350\u535a\u5ba2: <a href=\"https:\/\/www.cnblogs.com\/11sgXL\/p\/17006282.html\">SM3\u7b97\u6cd5\u6d41\u7a0b &#8211; \u4e66\u4e66\u4e66\u4e66\u541b &#8211; \u535a\u5ba2\u56ed<\/a><\/p>\n<p>SM3 \u5bc6\u7801\u6742\u51d1\u7b97\u6cd5\u7684\u8f93\u5165\u4e3a\u957f\u5ea6\u4e3aI\uff08l\uff5e2\uff09\u6bd4\u7279\u7684\u6d88\u606fm\uff0c\u7ecf\u8fc7\u586b\u5145\u3001\u8fed\u4ee3\u538b\u7f29\uff0c\u751f\u6210\u6742\u51d1\u503c\uff0c\u6742<br \/>\n\u51d1\u503c\u8f93\u51fa\u957f\u5ea6\u4e3a 256 \u6bd4\u7279\u3002<\/p>\n<p>\u5927\u81f4\u6d41\u7a0b:<\/p>\n<ol>\n<li>\u6570\u636e\u586b\u5145<\/li>\n<li>\u6570\u636e\u5206\u7ec4<\/li>\n<li>CF\u51fd\u6570 (\u6d88\u606f\u6269\u6563, \u6d88\u606f\u538b\u7f29)<\/li>\n<li>\u8f93\u51fa\u6742\u51d1\u503c<\/li>\n<\/ol>\n<h3>\u6d88\u606f\u586b\u5145<\/h3>\n<p>\u5047\u8bbe\u6d88\u606f m \u7684\u957f\u5ea6\u4e3al\u6bd4\u7279,\u5219\u9996\u5148\u5c06\u6bd4\u7279\u201c1\u201d\u6dfb\u52a0\u5230\u6d88\u606f\u7684\u672b\u5c3e,\u518d\u6dfb\u52a0 k \u4e2a\u201c0\u201d, k \u662f\u6ee1\u8db3 l+1+k\u2261448(mod512) \u7684\u6700\u5c0f\u7684\u975e\u8d1f\u6574\u6570\u3002\u7136\u540e\u518d\u6dfb\u52a0\u4e00\u4e2a64\u4f4d\u6bd4\u7279\u4e32,\u8be5\u6bd4\u7279\u4e32\u662f\u957f\u5ea6 l \u7684\u4e8c\u8fdb\u5236\u8868\u793a\u3002\u586b\u5145\u540e\u7684\u6d88\u606f m \u7684\u6bd4\u7279\u957f\u5ea6\u4e3a512\u7684\u500d\u6570\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251211115949.png\" alt=\"image.png|600\"><\/p>\n<h3>\u6570\u636e\u5206\u7ec4<\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/cloud-map-bed-1351541725.cos.ap-nanjing.myqcloud.com\/pic\/20251211120510.png\" alt=\"image.png|700\"><\/p>\n<h3>\u51fd\u6570CF<\/h3>\n<ol>\n<li>\u6d88\u606f\u6269\u6563<\/li>\n<li>\u6d88\u606f\u538b\u7f29<\/li>\n<li>\u8f93\u51fa\u6700\u540e\u7684\u6742\u51d1\u503c<\/li>\n<\/ol>\n<p>\u53c2\u8003\u94fe\u63a5\uff1a<br \/>\nhttps:\/\/ctf-wiki.org\/reverse\/identify-encode-encryption\/introduction\/#base64<br \/>\nhttps:\/\/blog.csdn.net\/Pioo_\/article\/details\/110878905<br \/>\nhttps:\/\/www.cnblogs.com\/zpchcbd\/p\/15974293.html<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u788e\u788e\u5ff5 \u6700\u8fd1\u8d8a\u53d1\u89c9\u5f97\u5bf9\u5e38\u7528\u52a0\u5bc6\u7b97\u6cd5\u7684\u7814\u7a76\u6bd4\u8f83\u7c97\u7cd9,\u501f\u7740\u5b8c\u5584\u793e\u56e2\u6587\u6863\u7684\u673a\u4f1a,\u518d\u7ee7\u7eed\u4fee\u6539\u4e00\u4e0b\u6211\u7684\u6587\u7ae0. \u4e00\u4e9b\u524d\u7f6e\u5c0f [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-50","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/posts\/50","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/comments?post=50"}],"version-history":[{"count":1,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/posts\/50\/revisions"}],"predecessor-version":[{"id":51,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/posts\/50\/revisions\/51"}],"wp:attachment":[{"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/media?parent=50"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/categories?post=50"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.seekinthevortex.cn\/index.php\/wp-json\/wp\/v2\/tags?post=50"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}