{"id":147,"date":"2026-03-20T16:59:14","date_gmt":"2026-03-20T08:59:14","guid":{"rendered":"https:\/\/www.sherlock666.cn\/?p=147"},"modified":"2026-03-20T16:59:47","modified_gmt":"2026-03-20T08:59:47","slug":"%e9%80%86%e5%90%91%e4%b8%ad%e6%9b%be%e4%b8%8e%e4%bd%a0%e6%93%a6%e8%82%a9%e8%80%8c%e8%bf%87%e7%9a%84%e9%82%a3%e4%ba%9b%e5%8a%a0%e5%af%86-%e7%bc%96%e7%a0%81-%e5%93%88%e5%b8%8c-kdf-%e7%ba%a6","status":"publish","type":"post","link":"https:\/\/www.sherlock666.cn\/index.php\/2026\/03\/20\/%e9%80%86%e5%90%91%e4%b8%ad%e6%9b%be%e4%b8%8e%e4%bd%a0%e6%93%a6%e8%82%a9%e8%80%8c%e8%bf%87%e7%9a%84%e9%82%a3%e4%ba%9b%e5%8a%a0%e5%af%86-%e7%bc%96%e7%a0%81-%e5%93%88%e5%b8%8c-kdf-%e7%ba%a6\/","title":{"rendered":"\u9006\u5411\u4e2d\u66fe\u4e0e\u4f60\u64e6\u80a9\u800c\u8fc7\u7684\u90a3\u4e9b\u52a0\u5bc6\u8be6\u89e3"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">\u4e00\u3001\u54ea\u4e9b\u662f\u201c\u771f\u52a0\u5bc6\u201d\uff0c\u54ea\u4e9b\u4e0d\u662f<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">1\u3001\u771f\u6b63\u7684\u5bc6\u7801\u7b97\u6cd5<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u79f0\u5206\u7ec4\u5bc6\u7801\uff1aAES\u3001DES\u3001TEA\/XTEA\/XXTEA\u3001SM4\u7b49<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u6d41\u5bc6\u7801\uff1aRC4\u7b49<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u975e\u5bf9\u79f0\u5bc6\u7801\uff1aRSA<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u54c8\u5e0c \/ MAC \/ KDF\uff1aMD5\u3001SHA-1\u3001SHA-2\u3001SHA-3<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2\u3001\u54ea\u4e9b\u662f\u201c\u771f\u52a0\u5bc6\u201d\uff0c\u54ea\u4e9b\u4e0d\u662f<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7f16\u7801\uff1aBase16\/32\/58\/62\/64\/85\u3001URL Encode\u3001UUEncode<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7b80\u5355\u4f4d\u8fd0\u7b97\u6df7\u6dc6\uff1aXOR\u3001ADD\/SUB\u3001ROL\/ROR\u3001\u5b57\u8282\u4ea4\u6362\u3001\u4f4d\u91cd\u6392\u3001\u67e5\u8868\u66ff\u6362<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u538b\u7f29\uff1azlib\u3001gzip<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7ea6\u675f \/ \u9a8c\u8bc1\uff1a\u8ff7\u5bab\u3001\u77e9\u9635\u3001\u7ebf\u6027\u65b9\u7a0b\u7ec4\u3001Z3<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u865a\u62df\u673a\u58f3 \/ \u81ea\u5b9a\u4e49\u5b57\u8282\u7801\uff1aVM\u3001\u89e3\u91ca\u5668\u3001\u8c03\u5ea6\u5668<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3\u3001\u8ff7\u5bab\u3001Z3 \u7684\u5b9a\u4f4d<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u8ff7\u5bab<\/strong>\uff1a\u672c\u8d28\u662f\u8def\u5f84\u7ea6\u675f \/ \u72b6\u6001\u8f6c\u79fb \/ \u56fe\u641c\u7d22<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Z3<\/strong>\uff1a\u672c\u8d28\u662f SMT \u6c42\u89e3\u5668\uff0c\u4e0d\u662f\u52a0\u5bc6\u7b97\u6cd5\uff0c\u800c\u662f\u62ff\u6765\u89e3\u201c\u9a8c\u8bc1\u5173\u7cfb\u201d<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Z3 \u5b98\u65b9\u6587\u6863\u628a\u5b83\u5b9a\u4e49\u4e3a\u5b9a\u7406\u8bc1\u660e\u5668 \/ SMT \u6c42\u89e3\u5668\uff0c\u7528\u6765\u5224\u65ad\u903b\u8f91\u516c\u5f0f\u5728\u67d0\u4e9b\u7406\u8bba\u4e0b\u662f\u5426\u53ef\u6ee1\u8db3\u3002\u9006\u5411\u91cc\u5b83\u6700\u5e38\u89c1\u7684\u7528\u9014\u662f\uff1a\u628a\u6821\u9a8c\u903b\u8f91\u7ffb\u6210 bit-vector \u7ea6\u675f\u540e\u76f4\u63a5\u6c42\u89e3<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u4e8c\u3001\u9006\u5411\u8bc6\u522b\u603b\u65b9\u6cd5\uff1a\u5148\u770b\u8fd9 10 \u4ef6\u4e8b<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">2.1 \u770b\u8f93\u5165\u8f93\u51fa\u957f\u5ea6\u5173\u7cfb<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u662f\u6700\u5feb\u7684\u7b2c\u4e00\u5224\u65ad\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u957f\u5ea6\u53d8\u6210 2 \u500d\uff1a\u50cf hex \/ Base16<\/li>\n\n\n\n<li>3 \u5b57\u8282\u53d8 4 \u5b57\u7b26\uff1a\u50cf Base64<\/li>\n\n\n\n<li>4 \u5b57\u8282\u53d8 5 \u5b57\u7b26\uff1a\u50cf Base85<\/li>\n\n\n\n<li>\u8f93\u51fa\u957f\u5ea6\u4e0e\u8f93\u5165\u76f8\u540c\uff1a\u50cf XOR\u3001\u6d41\u5bc6\u7801\u3001\u5206\u7ec4\u5bc6\u7801\u67d0\u4e9b\u6a21\u5f0f<\/li>\n\n\n\n<li>\u56fa\u5b9a\u8f93\u51fa 16\/20\/32\/64 \u5b57\u8282\uff1a\u50cf MD5 \/ SHA1 \/ SHA256 \/ SHA512<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2.2 \u770b\u5b57\u7b26\u96c6<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>0-9A-Fa-f<\/code>\uff1ahex<\/li>\n\n\n\n<li><code>A-Z2-7=<\/code>\uff1aBase32<\/li>\n\n\n\n<li><code>A-Za-z0-9+\/=<\/code>\uff1aBase64<\/li>\n\n\n\n<li><code>A-Za-z0-9-_=<\/code>\uff1aURL-safe Base64<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2.3 \u770b\u201c\u5757\u5927\u5c0f\u201d<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>8 \u5b57\u8282\u5757\uff1aDES \/TEA \u5bb6\u65cf\u5e38\u89c1<\/li>\n\n\n\n<li>16 \u5b57\u8282\u5757\uff1aAES \/ SM4  \u5e38\u89c1<\/li>\n\n\n\n<li>\u4e0d\u5206\u5757\u3001\u9010\u5b57\u8282\/\u9010\u5b57\u8f93\u51fa\uff1a\u6d41\u5bc6\u7801\u6216\u7f16\u7801<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2.4 \u770b\u5faa\u73af\u8f6e\u6570<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f88\u591a\u7b97\u6cd5\u6709\u975e\u5e38\u9c9c\u660e\u7684\u8f6e\u6570\u5473\u9053\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AES\uff1a10 \/ 12 \/ 14 \u8f6e<\/li>\n\n\n\n<li>DES\uff1a16 \u8f6e<\/li>\n\n\n\n<li>TEA\uff1a\u5e38\u89c1 32 cycles\uff08\u5f88\u591a\u5b9e\u73b0\u5199\u6210 32 \u6b21\u5faa\u73af\uff09<\/li>\n\n\n\n<li>SM4\uff1a32 \u8f6e<\/li>\n\n\n\n<li>SHA-1\uff1a80 \u6b65<\/li>\n\n\n\n<li>SHA-256\uff1a64 \u6b65<\/li>\n\n\n\n<li>MD5\uff1a64 \u6b65<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2.5 \u770b\u5e38\u91cf<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5e38\u91cf\u662f\u9006\u5411\u8bc6\u522b\u6700\u503c\u94b1\u7684\u4e1c\u897f\u3002<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Base]\nBase64 table: A-Z a-z 0-9 + \/\nBase64 URL-safe: A-Z a-z 0-9 - _\nBase32: A-Z 2-7\nBase58: \u65e0 0 O I l\n\n&#91;TEA]\ndelta = 0x9E3779B9\nsum(dec start) = 0xC6EF3720\n\u5e38\u89c1\u64cd\u4f5c: &lt;&lt;4, &gt;&gt;5, +, ^\n\n&#91;XTEA]\nk&#91;sum &amp; 3]\nk&#91;(sum &gt;&gt; 11) &amp; 3]\n\n&#91;RC4]\nS&#91;256]\nfor i in 0..255 S&#91;i]=i\nKSA\/PRGA + swap\n\n&#91;AES]\nS-box \u5f00\u5934: 63 7C 77 7B F2 6B 6F C5\nRcon: 01 02 04 08 10 20 40 80 1B 36\nAES-NI: aesenc\/aesdec\/aeskeygenassist\n\n&#91;DES]\n8-byte block\n16 rounds\n\u5927\u91cf\u7f6e\u6362\u8868 + 8 \u4e2a S-box\n\n&#91;ChaCha20]\n61707865 3320646e 79622d32 6b206574\nrotation: 16,12,8,7\n\n&#91;Salsa20]\n\u7c7b\u4f3c 16-word ARX\nrotation: 7,9,13,18\n\n&#91;MD5]\nIV:\n67452301 EFCDAB89 98BADCFE 10325476\n\n&#91;SHA1]\nIV:\n67452301 EFCDAB89 98BADCFE 10325476 C3D2E1F0\nK:\n5A827999 6ED9EBA1 8F1BBCDC CA62C1D6\n\n&#91;SHA256]\nIV:\n6A09E667 BB67AE85 3C6EF372 A54FF53A\n510E527F 9B05688C 1F83D9AB 5BE0CD19\n\n&#91;SM3]\nIV:\n7380166F 4914B2B9 172442D7 DA8A0600\nA96F30BC 163138AA E38DEE4D B0FB0E4E\nTj:\n79CC4519 \/ 7A879D8A\n\n&#91;HMAC]\nipad = 0x36\nopad = 0x5C\n\n&#91;RSA]\ne = 65537<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2.6 \u770b\u6570\u636e\u7ed3\u6784\u5c3a\u5bf8<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u4e9b\u7b97\u6cd5\u7684\u5185\u90e8\u72b6\u6001\u5f88\u6709\u8fa8\u8bc6\u5ea6\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RC4\uff1a<code>S[256]<\/code><\/li>\n\n\n\n<li>AES\uff1a16-byte state\uff0c\u6216 256 \u9879 S-box \/ 4 \u5f20 T-table<\/li>\n\n\n\n<li>SHA-256\uff1a8 \u4e2a 32-bit state + 64 \u4e2a round constant<\/li>\n\n\n\n<li>SHA-3\/Keccak\uff1a5\u00d75 lane \u72b6\u6001<\/li>\n\n\n\n<li>RSA\/ECC\uff1a\u5927\u91cf\u5927\u6574\u6570 limb \u8fd0\u7b97<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2.7 \u770b\u64cd\u4f5c\u5f62\u72b6<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5927\u91cf <code>xor + rol\/ror + add<\/code>\uff1aARX \u5bb6\u65cf\uff0c\u5e38\u89c1\u4e8e TEA \/ XTEA <\/li>\n\n\n\n<li>\u5927\u91cf\u67e5\u8868\uff1aAES S-box\u3001DES S-box\u3001RC4 S \u6570\u7ec4\u3001Base \u8868<\/li>\n\n\n\n<li>\u5927\u91cf\u4f4d\u7f6e\u6362 \/ \u63a9\u7801\uff1aDES\u3001bitslice AES\u3001CRC\u3001\u54c8\u5e0c<\/li>\n\n\n\n<li>\u5927\u6574\u6570\u4e58\u6a21 \/ \u5e73\u65b9\u6a21\uff1aRSA<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2.8 \u770b\u6a21\u5f0f\u548c padding<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f88\u591a\u9898\u4e0d\u662f\u201c\u7b97\u6cd5\u672c\u4f53\u201d\uff0c\u800c\u662f\u201c\u7b97\u6cd5 + \u6a21\u5f0f + padding\u201d\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ECB\uff1a\u91cd\u590d\u5757\u660e\u6587\u4f1a\u51fa\u73b0\u91cd\u590d\u5bc6\u6587\u5757<\/li>\n\n\n\n<li>CBC\uff1a\u6bcf\u5757\u5148 xor \u524d\u4e00\u5bc6\u6587\u5757 \/ IV<\/li>\n\n\n\n<li>CTR\uff1a\u65e0 padding\uff0c\u8ba1\u6570\u5668\u9012\u589e<\/li>\n\n\n\n<li>GCM\uff1aCTR + GHASH<\/li>\n\n\n\n<li>PKCS#7\uff1a\u5c3e\u90e8 <code>01\/02\/03...<\/code><\/li>\n\n\n\n<li>Zero padding\uff1a\u672b\u5c3e\u5168 0<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2.9 \u770b\u786c\u4ef6\u6307\u4ee4 \/ API<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>x86 <code>aesenc\/aesdec\/aeskeygenassist<\/code>\uff1aAES-NI<\/li>\n\n\n\n<li>x86 <code>pclmulqdq<\/code>\uff1aGHASH \/ GCM \u5f88\u5e38\u89c1<\/li>\n\n\n\n<li>x86 SHA \u6269\u5c55\uff1aSHA-1 \/ SHA-256<\/li>\n\n\n\n<li>ARM <code>AESE\/AESMC\/AESD\/AESIMC<\/code>\uff1aARM Crypto Extension<\/li>\n\n\n\n<li>CUDA \/ OpenCL \/ HIP\uff1aGPU \u5e76\u884c\u6838<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Intel \u5b98\u65b9\u6587\u6863\u8bf4\u660e AES-NI \u5305\u542b 6 \u6761\u6838\u5fc3\u6307\u4ee4\uff1bIntel SHA Extensions \u4e3a SHA-1 \u548c SHA-256 \u63d0\u4f9b 7 \u6761 SSE \u6307\u4ee4\uff1bARM A64 \u52a0\u5bc6\u6307\u4ee4\u8fd0\u884c\u5728 128-bit Advanced SIMD \u5bc4\u5b58\u5668\u4e0a\uff1bCUDA\/PTX\/OpenCL\/ROCm \u5b98\u65b9\u6587\u6863\u90fd\u628a GPU\/\u5f02\u6784\u8bbe\u5907\u66b4\u9732\u6210\u6570\u636e\u5e76\u884c\u6a21\u578b\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u4e09\u3001\u6240\u6709\u5e38\u89c1\u52a0\u89e3\u5bc6\u65b9\u6cd5\u4ee3\u7801\u8be6\u89e3<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">base64\uff08\u4efb\u610f\u5f62\u5f0f\u6539\u53d8\u89e3\u5bc6\uff09<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>import base64\n# \u81ea\u5b9a\u4e49Base64\u5b57\u7b26\u8868\ncustom_table='6789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345'\n#\u539f\u7f16\u7801\nstd_table ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/'\n# \u5bc6\u6587\nencoded_str = '1231231231'\n\n# \u5b57\u7b26\u6620\u5c04\u548c\u586b\u5145\ntranslation = str.maketrans(custom_table, std_table)\ntranslated_str = encoded_str.translate(translation)\npad_len = (-len(translated_str)) % 4\npadded_str = translated_str + '=' * pad_len\ntry:\n    data = base64.b64decode(padded_str)\n    print(\"\u89e3\u7801\u540e\u7684\u5341\u516d\u8fdb\u5236:\", data.hex())\n    \n    # \u5c1d\u8bd5UTF-8\u89e3\u7801\n    \n    flag = data.decode('utf-8')\n    print(\"UTF-8\u89e3\u7801\u6210\u529f:\", flag)\n\nexcept Exception as e:\n    print(\"\u89e3\u7801\u5931\u8d25:\", e)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">TEA\u5bb6\u65cf\u52a0\u89e3\u5bc6<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">TEA<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>DELTA = 0x9E3779B9\nMASK = 0xFFFFFFFF\n\n\ndef tea_encrypt(v, k):\n    v0, v1 = v\n    sum_ = 0\n    for _ in range(32):\n        sum_ = (sum_ + DELTA) &amp; MASK\n        v0 = (v0 + (((v1 &lt;&lt; 4) + k&#91;0]) ^ (v1 + sum_) ^ ((v1 &gt;&gt; 5) + k&#91;1]))) &amp; MASK\n        v1 = (v1 + (((v0 &lt;&lt; 4) + k&#91;2]) ^ (v0 + sum_) ^ ((v0 &gt;&gt; 5) + k&#91;3]))) &amp; MASK\n    return v0, v1\n\n\ndef tea_decrypt(v, k):\n    v0, v1 = v\n    sum_ = (DELTA * 32) &amp; MASK\n    for _ in range(32):\n        v1 = (v1 - (((v0 &lt;&lt; 4) + k&#91;2]) ^ (v0 + sum_) ^ ((v0 &gt;&gt; 5) + k&#91;3]))) &amp; MASK\n        v0 = (v0 - (((v1 &lt;&lt; 4) + k&#91;0]) ^ (v1 + sum_) ^ ((v1 &gt;&gt; 5) + k&#91;1]))) &amp; MASK\n        sum_ = (sum_ - DELTA) &amp; MASK\n    return v0, v1\n\n\nif __name__ == \"__main__\":\n    # \u4e00\u7ec4\u6570\u636e\u5757\uff1a2 \u4e2a 32 \u4f4d\u6574\u6570\n    v = (0x12345678, 0x9ABCDEF0)\n\n    # 128-bit key\uff1a4 \u4e2a 32 \u4f4d\u6574\u6570\n    k = (0x11111111, 0x22222222, 0x33333333, 0x44444444)\n\n    enc = tea_encrypt(v, k)\n    dec = tea_decrypt(enc, k)\n\n    print(\"\u539f\u6587: \", &#91;hex(x) for x in v])\n    print(\"\u52a0\u5bc6: \", &#91;hex(x) for x in enc])\n    print(\"\u89e3\u5bc6: \", &#91;hex(x) for x in dec])<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">XTEA<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>MASK = 0xffffffff\nu32 = lambda x: x &amp; MASK\n\ndef encipher(num_rounds, v, key):\n    v0, v1 = u32(v&#91;0]), u32(v&#91;1])\n    delta = 0x9E3779B9\n    sum_ = u32(0)\n    for _ in range(num_rounds):\n        t1 = u32(((v1 &lt;&lt; 4) ^ (v1 &gt;&gt; 5)) + v1)\n        k1 = u32(sum_ + key&#91;sum_ &amp; 3])\n        v0 = u32(v0 + (t1 ^ k1))\n\n        sum_ = u32(sum_ + delta)\n\n        t2 = u32(((v0 &lt;&lt; 4) ^ (v0 &gt;&gt; 5)) + v0)\n        k2 = u32(sum_ + key&#91;(sum_ &gt;&gt; 11) &amp; 3])\n        v1 = u32(v1 + (t2 ^ k2))\n\n    v&#91;0], v&#91;1] = v0, v1\n\ndef decipher(num_rounds, v, key):\n    v0, v1 = u32(v&#91;0]), u32(v&#91;1])\n    delta = 0x9E3779B9\n    sum_ = u32(delta * num_rounds)\n    for _ in range(num_rounds):\n        t2 = u32(((v0 &lt;&lt; 4) ^ (v0 &gt;&gt; 5)) + v0)\n        k2 = u32(sum_ + key&#91;(sum_ &gt;&gt; 11) &amp; 3])\n        v1 = u32(v1 - (t2 ^ k2))\n\n        sum_ = u32(sum_ - delta)\n\n        t1 = u32(((v1 &lt;&lt; 4) ^ (v1 &gt;&gt; 5)) + v1)\n        k1 = u32(sum_ + key&#91;sum_ &amp; 3])\n        v0 = u32(v0 - (t1 ^ k1))\n\n    v&#91;0], v&#91;1] = v0, v1\n\nif __name__ == \"__main__\":\n    v = &#91;1, 2]\n    k = &#91;2, 2, 3, 4]\n    r = 32\n\n    print(\"\u52a0\u5bc6\u524d\u539f\u59cb\u6570\u636e\uff1a{} {}\".format(v&#91;0], v&#91;1]))\n    encipher(r, v, k)\n    print(\"\u52a0\u5bc6\u540e\u7684\u6570\u636e\uff1a{} {}\".format(v&#91;0], v&#91;1]))\n    decipher(r, v, k)\n    print(\"\u89e3\u5bc6\u540e\u7684\u6570\u636e\uff1a{} {}\".format(v&#91;0], v&#91;1]))<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">XXTEA<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>def shift(z, y, x, k, p, e):\n    return ((((z &gt;&gt; 5) ^ (y &lt;&lt; 2)) + ((y &gt;&gt; 3) ^ (z &lt;&lt; 4))) ^ ((x ^ y) + (k&#91;(p &amp; 3) ^ e] ^ z)))\ndef encrypt(v, k):\n    delta = 0x9E3779B9\n    n = len(v)\n    rounds = 6 + 52 \/ n\n    x = 0\n    z = v&#91;n - 1]\n    for i in range(rounds):\n        x = (x + delta) &amp; 0xFFFFFFFF\n        e = (x &gt;&gt; 2) &amp; 3\n        for p in range(n - 1):\n            y = v&#91;p + 1]\n            v&#91;p] = (v&#91;p] + shift(z, y, x, k, p, e)) &amp; 0xFFFFFFFF\n            z = v&#91;p]\n        p += 1\n        y = v&#91;0]\n        v&#91;n - 1] = (v&#91;n - 1] + shift(z, y, x, k, p, e)) &amp; 0xFFFFFFFF\n        z = v&#91;n - 1]\n    return v\ndef decrypt(v, k):\n    delta = 0x9E3779B9\n    n = len(v)\n    rounds = 6 + 52 \/ n\n    x = (rounds * delta) &amp; 0xFFFFFFFF\n    y = v&#91;0]\n    for i in range(rounds):\n        e = (x &gt;&gt; 2) &amp; 3\n        for p in range(n - 1, 0, -1):\n            z = v&#91;p - 1]\n            v&#91;p] = (v&#91;p] - shift(z, y, x, k, p, e)) &amp; 0xFFFFFFFF\n            y = v&#91;p]\n        p -= 1\n        z = v&#91;n - 1]\n        v&#91;0] = (v&#91;0] - shift(z, y, x, k, p, e)) &amp; 0xFFFFFFFF\n        y = v&#91;0]\n        x = (x - delta) &amp; 0xFFFFFFFF\n    return v\nif __name__ == '__main__':\n    plain = &#91;1, 2]\n    key = &#91;2, 2, 3, 4]\n    encrypted = encrypt(plain, key)\n    print(encrypted)\n    decrypted = decrypt(encrypted, key)\n    print(decrypted)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">SM4<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># \u6700\u7b80\u5355 SM4 ECB \u677f\u5b50\n# \u9002\u5408 CTF \u91cc\u76f4\u63a5\u89e3\u4e00\u5757\/\u591a\u5757\u6570\u636e\n\nSBOX = &#91;\n    0xD6,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,0x1C,0xA9,0xC9,0x08,0xE8,0x95,0x80,0xDF,0x94,0xFA,0x75,0x8F,0x3F,0xA6,\n    0x47,0x07,0xA7,0xFC,0xF3,0x73,0x17,0xBA,0x83,0x59,0x3C,0x19,0xE6,0x85,0x4F,0xA8,\n    0x68,0x6B,0x81,0xB2,0x71,0x64,0xDA,0x8B,0xF8,0xEB,0x0F,0x4B,0x70,0x56,0x9D,0x35,\n    0x1E,0x24,0x0E,0x5E,0x63,0x58,0xD1,0xA2,0x25,0x22,0x7C,0x3B,0x01,0x21,0x78,0x87,\n    0xD4,0x00,0x46,0x57,0x9F,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\nFK = &#91;0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC]\n\nCK = &#91;\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\nMASK = 0xFFFFFFFF\n\n\ndef rol32(x, n):\n    \"\"\"32 \u4f4d\u5faa\u73af\u5de6\u79fb\"\"\"\n    x &amp;= MASK\n    return ((x &lt;&lt; n) &amp; MASK) | (x &gt;&gt; (32 - n))\n\n\ndef tau(x):\n    \"\"\"\u975e\u7ebf\u6027\u53d8\u6362\uff1a4 \u4e2a\u5b57\u8282\u5206\u522b\u8fc7 SBOX\"\"\"\n    return (\n        (SBOX&#91;(x &gt;&gt; 24) &amp; 0xFF] &lt;&lt; 24) |\n        (SBOX&#91;(x &gt;&gt; 16) &amp; 0xFF] &lt;&lt; 16) |\n        (SBOX&#91;(x &gt;&gt;  8) &amp; 0xFF] &lt;&lt;  8) |\n        SBOX&#91;x &amp; 0xFF]\n    )\n\n\ndef L(x):\n    \"\"\"\u52a0\u89e3\u5bc6\u8f6e\u51fd\u6570\u91cc\u7684\u7ebf\u6027\u53d8\u6362\"\"\"\n    return x ^ rol32(x, 2) ^ rol32(x, 10) ^ rol32(x, 18) ^ rol32(x, 24)\n\n\ndef L_key(x):\n    \"\"\"\u5bc6\u94a5\u6269\u5c55\u91cc\u7684\u7ebf\u6027\u53d8\u6362\"\"\"\n    return x ^ rol32(x, 13) ^ rol32(x, 23)\n\n\ndef T(x):\n    \"\"\"\u8f6e\u51fd\u6570 T = L(tau(x))\"\"\"\n    return L(tau(x))\n\n\ndef T_key(x):\n    \"\"\"\u5bc6\u94a5\u6269\u5c55 T' = L'(tau(x))\"\"\"\n    return L_key(tau(x))\n\n\ndef bytes_to_words(b):\n    \"\"\"16 \u5b57\u8282 -&gt; 4 \u4e2a\u5927\u7aef 32 \u4f4d\u6574\u6570\"\"\"\n    return &#91;int.from_bytes(b&#91;i:i+4], \"big\") for i in range(0, 16, 4)]\n\n\ndef words_to_bytes(words):\n    \"\"\"4 \u4e2a 32 \u4f4d\u6574\u6570 -&gt; 16 \u5b57\u8282\"\"\"\n    return b\"\".join((x &amp; MASK).to_bytes(4, \"big\") for x in words)\n\n\ndef expand_key(key16):\n    \"\"\"\u751f\u6210 32 \u4e2a\u8f6e\u5bc6\u94a5\"\"\"\n    if len(key16) != 16:\n        raise ValueError(\"key \u957f\u5ea6\u5fc5\u987b\u662f 16 \u5b57\u8282\")\n\n    mk = bytes_to_words(key16)\n    K = &#91;0] * 36\n\n    for i in range(4):\n        K&#91;i] = mk&#91;i] ^ FK&#91;i]\n\n    rk = &#91;]\n    for i in range(32):\n        K&#91;i + 4] = K&#91;i] ^ T_key(K&#91;i + 1] ^ K&#91;i + 2] ^ K&#91;i + 3] ^ CK&#91;i])\n        rk.append(K&#91;i + 4] &amp; MASK)\n\n    return rk\n\n\ndef sm4_block(block16, rk, decrypt=False):\n    \"\"\"SM4 \u5355\u5757\u5904\u7406\uff1a\u8f93\u5165\u5fc5\u987b\u662f 16 \u5b57\u8282\"\"\"\n    if len(block16) != 16:\n        raise ValueError(\"\u5355\u5757\u957f\u5ea6\u5fc5\u987b\u662f 16 \u5b57\u8282\")\n\n    X = bytes_to_words(block16) + &#91;0] * 32\n\n    # \u89e3\u5bc6\u5c31\u662f\u8f6e\u5bc6\u94a5\u5012\u5e8f\n    round_keys = rk&#91;::-1] if decrypt else rk\n\n    for i in range(32):\n        X&#91;i + 4] = X&#91;i] ^ T(X&#91;i + 1] ^ X&#91;i + 2] ^ X&#91;i + 3] ^ round_keys&#91;i])\n\n    return words_to_bytes(&#91;X&#91;35], X&#91;34], X&#91;33], X&#91;32]])\n\n\ndef sm4_ecb(data, key16, decrypt=False):\n    \"\"\"\n    SM4 ECB \u6a21\u5f0f\n    \u6ce8\u610f\uff1a\u8fd9\u91cc\u4e0d\u81ea\u52a8\u8865\u9f50\uff0c\u957f\u5ea6\u5fc5\u987b\u662f 16 \u7684\u500d\u6570\n    \"\"\"\n    if len(data) % 16 != 0:\n        raise ValueError(\"ECB \u6570\u636e\u957f\u5ea6\u5fc5\u987b\u662f 16 \u7684\u500d\u6570\")\n\n    rk = expand_key(key16)\n    out = b\"\"\n\n    for i in range(0, len(data), 16):\n        out += sm4_block(data&#91;i:i+16], rk, decrypt=decrypt)\n\n    return out\n\n\nif __name__ == \"__main__\":\n    key = bytes.fromhex(\"ac46fb610b313b4f32fc642d8834b456\")\n    ct  = bytes.fromhex(\"49b351855f211b85bd012f80ce8ed5b3\")  # \u5f53\u524d\u53ea\u6709 1 \u5757 = 16 \u5b57\u8282\n\n    # \u89e3\u5bc6\n    pt = sm4_ecb(ct, key, decrypt=True)\n    print(\"PT =\", pt.hex())\n    print(\"PT(raw) =\", pt)\n\n    # \u56de\u52a0\u5bc6\u6821\u9a8c\n    ct_check = sm4_ecb(pt, key, decrypt=False)\n    print(\"RE-ENC MATCH:\", ct_check == ct)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">RC4<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>class RC4:\n    def __init__(self, key: bytes):\n        \"\"\"\n        \u521d\u59cb\u5316 RC4 \u7c7b\n        :param key: \u5bc6\u94a5\uff0c\u5b57\u8282\u7c7b\u578b\n        \"\"\"\n        self.key = key\n        self.s = list(range(256))  # \u521d\u59cb\u5316 S \u6570\u7ec4\n        self._ksa()  # \u6267\u884c\u5bc6\u94a5\u8c03\u5ea6\u7b97\u6cd5\n\n    def _ksa(self):\n        \"\"\"\n        \u5bc6\u94a5\u8c03\u5ea6\u7b97\u6cd5 (Key Scheduling Algorithm, KSA)\n        \"\"\"\n        j = 0\n        key_length = len(self.key)\n        for i in range(256):\n            j = (j + self.s&#91;i] + self.key&#91;i % key_length]) % 256\n            self.s&#91;i], self.s&#91;j] = self.s&#91;j], self.s&#91;i]  # \u4ea4\u6362 S&#91;i] \u548c S&#91;j]\n\n    def _prga(self):\n        \"\"\"\n        \u4f2a\u968f\u673a\u6570\u751f\u6210\u7b97\u6cd5 (Pseudo-Random Generation Algorithm, PRGA)\n        :yield: \u751f\u6210\u7684\u4f2a\u968f\u673a\u5b57\u8282\n        \"\"\"\n        i = j = 0\n        while True:\n            i = (i + 1) % 256\n            j = (j + self.s&#91;i]) % 256\n            self.s&#91;i], self.s&#91;j] = self.s&#91;j], self.s&#91;i]  # \u4ea4\u6362 S&#91;i] \u548c S&#91;j]\n            yield self.s&#91;(self.s&#91;i] + self.s&#91;j]) % 256]\n\n    def encrypt(self, plaintext: bytes) -&gt; bytes:\n        \"\"\"\n        \u52a0\u5bc6\u660e\u6587\n        :param plaintext: \u660e\u6587\uff0c\u5b57\u8282\u7c7b\u578b\n        :return: \u5bc6\u6587\uff0c\u5b57\u8282\u7c7b\u578b\n        \"\"\"\n        keystream = self._prga()\n        return bytes(&#91;p ^ next(keystream) for p in plaintext])\n\n    def decrypt(self, ciphertext: bytes) -&gt; bytes:\n        \"\"\"\n        \u89e3\u5bc6\u5bc6\u6587\n        :param ciphertext: \u5bc6\u6587\uff0c\u5b57\u8282\u7c7b\u578b\n        :return: \u660e\u6587\uff0c\u5b57\u8282\u7c7b\u578b\n        \"\"\"\n        # RC4 \u7684\u52a0\u5bc6\u548c\u89e3\u5bc6\u8fc7\u7a0b\u76f8\u540c\n        return self.encrypt(ciphertext)\nkey = b\"s3c4etKey\"\nplaintext = b\"flag{9ec326a6c0ba06d824c52f2ad8602659}\"\n\n# \u521d\u59cb\u5316 RC4 \u7c7b\nrc4 = RC4(key)\n\n# \u52a0\u5bc6\nciphertext = rc4.encrypt(plaintext)\nprint(\"Ciphertext:\", ciphertext)\n\n# \u89e3\u5bc6\ndecrypted = rc4.decrypt(ciphertext)\nprint(\"Decrypted:\", decrypted)\n    <\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">AES_128(AES\u53ea\u5199\u7b80\u5355\u7684128\u4e86\uff0c\u5176\u4ed6\u7684\u53ef\u4ee5\u5728\u6b64\u57fa\u7840\u4e0a\u81ea\u5df1\u52a0\u5165)<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>SBOX = &#91;\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\nRCON = &#91;0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36]\n\n\ndef pkcs7_pad(data: bytes, block_size: int = 16) -&gt; bytes:\n    \"\"\"PKCS#7 \u8865\u4f4d\"\"\"\n    pad_len = block_size - (len(data) % block_size)\n    return data + bytes(&#91;pad_len] * pad_len)\n\n\ndef xor_bytes(a, b):\n    return &#91;x ^ y for x, y in zip(a, b)]\n\n\ndef xtime(x: int) -&gt; int:\n    \"\"\"GF(2^8) \u4e0a\u4e58 2\"\"\"\n    return (((x &lt;&lt; 1) ^ 0x1B) &amp; 0xFF) if (x &amp; 0x80) else ((x &lt;&lt; 1) &amp; 0xFF)\n\n\ndef sub_bytes(state):\n    \"\"\"\u5b57\u8282\u66ff\u6362\"\"\"\n    return &#91;SBOX&#91;b] for b in state]\n\n\ndef shift_rows(state):\n    \"\"\"\n    \u884c\u79fb\u4f4d\n    \u8fd9\u91cc state \u6309 AES \u6807\u51c6\u4f7f\u7528\u5217\u4f18\u5148\u5e03\u5c40\uff1a\n    state&#91;r + 4*c]\n    \"\"\"\n    out = state&#91;:]\n    for r in range(4):\n        row = &#91;state&#91;r + 4 * c] for c in range(4)]\n        row = row&#91;r:] + row&#91;:r]  # \u5de6\u79fb r \u4f4d\n        for c in range(4):\n            out&#91;r + 4 * c] = row&#91;c]\n    return out\n\n\ndef mix_columns(state):\n    \"\"\"\u5217\u6df7\u5408\"\"\"\n    out = state&#91;:]\n    for c in range(4):\n        i = 4 * c\n        a0, a1, a2, a3 = state&#91;i:i + 4]\n        t = a0 ^ a1 ^ a2 ^ a3\n        out&#91;i + 0] = a0 ^ t ^ xtime(a0 ^ a1)\n        out&#91;i + 1] = a1 ^ t ^ xtime(a1 ^ a2)\n        out&#91;i + 2] = a2 ^ t ^ xtime(a2 ^ a3)\n        out&#91;i + 3] = a3 ^ t ^ xtime(a3 ^ a0)\n    return &#91;x &amp; 0xFF for x in out]\n\n\ndef add_round_key(state, round_key):\n    \"\"\"\u8f6e\u5bc6\u94a5\u5f02\u6216\"\"\"\n    return &#91;(a ^ b) &amp; 0xFF for a, b in zip(state, round_key)]\n\n\ndef rot_word(word):\n    \"\"\"\u5b57\u5faa\u73af\uff1aabcd -&gt; bcda\"\"\"\n    return word&#91;1:] + word&#91;:1]\n\n\ndef sub_word(word):\n    \"\"\"\u5bf9 4 \u5b57\u8282\u5b57\u505a SBOX \u66ff\u6362\"\"\"\n    return &#91;SBOX&#91;b] for b in word]\n\n\ndef key_expansion(key: bytes):\n    \"\"\"\n    AES-128 \u5bc6\u94a5\u6269\u5c55\n    \u8f93\u5165\uff1a16\u5b57\u8282 key\n    \u8f93\u51fa\uff1a11 \u8f6e\u8f6e\u5bc6\u94a5\uff0c\u6bcf\u8f6e 16 \u5b57\u8282\n    \"\"\"\n    if len(key) != 16:\n        raise ValueError(\"AES-128 \u7684 key \u5fc5\u987b\u662f 16 \u5b57\u8282\")\n\n    key_bytes = list(key)\n    words = &#91;key_bytes&#91;i:i + 4] for i in range(0, 16, 4)]  # \u5148\u62c6\u62104\u4e2a\u5b57\n\n    for i in range(4, 44):\n        temp = words&#91;i - 1]&#91;:]\n        if i % 4 == 0:\n            temp = sub_word(rot_word(temp))\n            temp&#91;0] ^= RCON&#91;i \/\/ 4]\n        new_word = &#91;(words&#91;i - 4]&#91;j] ^ temp&#91;j]) &amp; 0xFF for j in range(4)]\n        words.append(new_word)\n\n    round_keys = &#91;]\n    for r in range(11):\n        rk = &#91;]\n        for i in range(4):\n            rk.extend(words&#91;4 * r + i])\n        round_keys.append(rk)\n\n    return round_keys\n\n\ndef aes128_encrypt_block(block: bytes, round_keys):\n    \"\"\"\n    AES-128 \u5355\u5757\u52a0\u5bc6\n    \u8f93\u5165\u5fc5\u987b\u662f 16 \u5b57\u8282\n    \"\"\"\n    if len(block) != 16:\n        raise ValueError(\"\u5355\u5757\u957f\u5ea6\u5fc5\u987b\u662f 16 \u5b57\u8282\")\n\n    state = list(block)\n\n    # \u521d\u59cb\u8f6e\n    state = add_round_key(state, round_keys&#91;0])\n\n    # \u4e2d\u95f4 9 \u8f6e\n    for rnd in range(1, 10):\n        state = sub_bytes(state)\n        state = shift_rows(state)\n        state = mix_columns(state)\n        state = add_round_key(state, round_keys&#91;rnd])\n\n    # \u6700\u540e\u4e00\u8f6e\uff1a\u6ca1\u6709 MixColumns\n    state = sub_bytes(state)\n    state = shift_rows(state)\n    state = add_round_key(state, round_keys&#91;10])\n\n    return bytes(state)\n\n\ndef aes128_ecb_encrypt(data: bytes, key: bytes) -&gt; bytes:\n    \"\"\"\n    AES-128 ECB \u52a0\u5bc6\n    \u81ea\u52a8\u505a PKCS#7 \u8865\u4f4d\n    \"\"\"\n    round_keys = key_expansion(key)\n    data = pkcs7_pad(data, 16)\n\n    out = b\"\"\n    for i in range(0, len(data), 16):\n        block = data&#91;i:i + 16]\n        out += aes128_encrypt_block(block, round_keys)\n    return out\n\n\nif __name__ == \"__main__\":\n    key = b\"1234567890abcdef\"   # 16\u5b57\u8282\n    pt  = b\"hello aes reverse\"\n\n    ct = aes128_ecb_encrypt(pt, key)\n\n    print(\"key =\", key)\n    print(\"pt  =\", pt)\n    print(\"ct(hex) =\", ct.hex())<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5176\u4ed6<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Z3\u548c\u8ff7\u5bab\u4ee5\u53ca\u4e00\u4e9b\u7206\u7834\u811a\u672c\u6ca1\u6709\u56fa\u5b9a\u677f\u5b50\uff0c\u638c\u63e1\u8fd0\u7528\u65b9\u6cd5\u5373\u53ef\u5728\u5404\u7c7b\u9898\u578b\u4e2d\u4e71\u6740\u4e86<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u54ea\u4e9b\u662f\u201c\u771f\u52a0\u5bc6\u201d\uff0c\u54ea\u4e9b\u4e0d\u662f 1\u3001\u771f\u6b63\u7684\u5bc6\u7801\u7b97\u6cd5 \u5bf9\u79f0\u5206\u7ec4\u5bc6\u7801\uff1aAES\u3001DES\u3001TEA\/XTEA\/XXTEA\u3001SM4\u7b49 \u6d41\u5bc6\u7801\uff1a &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"emotion":"","emotion_color":"","title_style":"","license":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-147","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.sherlock666.cn\/index.php\/wp-json\/wp\/v2\/posts\/147","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sherlock666.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sherlock666.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sherlock666.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sherlock666.cn\/index.php\/wp-json\/wp\/v2\/comments?post=147"}],"version-history":[{"count":5,"href":"https:\/\/www.sherlock666.cn\/index.php\/wp-json\/wp\/v2\/posts\/147\/revisions"}],"predecessor-version":[{"id":163,"href":"https:\/\/www.sherlock666.cn\/index.php\/wp-json\/wp\/v2\/posts\/147\/revisions\/163"}],"wp:attachment":[{"href":"https:\/\/www.sherlock666.cn\/index.php\/wp-json\/wp\/v2\/media?parent=147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sherlock666.cn\/index.php\/wp-json\/wp\/v2\/categories?post=147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sherlock666.cn\/index.php\/wp-json\/wp\/v2\/tags?post=147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}