<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>John neo&#39;s blog</title>
  <icon>https://www.gravatar.com/avatar/72982b319641c2b0f34019dfda466b76</icon>
  
  <link href="https://www.chaincipher.cn/atom.xml" rel="self"/>
  
  <link href="https://www.chaincipher.cn/"/>
  <updated>2026-04-11T15:18:34.256Z</updated>
  <id>https://www.chaincipher.cn/</id>
  
  <author>
    <name>John neo</name>
    <email>2094456563@qq.com</email>
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>一次 HTTPS 证书过期引发的排障与修复实战</title>
    <link href="https://www.chaincipher.cn/posts/771daf74.html"/>
    <id>https://www.chaincipher.cn/posts/771daf74.html</id>
    <published>2026-04-11T13:34:57.000Z</published>
    <updated>2026-04-11T15:18:34.256Z</updated>
    
    <content type="html"><![CDATA[<h1 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h1><p>在维护个人博客（基于 Hexo + Flask + Nginx + Gunicorn 架构）过程中，发现网站突然出现“不安全”提示。<br>经检查发现 HTTPS 证书已经过期，导致浏览器拒绝信任连接。<br>本文记录一次完整的排障与修复过程，以及其中踩过的坑和经验总结。</p><h1 id="问题现象"><a href="#问题现象" class="headerlink" title="问题现象"></a>问题现象</h1><p>访问网站：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://chaincipher.cn</span><br></pre></td></tr></table></figure><p>浏览器提示：</p><ul><li>证书已过期</li><li>连接不安全</li></ul><p>服务器执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">certbot certificates</span><br></pre></td></tr></table></figure><p>直接报错：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AttributeError: module &#x27;lib&#x27; has no attribute &#x27;OpenSSL_add_all_algorithms&#x27;</span><br></pre></td></tr></table></figure><h1 id="问题分析"><a href="#问题分析" class="headerlink" title="问题分析"></a>问题分析</h1><h2 id="表面问题"><a href="#表面问题" class="headerlink" title="表面问题"></a>表面问题</h2><ul><li>HTTPS 证书过期</li><li>certbot 工具无法正常运行</li></ul><h2 id="深层原因"><a href="#深层原因" class="headerlink" title="深层原因"></a>深层原因</h2><p>报错核心：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">OpenSSL_add_all_algorithms</span><br></pre></td></tr></table></figure><p>说明：</p><blockquote><p>系统 OpenSSL 与 Python 依赖库（pyOpenSSL &#x2F; cryptography）发生冲突 </p></blockquote><p>原因可能包括：</p><ul><li>使用 pip 安装过相关库</li><li>系统升级导致依赖不兼容</li></ul><h1 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h1><h2 id="移除旧版本-certbot"><a href="#移除旧版本-certbot" class="headerlink" title="移除旧版本 certbot"></a>移除旧版本 certbot</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt remove certbot -y</span><br><span class="line"><span class="built_in">sudo</span> apt autoremove -y</span><br></pre></td></tr></table></figure><h2 id="使用-snap-安装官方版本-certbot"><a href="#使用-snap-安装官方版本-certbot" class="headerlink" title="使用 snap 安装官方版本 certbot"></a>使用 snap 安装官方版本 certbot</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> snap install core</span><br><span class="line"><span class="built_in">sudo</span> snap refresh core</span><br><span class="line"><span class="built_in">sudo</span> snap install --classic certbot</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">ln</span> -s /snap/bin/certbot /usr/bin/certbot</span><br></pre></td></tr></table></figure><h2 id="验证安装"><a href="#验证安装" class="headerlink" title="验证安装"></a>验证安装</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">certbot --version</span><br></pre></td></tr></table></figure><p>确保版本为：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">certbot 2.x.x</span><br></pre></td></tr></table></figure><h2 id="重新申请证书"><a href="#重新申请证书" class="headerlink" title="重新申请证书"></a>重新申请证书</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> certbot --nginx -d chaincipher.cn -d www.chaincipher.cn</span><br></pre></td></tr></table></figure><p>执行结果：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Successfully deployed certificate</span><br><span class="line">Your existing certificate has been successfully renewed</span><br></pre></td></tr></table></figure><h1 id="验证结果"><a href="#验证结果" class="headerlink" title="验证结果"></a>验证结果</h1><h2 id="浏览器验证"><a href="#浏览器验证" class="headerlink" title="浏览器验证"></a>浏览器验证</h2><ul><li>HTTPS 正常</li><li>无安全警告</li><li>小锁恢复</li></ul><h3 id="证书有效期检查"><a href="#证书有效期检查" class="headerlink" title="证书有效期检查"></a>证书有效期检查</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl x509 -<span class="keyword">in</span> /etc/letsencrypt/live/chaincipher.cn/fullchain.pem -noout -dates</span><br></pre></td></tr></table></figure><h1 id="安全增强（进阶优化）"><a href="#安全增强（进阶优化）" class="headerlink" title="安全增强（进阶优化）"></a>安全增强（进阶优化）</h1><h2 id="启用-HSTS"><a href="#启用-HSTS" class="headerlink" title="启用 HSTS"></a>启用 HSTS</h2><p>在 Nginx 配置中添加：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">add_header</span> Strict-Transport-Security <span class="string">&quot;max-age=31536000; includeSubDomains&quot;</span> always;</span><br></pre></td></tr></table></figure><p>作用：</p><ul><li>强制浏览器始终使用 HTTPS</li><li>防止降级攻击</li></ul><h2 id="自动续期验证"><a href="#自动续期验证" class="headerlink" title="自动续期验证"></a>自动续期验证</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> certbot renew --dry-run</span><br></pre></td></tr></table></figure><p>确保自动续期机制正常。</p><h1 id="踩坑总结"><a href="#踩坑总结" class="headerlink" title="踩坑总结"></a>踩坑总结</h1><h2 id="问题1：certbot-无法运行"><a href="#问题1：certbot-无法运行" class="headerlink" title="问题1：certbot 无法运行"></a>问题1：certbot 无法运行</h2><p>原因：</p><ul><li>Python 环境依赖冲突<br>解决：</li><li>使用 snap 隔离环境</li></ul><h2 id="问题2：证书未自动续期"><a href="#问题2：证书未自动续期" class="headerlink" title="问题2：证书未自动续期"></a>问题2：证书未自动续期</h2><p>原因：</p><ul><li>定时任务未生效<br>解决：</li><li>使用 snap 版本自带自动续期</li></ul><h2 id="问题3：下载速度慢"><a href="#问题3：下载速度慢" class="headerlink" title="问题3：下载速度慢"></a>问题3：下载速度慢</h2><p>原因：</p><ul><li>snap 使用国外源<br>解决：</li><li>等待或使用代理</li></ul><h1 id="经验总结"><a href="#经验总结" class="headerlink" title="经验总结"></a>经验总结</h1><ol><li>HTTPS 证书有效期为 90 天，必须依赖自动续期</li><li>避免混用 apt 和 pip 安装系统工具</li><li>snap 提供更稳定的隔离环境</li><li>Web 服务必须定期检查证书状态</li></ol><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>本次问题从表面上看是证书过期，实质上是系统环境冲突导致工具失效。<br>通过重新安装 certbot 并采用 snap 管理，成功恢复 HTTPS 服务。<br>这次排障让我更加理解了：</p><ul><li>Linux 环境依赖管理</li><li>HTTPS 证书机制</li><li>Web 服务稳定性保障</li></ul><h1 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h1><p>对于线上服务来说：</p><blockquote><p>“能运行”远远不够，“能稳定运行”才是关键。<br>未来将继续完善自动化监控与安全机制，提升系统可靠性。</p></blockquote>]]></content>
    
    
    <summary type="html">一次 HTTPS 证书过期引发的排障与修复实战</summary>
    
    
    
    <category term="技术" scheme="https://www.chaincipher.cn/categories/%E6%8A%80%E6%9C%AF/"/>
    
    <category term="安全" scheme="https://www.chaincipher.cn/categories/%E6%8A%80%E6%9C%AF/%E5%AE%89%E5%85%A8/"/>
    
    
    <category term="HTTPS" scheme="https://www.chaincipher.cn/tags/HTTPS/"/>
    
    <category term="证书" scheme="https://www.chaincipher.cn/tags/%E8%AF%81%E4%B9%A6/"/>
    
    <category term="排障" scheme="https://www.chaincipher.cn/tags/%E6%8E%92%E9%9A%9C/"/>
    
    <category term="修复" scheme="https://www.chaincipher.cn/tags/%E4%BF%AE%E5%A4%8D/"/>
    
  </entry>
  
  <entry>
    <title>SM3加密-基于python无第三方库</title>
    <link href="https://www.chaincipher.cn/posts/6bbc19a5.html"/>
    <id>https://www.chaincipher.cn/posts/6bbc19a5.html</id>
    <published>2025-01-06T04:38:38.000Z</published>
    <updated>2025-01-06T04:55:09.695Z</updated>
    
    <content type="html"><![CDATA[<p>SM3是中国自主研发的哈希算法，适合生成数据摘要，安全性较高。（单向加密，不可逆加密） </p><h1 id="基础知识"><a href="#基础知识" class="headerlink" title="基础知识"></a>基础知识</h1><p><a href="/pdf/hash.pdf">SM3基础知识及加解密算法流程pdf下载</a></p><h1 id="python实现"><a href="#python实现" class="headerlink" title="python实现"></a>python实现</h1><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br></pre></td><td class="code"><pre><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">&quot;&quot;&quot;</span><br><span class="line">Created on Sat Dec 14 21:40:07 2024</span><br><span class="line"></span><br><span class="line">SM3   对输入的明文采用utf-8编码</span><br><span class="line">        对输出的密文采用十六进制编码</span><br><span class="line"></span><br><span class="line">&quot;&quot;&quot;</span><br><span class="line">#常量T</span><br><span class="line">def T(j):</span><br><span class="line">    if j&gt;=0 and j&lt;=15:</span><br><span class="line">        return 0x79cc4519</span><br><span class="line">    elif j&gt;=16 and j&lt;=63:</span><br><span class="line">        return 0x7a879d8a</span><br><span class="line">#布尔函数FF</span><br><span class="line">def FF(X, Y, Z, j):</span><br><span class="line">    if j&gt;=0 and j&lt;=15:</span><br><span class="line">        result=X^Y^Z</span><br><span class="line">        return result # 转换为十六进制字符串，去掉前缀 &#x27;0x&#x27;，并保持长度为 8 位（补零）</span><br><span class="line">    else:</span><br><span class="line">        result=(X &amp; Y) | (X &amp; Z) | (Y &amp; Z)</span><br><span class="line">        return result # 转换为十六进制字符串，去掉前缀 &#x27;0x&#x27;，并保持长度为 8 位（补零）</span><br><span class="line">#布尔函数GG</span><br><span class="line">def GG(X, Y, Z, j):</span><br><span class="line">    if j&gt;=0 and j&lt;=15:</span><br><span class="line">        result=X^Y^Z</span><br><span class="line">        return result # 转换为十六进制字符串，去掉前缀 &#x27;0x&#x27;，并保持长度为 8 位（补零）</span><br><span class="line">    else:</span><br><span class="line">        result=(X &amp; Y) | (~X &amp; Z)</span><br><span class="line">        return result # 转换为十六进制字符串，去掉前缀 &#x27;0x&#x27;，并保持长度为 8 位（补零）</span><br><span class="line">#循环左移</span><br><span class="line">def circular_left_shift(x_int, n): #将整数x循环左移n位</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    对32位整数x进行n位的循环左移</span><br><span class="line">    :param x: 输入的整数 (8位16进制数)</span><br><span class="line">    :param n: 左移的位数</span><br><span class="line">    :return: 循环左移后的结果</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    #因为n可能会大于32，此时相当于循环左移n%32位，所以提前对n进行处理</span><br><span class="line">    n=n%32</span><br><span class="line">#   x_int=int(x,16) #将x转化为整数 eg. x从&#x27;0a&#x27;变成了 10</span><br><span class="line">    result=((x_int &lt;&lt; n) &amp; 0xFFFFFFFF) | (x_int &gt;&gt; (32 - n)) #将x循环左移n位</span><br><span class="line">#    return f&quot;&#123;result:08x&#125;&quot; # 转换为十六进制字符串，去掉前缀 &#x27;0x&#x27;，并保持长度为 8 位（补零）</span><br><span class="line">    return result</span><br><span class="line">#置换函数P</span><br><span class="line">def P0(X):</span><br><span class="line">    result=X^circular_left_shift(X,9)^circular_left_shift(X,17)</span><br><span class="line">    return result </span><br><span class="line">def P1(X):</span><br><span class="line">    result=X^circular_left_shift(X,15)^circular_left_shift(X,23)</span><br><span class="line">    return result</span><br><span class="line">#将明文字符串转换为二进制位串</span><br><span class="line">def string_to_bitstring(s):</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    将字符串转换为二进制位串</span><br><span class="line">    :param s: 输入字符串</span><br><span class="line">    :return: 由每个字符转换成的 8 位二进制数拼接成的字符串</span><br><span class="line">    &quot;&quot;&quot;</span><br><span class="line">    result=&#x27;&#x27;.join(format(ord(char), &#x27;08b&#x27;) for char in s)</span><br><span class="line">    return result</span><br><span class="line">#添加填充位。使数据位长度为 448 bit , 剩余的 64 bit用于表示原始明文字符串长度 eg abc，占三字节 24 bit，故末尾的 64 bit表示 24 </span><br><span class="line">def add_padding_bits(bitstring):</span><br><span class="line">    bitstring_padding=bitstring+&#x27;1&#x27; #先在明文二进制位串后面补上1</span><br><span class="line">    if len(bitstring_padding)&gt;448: #若数据长度大于等于448，继续填充</span><br><span class="line">        rule=(len(bitstring_padding)//512+1)*512+448 #填充后的长度</span><br><span class="line">        while len(bitstring_padding)!=rule: #若数据长度不足mod512后不为418，则补0，直至数据长度满足mod512后为448</span><br><span class="line">            bitstring_padding+=&#x27;0&#x27; </span><br><span class="line">    else: #若数据长度小于448,则补0，使数据长度为448</span><br><span class="line">        while len(bitstring_padding)!=448:</span><br><span class="line">            bitstring_padding+=&#x27;0&#x27;</span><br><span class="line">    bitstring_hex_list=[bitstring_padding[i:i+4] for i in range(0,len(bitstring_padding),4)] #截取每四位二进制数，存入列表，以便转为16进制</span><br><span class="line">    bitstring_hex=&#x27;&#x27;.join(hex(int(x,2))[2:] for x in bitstring_hex_list) #将二进制位串的数据转为十六进制串,因为只能是一位，所以不用zfill</span><br><span class="line">    while len(bitstring_hex)%128!=0: #先将剩余的64bit全补为0,直至长度为512的整数倍</span><br><span class="line">        bitstring_hex+=&#x27;0&#x27;</span><br><span class="line">    end_padding=hex(len(bitstring))[2:] #确定原始明文长度，十六进制，为了将原始明文长度添加到末尾,此处也不必zfill</span><br><span class="line">    bitstring_hex=bitstring_hex[:-len(end_padding)]+end_padding #将原始明文长度添加到末尾</span><br><span class="line">    return bitstring_hex</span><br><span class="line"># 模 2**32 加法实现</span><br><span class="line">def mod32_add(x, y, z, u):</span><br><span class="line">    # 转换为整数并模 2**32，只保留低 32 位</span><br><span class="line">    result = (x + y + z + u) &amp; 0xFFFFFFFF</span><br><span class="line">    # 转换为十六进制字符串，去掉前缀 &#x27;0x&#x27;，并保持长度为 8 位（补零）</span><br><span class="line">#    return f&quot;&#123;result:08x&#125;&quot;</span><br><span class="line">    return result</span><br><span class="line">#SM3杂凑函数</span><br><span class="line">def sm3_encode(bitstring_hex):</span><br><span class="line">    #将消息分组，每组128个十六进制，即512bit</span><br><span class="line">    bitstring_hex_group=[bitstring_hex[i:i+128] for i in range(0,len(bitstring_hex),128)] #将128位一组分割</span><br><span class="line">    #初始向量IV</span><br><span class="line">    IV = [0x7380166f, 0x4914b2b9, 0x172442d7, 0xda8a0600, 0xa96f30bc, 0x163138aa, 0xe38dee4d, 0xb0fb0e4e]</span><br><span class="line">    #生成字 W,对每个分组都进行</span><br><span class="line">    for bitstring_hex_i in bitstring_hex_group:</span><br><span class="line">        w=[bitstring_hex_i[i:i+8] for i in range(0,len(bitstring_hex_i),8)] #将每四个字节，构成一个字，存储到 w[]中，共 16个字</span><br><span class="line">        for j in range(16,68):</span><br><span class="line">            w_tem=P1(int(w[j-16],16)^int(w[j-9],16)^circular_left_shift(int(w[j-3],16),15))^circular_left_shift(int(w[j-13],16),7)^int(w[j-6],16)</span><br><span class="line">            w.append(format(w_tem, &#x27;08x&#x27;)) #将w_tem转化为16进制字符串，并保持长度为 8 位（补零）</span><br><span class="line">        for j in range(0,64): #从w列表的第68位开始，存储w0&#x27;，w1&#x27;,...,w63&#x27;</span><br><span class="line">            w_tem=int(w[j],16)^int(w[j+4],16)</span><br><span class="line">            w.append(format(w_tem, &#x27;08x&#x27;))</span><br><span class="line">        #迭代压缩</span><br><span class="line">        A=[IV[len(IV)-8]]</span><br><span class="line">        B=[IV[len(IV)-7]]</span><br><span class="line">        C=[IV[len(IV)-6]]</span><br><span class="line">        D=[IV[len(IV)-5]]</span><br><span class="line">        E=[IV[len(IV)-4]]</span><br><span class="line">        F=[IV[len(IV)-3]]</span><br><span class="line">        G=[IV[len(IV)-2]]</span><br><span class="line">        H=[IV[len(IV)-1]]</span><br><span class="line">        for j in range(0,64):</span><br><span class="line">            if j!=0:</span><br><span class="line">                A=[int(i,16) for i in A]</span><br><span class="line">                B=[int(i,16) for i in B]</span><br><span class="line">                C=[int(i,16) for i in C]</span><br><span class="line">                D=[int(i,16) for i in D]</span><br><span class="line">                E=[int(i,16) for i in E]</span><br><span class="line">                F=[int(i,16) for i in F]</span><br><span class="line">                G=[int(i,16) for i in G]</span><br><span class="line">                H=[int(i,16) for i in H]</span><br><span class="line">            SS1=circular_left_shift(mod32_add(circular_left_shift(A[len(A)-1],12),E[len(E)-1],circular_left_shift(T(j),j),0),7)</span><br><span class="line">            SS2=SS1^circular_left_shift(A[len(A)-1],12)</span><br><span class="line">            TT1=mod32_add(FF(A[len(A)-1],B[len(B)-1],C[len(C)-1],j),D[len(D)-1],SS2,int(w[j+68],16))</span><br><span class="line">            TT2=mod32_add(GG(E[len(E)-1],F[len(F)-1],G[len(G)-1],j),H[len(H)-1],SS1,int(w[j],16))</span><br><span class="line">            D.append(C[len(C)-1])</span><br><span class="line">            C.append(circular_left_shift(B[len(B)-1],9))</span><br><span class="line">            B.append(A[len(A)-1])</span><br><span class="line">            A.append(TT1)</span><br><span class="line">            H.append(G[len(G)-1])</span><br><span class="line">            G.append(circular_left_shift(F[len(F)-1],19))</span><br><span class="line">            F.append(E[len(E)-1])</span><br><span class="line">            E.append(P0(TT2))</span><br><span class="line">            A=[format(i, &#x27;08x&#x27;) for i in A]</span><br><span class="line">            B=[format(i, &#x27;08x&#x27;) for i in B]</span><br><span class="line">            C=[format(i, &#x27;08x&#x27;) for i in C]</span><br><span class="line">            D=[format(i, &#x27;08x&#x27;) for i in D]</span><br><span class="line">            E=[format(i, &#x27;08x&#x27;) for i in E]</span><br><span class="line">            F=[format(i, &#x27;08x&#x27;) for i in F]</span><br><span class="line">            G=[format(i, &#x27;08x&#x27;) for i in G]</span><br><span class="line">            H=[format(i, &#x27;08x&#x27;) for i in H]</span><br><span class="line">        </span><br><span class="line">        #更新IV</span><br><span class="line">        A=[int(i,16) for i in A]</span><br><span class="line">        B=[int(i,16) for i in B]</span><br><span class="line">        C=[int(i,16) for i in C]</span><br><span class="line">        D=[int(i,16) for i in D]</span><br><span class="line">        E=[int(i,16) for i in E]</span><br><span class="line">        F=[int(i,16) for i in F]</span><br><span class="line">        G=[int(i,16) for i in G]</span><br><span class="line">        H=[int(i,16) for i in H]</span><br><span class="line">        IV.append(A[len(A)-1]^IV[len(IV)-8])</span><br><span class="line">        IV.append(B[len(B)-1]^IV[len(IV)-8])</span><br><span class="line">        IV.append(C[len(C)-1]^IV[len(IV)-8])</span><br><span class="line">        IV.append(D[len(D)-1]^IV[len(IV)-8])</span><br><span class="line">        IV.append(E[len(E)-1]^IV[len(IV)-8])</span><br><span class="line">        IV.append(F[len(F)-1]^IV[len(IV)-8])</span><br><span class="line">        IV.append(G[len(G)-1]^IV[len(IV)-8])</span><br><span class="line">        IV.append(H[len(H)-1]^IV[len(IV)-8])</span><br><span class="line">    #将IV转化为16进制字符串，并保持长度为 8 位（补零）</span><br><span class="line">    IV=[format(i, &#x27;08x&#x27;) for i in IV]</span><br><span class="line">    #将IV_hex拼接成16进制字符串</span><br><span class="line">    result=IV[len(IV)-8]+IV[len(IV)-7]+IV[len(IV)-6]+IV[len(IV)-5]+IV[len(IV)-4]+IV[len(IV)-3]+IV[len(IV)-2]+IV[len(IV)-1]</span><br><span class="line">    return result</span><br><span class="line">#主程序</span><br><span class="line">def main():</span><br><span class="line">    while True:</span><br><span class="line">        print(&quot;==================== SM3 加密======================&quot;)</span><br><span class="line">        print(&quot;[1] 加密&quot;)</span><br><span class="line">        print(&quot;[0] 退出&quot;)</span><br><span class="line">        print(&quot;====================================================&quot;)</span><br><span class="line">        try:</span><br><span class="line">            choice = int(input(&quot;请输入操作选项 (0 或 1 ): &quot;))</span><br><span class="line">            if choice == 0:</span><br><span class="line">                print(&quot;\n\n程序已退出。感谢使用 SM3 加密工具！&quot;)</span><br><span class="line">                break</span><br><span class="line">            elif choice == 1:</span><br><span class="line">                # 加密流程</span><br><span class="line">                plaintext = input(&quot;请输入明文 (UTF-8 编码，任意长度): &quot;)</span><br><span class="line">                #明文转化为二进制位字符串</span><br><span class="line">                bitstring = string_to_bitstring(plaintext)</span><br><span class="line">                #填充为512位二进制，并转化为16进制，共128个字符</span><br><span class="line">                bitstring_hex = add_padding_bits(bitstring)</span><br><span class="line">                if not plaintext:</span><br><span class="line">                    raise ValueError(&quot;明文不能为空！&quot;)</span><br><span class="line">                #sha-1加密</span><br><span class="line">                ciphertext=sm3_encode(bitstring_hex)</span><br><span class="line">                print(&quot;\n加密结果 (十六进制):&quot;)</span><br><span class="line">                print(ciphertext)</span><br><span class="line">            else:</span><br><span class="line">                raise ValueError(&quot;无效选项&quot;)</span><br><span class="line">    </span><br><span class="line">        except ValueError as e:</span><br><span class="line">            print(f&quot;输入错误: &#123;e&#125;&quot;)</span><br><span class="line">        except Exception as e:</span><br><span class="line">            print(f&quot;发生错误: &#123;e&#125;&quot;)</span><br><span class="line"># =============================================================================</span><br><span class="line"># # 示例 密码书 P318</span><br><span class="line"># #输入明文</span><br><span class="line"># plaintext = &quot;abc&quot;</span><br><span class="line"># #明文转化为二进制位字符串</span><br><span class="line"># bitstring = string_to_bitstring(plaintext)</span><br><span class="line"># #填充为512位二进制，并转化为16进制，共128个字符</span><br><span class="line"># bitstring_hex = add_padding_bits(bitstring)</span><br><span class="line"># #SM3加密</span><br><span class="line"># ciphertext=sm3_encode(bitstring_hex)</span><br><span class="line"># print(f&quot;输入字符串: &#123;plaintext&#125;&quot;)</span><br><span class="line"># print(f&quot;密文串: &#123;ciphertext&#125;&quot;)</span><br><span class="line"># =============================================================================</span><br><span class="line">if __name__==&quot;__main__&quot;:</span><br><span class="line">    main()</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;SM3是中国自主研发的哈希算法，适合生成数据摘要，安全性较高。（单向加密，不可逆加密） &lt;/p&gt;
&lt;h1 id=&quot;基础知识&quot;&gt;&lt;a href=&quot;#基础知识&quot; class=&quot;headerlink&quot; title=&quot;基础知识&quot;&gt;&lt;/a&gt;基础知识&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;/</summary>
      
    
    
    
    <category term="密码学" scheme="https://www.chaincipher.cn/categories/%E5%AF%86%E7%A0%81%E5%AD%A6/"/>
    
    <category term="SM3" scheme="https://www.chaincipher.cn/categories/%E5%AF%86%E7%A0%81%E5%AD%A6/SM3/"/>
    
    
    <category term="SM3" scheme="https://www.chaincipher.cn/tags/SM3/"/>
    
  </entry>
  
  <entry>
    <title>SHA-1加密-基于python无第三方库</title>
    <link href="https://www.chaincipher.cn/posts/7c0e17a3.html"/>
    <id>https://www.chaincipher.cn/posts/7c0e17a3.html</id>
    <published>2025-01-06T03:08:37.000Z</published>
    <updated>2025-01-06T04:51:57.603Z</updated>
    
    <content type="html"><![CDATA[<p>SHA-1 是一种哈希算法，用于生成数据的摘要，但安全性较低，已不建议使用。(单向加密，不可逆加密)</p><h1 id="基础知识"><a href="#基础知识" class="headerlink" title="基础知识"></a>基础知识</h1><p><a href="/pdf/hash.pdf">SHA-1基础知识及加解密算法流程pdf下载</a></p><h1 id="python实现"><a href="#python实现" class="headerlink" title="python实现"></a>python实现</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">Created on Sat Dec 14 21:40:07 2024</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">SHA-1   对输入的明文采用utf-8编码</span></span><br><span class="line"><span class="string">        对输出的密文采用十六进制编码</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#将明文字符串转换为二进制位串</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">string_to_bitstring</span>(<span class="params">s</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    将字符串转换为二进制位串</span></span><br><span class="line"><span class="string">    :param s: 输入字符串</span></span><br><span class="line"><span class="string">    :return: 由每个字符转换成的 8 位二进制数拼接成的字符串</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;&#x27;</span>.join(<span class="built_in">format</span>(<span class="built_in">ord</span>(char), <span class="string">&#x27;08b&#x27;</span>) <span class="keyword">for</span> char <span class="keyword">in</span> s)</span><br><span class="line"></span><br><span class="line"><span class="comment">#添加填充位。使数据位长度为 448 bit , 剩余的 64 bit用于表示原始明文字符串长度 eg abc，占三字节 24 bit，故末尾的 64 bit表示 24 </span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">add_padding_bits</span>(<span class="params">bitstring</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(bitstring) &lt; <span class="number">448</span>: <span class="comment">#若不够448位，则填充</span></span><br><span class="line">        bitstring_padding=bitstring+<span class="string">&#x27;1&#x27;</span> <span class="comment">#先在明文二进制位串后面补上1</span></span><br><span class="line">        <span class="keyword">while</span> <span class="built_in">len</span>(bitstring_padding)!=<span class="number">448</span>:</span><br><span class="line">            bitstring_padding+=<span class="string">&#x27;0&#x27;</span> <span class="comment">#剩余的全补为0，直至数据长度为 448</span></span><br><span class="line">        bitstring_hex_list=[bitstring_padding[i:i+<span class="number">4</span>] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>,<span class="built_in">len</span>(bitstring_padding),<span class="number">4</span>)] <span class="comment">#截取每四位二进制数，存入列表，以便转为16进制</span></span><br><span class="line">    <span class="keyword">else</span>: <span class="comment">#若够448位，无需填充, 此时还有问题未解决，加密结果和正确的不一致</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;明文字符串长度 &gt;= 56, 尚未实现&quot;</span>)</span><br><span class="line">    bitstring_hex=<span class="string">&#x27;&#x27;</span>.join(<span class="built_in">hex</span>(<span class="built_in">int</span>(x,<span class="number">2</span>))[<span class="number">2</span>:] <span class="keyword">for</span> x <span class="keyword">in</span> bitstring_hex_list) <span class="comment">#将二进制位串的数据转为十六进制串,因为只能是一位，所以不用zfill</span></span><br><span class="line">    <span class="keyword">while</span> <span class="built_in">len</span>(bitstring_hex)!=<span class="number">128</span>: <span class="comment">#先将剩余的64bit全补为0</span></span><br><span class="line">        bitstring_hex+=<span class="string">&#x27;0&#x27;</span></span><br><span class="line">    end_padding=<span class="built_in">hex</span>(<span class="built_in">len</span>(bitstring))[<span class="number">2</span>:] <span class="comment">#确定原始明文长度，十六进制，为了将原始明文长度添加到末尾,此处也不必zfill</span></span><br><span class="line">    bitstring_hex=bitstring_hex[:-<span class="built_in">len</span>(end_padding)]+end_padding <span class="comment">#将原始明文长度添加到末尾</span></span><br><span class="line">    <span class="keyword">return</span> bitstring_hex</span><br><span class="line"></span><br><span class="line"><span class="comment">#循环左移</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">circular_left_shift</span>(<span class="params">x, n</span>): <span class="comment">#将整数x循环左移n位</span></span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    对32位整数x进行n位的循环左移</span></span><br><span class="line"><span class="string">    :param x: 输入的整数 (8位16进制数)</span></span><br><span class="line"><span class="string">    :param n: 左移的位数</span></span><br><span class="line"><span class="string">    :return: 循环左移后的结果</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    x_int=<span class="built_in">int</span>(x,<span class="number">16</span>) <span class="comment">#将x转化为整数 eg. x从&#x27;0a&#x27;变成了 10</span></span><br><span class="line">    result=((x_int &lt;&lt; n) &amp; <span class="number">0xFFFFFFFF</span>) | (x_int &gt;&gt; (<span class="number">32</span> - n)) <span class="comment">#将x循环左移n位</span></span><br><span class="line">    <span class="keyword">return</span> <span class="string">f&quot;<span class="subst">&#123;result:08x&#125;</span>&quot;</span> <span class="comment"># 转换为十六进制字符串，去掉前缀 &#x27;0x&#x27;，并保持长度为 8 位（补零）</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 模 2**32 加法实现</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">mod32_add</span>(<span class="params">x, y, z, u, k</span>):</span><br><span class="line">    <span class="comment"># 转换为整数并模 2**32，只保留低 32 位</span></span><br><span class="line">    result = (<span class="built_in">int</span>(x, <span class="number">16</span>) + <span class="built_in">int</span>(y, <span class="number">16</span>) + <span class="built_in">int</span>(z, <span class="number">16</span>) + <span class="built_in">int</span>(u, <span class="number">16</span>) + <span class="built_in">int</span>(k, <span class="number">16</span>)) &amp; <span class="number">0xFFFFFFFF</span></span><br><span class="line">    <span class="comment"># 转换为十六进制字符串，去掉前缀 &#x27;0x&#x27;，并保持长度为 8 位（补零）</span></span><br><span class="line">    <span class="keyword">return</span> <span class="string">f&quot;<span class="subst">&#123;result:08x&#125;</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#压缩函数 f1</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">f1</span>(<span class="params">X, Y, Z</span>):</span><br><span class="line">    result = (<span class="built_in">int</span>(X, <span class="number">16</span>) &amp; <span class="built_in">int</span>(Y, <span class="number">16</span>)) | ((~<span class="built_in">int</span>(X, <span class="number">16</span>)) &amp; <span class="built_in">int</span>(Z, <span class="number">16</span>)) <span class="comment"># ~ 取反操作是按位取反，但为了避免补码带来的负数影响，并确保始终在 32 位范围内，使用 ~X &amp; 0xFFFFFFFF 来取反</span></span><br><span class="line">    <span class="keyword">return</span> <span class="string">f&quot;<span class="subst">&#123;result:08x&#125;</span>&quot;</span> <span class="comment"># 转换为十六进制字符串，去掉前缀 &#x27;0x&#x27;，并保持长度为 8 位（补零）</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#压缩函数 f2</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">f2</span>(<span class="params">X, Y, Z</span>):</span><br><span class="line">    result = <span class="built_in">int</span>(X,<span class="number">16</span>) ^ <span class="built_in">int</span>(Y,<span class="number">16</span>) ^ <span class="built_in">int</span>(Z,<span class="number">16</span>)</span><br><span class="line">    <span class="keyword">return</span> <span class="string">f&quot;<span class="subst">&#123;result:08x&#125;</span>&quot;</span> <span class="comment"># 转换为十六进制字符串，去掉前缀 &#x27;0x&#x27;，并保持长度为 8 位（补零）</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#压缩函数 f3</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">f3</span>(<span class="params">X, Y, Z</span>):</span><br><span class="line">    result = (<span class="built_in">int</span>(X,<span class="number">16</span>) &amp; <span class="built_in">int</span>(Y,<span class="number">16</span>)) | (<span class="built_in">int</span>(X,<span class="number">16</span>) &amp; <span class="built_in">int</span>(Z,<span class="number">16</span>)) | (<span class="built_in">int</span>(Y,<span class="number">16</span>) &amp; <span class="built_in">int</span>(Z,<span class="number">16</span>))</span><br><span class="line">    <span class="keyword">return</span> <span class="string">f&quot;<span class="subst">&#123;result:08x&#125;</span>&quot;</span> <span class="comment"># 转换为十六进制字符串，去掉前缀 &#x27;0x&#x27;，并保持长度为 8 位（补零）</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#压缩函数 f4</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">f4</span>(<span class="params">X, Y, Z</span>):</span><br><span class="line">    result = <span class="built_in">int</span>(X,<span class="number">16</span>) ^ <span class="built_in">int</span>(Y,<span class="number">16</span>) ^ <span class="built_in">int</span>(Z,<span class="number">16</span>)</span><br><span class="line">    <span class="keyword">return</span> <span class="string">f&quot;<span class="subst">&#123;result:08x&#125;</span>&quot;</span> <span class="comment"># 转换为十六进制字符串，去掉前缀 &#x27;0x&#x27;，并保持长度为 8 位（补零）</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#sha-1加密</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sha_1_encode</span>(<span class="params">bitstring_hex</span>):</span><br><span class="line">    <span class="comment">#初始化五个寄存器</span></span><br><span class="line">    A=[<span class="string">&#x27;67452301&#x27;</span>]</span><br><span class="line">    B=[<span class="string">&#x27;EFCDAB89&#x27;</span>]</span><br><span class="line">    C=[<span class="string">&#x27;98BADCFE&#x27;</span>]</span><br><span class="line">    D=[<span class="string">&#x27;10325476&#x27;</span>]</span><br><span class="line">    E=[<span class="string">&#x27;C3D2E1F0&#x27;</span>]</span><br><span class="line">    <span class="comment">#生成字 W</span></span><br><span class="line">    w=[bitstring_hex[i:i+<span class="number">8</span>] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>,<span class="built_in">len</span>(bitstring_hex),<span class="number">8</span>)] <span class="comment">#将每四个字节，构成一个字，存储到 w[]中，共 16个字</span></span><br><span class="line">    <span class="comment">#固定常数</span></span><br><span class="line">    K=[<span class="string">&#x27;5a827999&#x27;</span>,<span class="string">&#x27;6ed9eba1&#x27;</span>,<span class="string">&#x27;8f1bbcdc&#x27;</span>,<span class="string">&#x27;ca62c1d6&#x27;</span>]</span><br><span class="line">    <span class="comment">#存储压缩函数</span></span><br><span class="line">    function=[f1,f2,f3,f4]</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">16</span>,<span class="number">80</span>): <span class="comment">#共 80个字</span></span><br><span class="line">        w_tem=<span class="string">&#x27;&#x27;</span>.join([<span class="built_in">hex</span>(<span class="built_in">int</span>(a,<span class="number">16</span>) ^ <span class="built_in">int</span>(b,<span class="number">16</span>) ^ <span class="built_in">int</span>(c,<span class="number">16</span>) ^ <span class="built_in">int</span>(d,<span class="number">16</span>))[<span class="number">2</span>:] <span class="keyword">for</span> a,b,c,d <span class="keyword">in</span> <span class="built_in">zip</span>(w[i-<span class="number">16</span>],w[i-<span class="number">14</span>],w[i-<span class="number">8</span>],w[i-<span class="number">3</span>])]) <span class="comment">#异或操作，这里的&#x27;&#x27;.join是为了让该列表变为字符串</span></span><br><span class="line">        w_tem=circular_left_shift(w_tem, <span class="number">1</span>) <span class="comment">#循环左移 1位</span></span><br><span class="line">        w.append(w_tem) <span class="comment">#将生成的字添加到 w列表中</span></span><br><span class="line">    <span class="comment">#经过四轮，每轮20步</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">        <span class="keyword">for</span> t <span class="keyword">in</span> <span class="built_in">range</span>(i*<span class="number">20</span>,(i+<span class="number">1</span>)*<span class="number">20</span>):</span><br><span class="line">            A_tem=mod32_add(E[<span class="built_in">len</span>(E)-<span class="number">1</span>],function[i](B[<span class="built_in">len</span>(B)-<span class="number">1</span>],C[<span class="built_in">len</span>(C)-<span class="number">1</span>],D[<span class="built_in">len</span>(D)-<span class="number">1</span>]),circular_left_shift(A[<span class="built_in">len</span>(A)-<span class="number">1</span>], <span class="number">5</span>), w[t], K[i])</span><br><span class="line">            A.append(A_tem)</span><br><span class="line">            B.append(A[<span class="built_in">len</span>(A)-<span class="number">2</span>])</span><br><span class="line">            C.append(circular_left_shift(B[<span class="built_in">len</span>(B)-<span class="number">2</span>], <span class="number">30</span>))</span><br><span class="line">            D.append(C[<span class="built_in">len</span>(C)-<span class="number">2</span>])</span><br><span class="line">            E.append(D[<span class="built_in">len</span>(D)-<span class="number">2</span>])</span><br><span class="line">    <span class="comment">#输出变换</span></span><br><span class="line">    A.append(mod32_add(A[<span class="built_in">len</span>(A)-<span class="number">1</span>], A[<span class="built_in">len</span>(A)-<span class="number">81</span>], <span class="string">&#x27;0&#x27;</span>, <span class="string">&#x27;0&#x27;</span>, <span class="string">&#x27;0&#x27;</span>))</span><br><span class="line">    B.append(mod32_add(B[<span class="built_in">len</span>(B)-<span class="number">1</span>], B[<span class="built_in">len</span>(B)-<span class="number">81</span>], <span class="string">&#x27;0&#x27;</span>, <span class="string">&#x27;0&#x27;</span>, <span class="string">&#x27;0&#x27;</span>))</span><br><span class="line">    C.append(mod32_add(C[<span class="built_in">len</span>(C)-<span class="number">1</span>], C[<span class="built_in">len</span>(C)-<span class="number">81</span>], <span class="string">&#x27;0&#x27;</span>, <span class="string">&#x27;0&#x27;</span>, <span class="string">&#x27;0&#x27;</span>))</span><br><span class="line">    D.append(mod32_add(D[<span class="built_in">len</span>(D)-<span class="number">1</span>], D[<span class="built_in">len</span>(D)-<span class="number">81</span>], <span class="string">&#x27;0&#x27;</span>, <span class="string">&#x27;0&#x27;</span>, <span class="string">&#x27;0&#x27;</span>))</span><br><span class="line">    E.append(mod32_add(E[<span class="built_in">len</span>(E)-<span class="number">1</span>], E[<span class="built_in">len</span>(E)-<span class="number">81</span>], <span class="string">&#x27;0&#x27;</span>, <span class="string">&#x27;0&#x27;</span>, <span class="string">&#x27;0&#x27;</span>))</span><br><span class="line">    ciphertext=A[<span class="built_in">len</span>(A)-<span class="number">1</span>]+B[<span class="built_in">len</span>(B)-<span class="number">1</span>]+C[<span class="built_in">len</span>(C)-<span class="number">1</span>]+D[<span class="built_in">len</span>(D)-<span class="number">1</span>]+E[<span class="built_in">len</span>(E)-<span class="number">1</span>]</span><br><span class="line">    <span class="keyword">return</span> ciphertext</span><br><span class="line"></span><br><span class="line"><span class="comment">#主程序</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;==================== SHA-1 加密======================&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;[1] 加密&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;[0] 退出&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;====================================================&quot;</span>)</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            choice = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&quot;请输入操作选项 (0 或 1 ): &quot;</span>))</span><br><span class="line">            <span class="keyword">if</span> choice == <span class="number">0</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;\n\n程序已退出。感谢使用 SHA-1 加密工具！&quot;</span>)</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            <span class="keyword">elif</span> choice == <span class="number">1</span>:</span><br><span class="line">                <span class="comment"># 加密流程</span></span><br><span class="line">                plaintext = <span class="built_in">input</span>(<span class="string">&quot;请输入明文 (UTF-8 编码，目前只支持字符长度 &lt;56): &quot;</span>)</span><br><span class="line">                <span class="comment">#明文转化为二进制位字符串</span></span><br><span class="line">                bitstring = string_to_bitstring(plaintext)</span><br><span class="line">                <span class="comment">#填充为512位二进制，并转化为16进制，共128个字符</span></span><br><span class="line">                bitstring_hex = add_padding_bits(bitstring)</span><br><span class="line">                <span class="keyword">if</span> <span class="keyword">not</span> plaintext:</span><br><span class="line">                    <span class="keyword">raise</span> ValueError(<span class="string">&quot;明文不能为空！&quot;</span>)</span><br><span class="line">                <span class="comment">#sha-1加密</span></span><br><span class="line">                ciphertext=sha_1_encode(bitstring_hex)</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;\n加密结果 (十六进制):&quot;</span>)</span><br><span class="line">                <span class="built_in">print</span>(ciphertext)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">raise</span> ValueError(<span class="string">&quot;无效选项&quot;</span>)</span><br><span class="line">    </span><br><span class="line">        <span class="keyword">except</span> ValueError <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;输入错误: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;发生错误: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">            </span><br><span class="line"><span class="comment"># 示例 密码书 P188</span></span><br><span class="line"><span class="comment"># =============================================================================</span></span><br><span class="line"><span class="comment"># #输入明文</span></span><br><span class="line"><span class="comment"># plaintext = &quot;11111111111111111111111111111111111111111111111111111111&quot;</span></span><br><span class="line"><span class="comment"># #明文转化为二进制位字符串</span></span><br><span class="line"><span class="comment"># bitstring = string_to_bitstring(plaintext)</span></span><br><span class="line"><span class="comment"># #填充为512位二进制，并转化为16进制，共128个字符</span></span><br><span class="line"><span class="comment"># bitstring_hex = add_padding_bits(bitstring)</span></span><br><span class="line"><span class="comment"># #sha-1加密</span></span><br><span class="line"><span class="comment"># ciphertext=sha_1_encode(bitstring_hex)</span></span><br><span class="line"><span class="comment"># print(f&quot;输入字符串: &#123;plaintext&#125;&quot;)</span></span><br><span class="line"><span class="comment"># print(f&quot;密文串: &#123;ciphertext&#125;&quot;)</span></span><br><span class="line"><span class="comment"># =============================================================================</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__==<span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">SHA-1 是一种哈希算法，用于生成数据的摘要，但安全性较低，已不建议使用。(单向加密，不可逆加密)</summary>
    
    
    
    <category term="密码学" scheme="https://www.chaincipher.cn/categories/%E5%AF%86%E7%A0%81%E5%AD%A6/"/>
    
    <category term="SHA-1" scheme="https://www.chaincipher.cn/categories/%E5%AF%86%E7%A0%81%E5%AD%A6/SHA-1/"/>
    
    
    <category term="SHA-1" scheme="https://www.chaincipher.cn/tags/SHA-1/"/>
    
  </entry>
  
  <entry>
    <title>AES加解密-基于python无第三方库</title>
    <link href="https://www.chaincipher.cn/posts/baf8092.html"/>
    <id>https://www.chaincipher.cn/posts/baf8092.html</id>
    <published>2025-01-05T08:12:06.000Z</published>
    <updated>2025-01-06T03:10:32.642Z</updated>
    
    <content type="html"><![CDATA[<p>AES加密算法是一种对称加密算法，它对原始数据进行加密，生成密文，只有知道密钥和算法，才能解密出原始数据。<br>本文将介绍AES加密算法的实现，并使用python语言实现AES加密和解密。</p><h1 id="基础知识"><a href="#基础知识" class="headerlink" title="基础知识"></a>基础知识</h1><p><a href="/pdf/AES.pdf">AES基础知识及加解密算法流程pdf下载</a></p><h1 id="python实现"><a href="#python实现" class="headerlink" title="python实现"></a>python实现</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#AES算法，密钥长度选择128位，轮数为10，明文和密钥采用UTF-8编码(一个字符代表一个字节，chr与ord转化即可)</span></span><br><span class="line"><span class="comment">#密文采用十六进制编码。</span></span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> constant <span class="comment">#constant 存有各种常量：S盒S_box，轮常量Rcon，对数表Log_table，</span></span><br><span class="line"><span class="comment">#反对数表Antilog_table，列混淆加密时的常数矩阵 mix_columns_en_matrix 等</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#字节代换(S盒变换)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">subbytes</span>(<span class="params">tai</span>):  <span class="comment">#参数传入tai，四乘四的矩阵，元素为十六进制字符串</span></span><br><span class="line">    tai_tem=[[<span class="number">0</span>]*<span class="number">4</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>)] <span class="comment">#储存临时tai</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):  <span class="comment">#对每个元素进行查表替换</span></span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">            row=<span class="built_in">int</span>(tai[i][j],<span class="number">16</span>)//<span class="number">16</span> <span class="comment">#获得S盒的行序号</span></span><br><span class="line">            column=<span class="built_in">int</span>(tai[i][j],<span class="number">16</span>)%<span class="number">16</span> <span class="comment">#获得S盒的列序号</span></span><br><span class="line">            tai_tem[i][j]=<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(constant.S_box[row][column])[<span class="number">2</span>:].zfill(<span class="number">2</span>)  <span class="comment">#S盒替换，</span></span><br><span class="line">            <span class="comment">#并将元素转化为十六进制字符串型，和初始元素类型一致</span></span><br><span class="line">    tai_tem=np.array(tai_tem) <span class="comment">#转化为矩阵</span></span><br><span class="line">    <span class="keyword">return</span> tai_tem  <span class="comment">#字节代换完成，返回新tai</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#逆字节代换(逆S盒变换)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">invsubbytes</span>(<span class="params">tai</span>):  <span class="comment">#参数传入tai，四乘四的矩阵，元素为十六进制字符串</span></span><br><span class="line">    tai_tem=[[<span class="number">0</span>]*<span class="number">4</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>)] <span class="comment">#储存临时tai</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):  <span class="comment">#对每个元素进行查表替换</span></span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">            row=<span class="built_in">int</span>(tai[i][j],<span class="number">16</span>)//<span class="number">16</span> <span class="comment">#获得S盒的行序号</span></span><br><span class="line">            column=<span class="built_in">int</span>(tai[i][j],<span class="number">16</span>)%<span class="number">16</span> <span class="comment">#获得S盒的列序号</span></span><br><span class="line">            tai_tem[i][j]=<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(constant.Inv_Sbox[row][column])[<span class="number">2</span>:].zfill(<span class="number">2</span>)  <span class="comment">#逆S盒替换，</span></span><br><span class="line">            <span class="comment">#并将元素转化为十六进制字符串型，和初始元素类型一致</span></span><br><span class="line">    tai_tem=np.array(tai_tem) <span class="comment">#转化为矩阵</span></span><br><span class="line">    <span class="keyword">return</span> tai_tem  <span class="comment">#字节代换完成，返回新tai</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#轮密钥生成中的T函数</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">T</span>(<span class="params">matrix,i,rcon_matrix</span>): <span class="comment">#传入的i值用于判断轮数，以找到和第几轮的轮常量进行异或</span></span><br><span class="line">    matrix = np.roll(matrix, -<span class="number">1</span>) <span class="comment">#循环左移一位</span></span><br><span class="line">    <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="built_in">len</span>(matrix)): <span class="comment">#对每个元素进行S表替换</span></span><br><span class="line">        j_int=<span class="built_in">int</span>(matrix[j],<span class="number">16</span>) <span class="comment">#j_int存放每个元素的整数值，以方便获得索引调用S_box[][]</span></span><br><span class="line">        row=j_int//<span class="number">16</span> <span class="comment">#获得行索引</span></span><br><span class="line">        column=j_int%<span class="number">16</span> <span class="comment">#获得列索引</span></span><br><span class="line">        matrix[j]=<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(constant.S_box[row][column])[<span class="number">2</span>:].zfill(<span class="number">2</span>) <span class="comment">#S盒替换</span></span><br><span class="line"><span class="comment">#        matrix[j]=constant.S_box[row][column] #其实每个元素获得其int型即可，</span></span><br><span class="line">         <span class="comment">#因为异或操作函数只能进行元素都是整型的两个矩阵</span></span><br><span class="line"><span class="comment">#    matrix=matrix.astype(int) #发现还是字符型，搜索得知，需要重新定义矩阵数组的类型，</span></span><br><span class="line"><span class="comment">#        否则无法进行异或操作，这里将字符型转化为整型，#才能彻底变换元素的类型</span></span><br><span class="line">    w_union_str=<span class="string">&#x27;0x&#x27;</span>+<span class="string">&quot;&quot;</span>.join([x[<span class="number">2</span>:].zfill(<span class="number">2</span>) <span class="keyword">for</span> x <span class="keyword">in</span> matrix]) <span class="comment">#将matrix中的元素[&#x27;0x12&#x27;,&#x27;0x34&#x27;]</span></span><br><span class="line">    <span class="comment">#合成为[&#x27;0x1234&#x27;]存入w_union_str,仅举例说明</span></span><br><span class="line">    w_union=np.array([w_union_str]) <span class="comment">#转化为矩阵</span></span><br><span class="line">    w_union_int=np.array([<span class="built_in">int</span>(x,<span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> w_union]) <span class="comment">#将w_union中元素转化为整型,</span></span><br><span class="line">    <span class="comment">#w_union_int=array([907426859], dtype=int32)    </span></span><br><span class="line">    w_union_int=np.bitwise_xor(w_union_int,rcon_matrix[i//<span class="number">4</span> - <span class="number">1</span>]) <span class="comment">#将w_union_int与轮常数异或,</span></span><br><span class="line">    <span class="comment">#w_union_int=array([924204075], dtype=int32)</span></span><br><span class="line">    w_int_hex=np.array([<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(x)[<span class="number">2</span>:].zfill(<span class="number">8</span>) <span class="keyword">for</span> x <span class="keyword">in</span> w_union_int]) <span class="comment">#w_int_hex=array([&#x27;0x37163c2b&#x27;])</span></span><br><span class="line">    w_int_hex=w_int_hex[<span class="number">0</span>][<span class="number">2</span>:] <span class="comment">#w_int_hex=&#x27;37163c2b&#x27;</span></span><br><span class="line">    matrix=np.array([<span class="string">f&#x27;0x<span class="subst">&#123;w_int_hex[j:j+<span class="number">2</span>]&#125;</span>&#x27;</span> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(w_int_hex), <span class="number">2</span>)]) </span><br><span class="line">    <span class="comment">#matrix=array([&#x27;0x37&#x27;, &#x27;0x16&#x27;, &#x27;0x3c&#x27;, &#x27;0x2b&#x27;], dtype=&#x27;&lt;U4&#x27;)</span></span><br><span class="line">    matrix=np.array([<span class="built_in">int</span>(x,<span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> matrix]) <span class="comment">#将matrix中每一位元素用十进制数存放</span></span><br><span class="line">    <span class="keyword">return</span> matrix</span><br><span class="line"></span><br><span class="line"><span class="comment">#轮密钥生成</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">subkey_generation</span>(<span class="params">key</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    密钥长度为128位(16字节),轮数为10</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(key) != <span class="number">16</span>:</span><br><span class="line">        <span class="keyword">raise</span> ValueError(<span class="string">&#x27;Key length should be 128 bits(16 bytes).&#x27;</span>) <span class="comment">#判断密钥长度是否为16字节，128位</span></span><br><span class="line">    key_blocks = [key[i] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>,<span class="built_in">len</span>(key))] <span class="comment">#先将密钥存入列表中</span></span><br><span class="line">    key_schedule = [[<span class="number">0</span>]*<span class="number">4</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>)]  <span class="comment">#初始化密钥初始矩阵</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">            <span class="keyword">if</span> key_blocks[i+j*<span class="number">4</span>].isprintable(): <span class="comment">#将一排十六进制密钥，竖着一列一列存到矩阵中</span></span><br><span class="line">                key_schedule[i][j] = <span class="string">&#x27;0x&#x27;</span> + <span class="built_in">format</span>(<span class="built_in">ord</span>(key_blocks[i+j*<span class="number">4</span>]), <span class="string">&#x27;02x&#x27;</span>) </span><br><span class="line">                <span class="comment">#初始密钥矩阵列表,将每个字节以十六进制形式存放</span></span><br><span class="line">    key_schedule = np.array(key_schedule) <span class="comment">#转化为矩阵</span></span><br><span class="line">    <span class="comment">###########################################################################</span></span><br><span class="line"><span class="comment"># =============================================================================</span></span><br><span class="line"><span class="comment">#     #测试第5-3章-AES.ppt P60例二 密码书 P125页</span></span><br><span class="line"><span class="comment">#     # 十六进制字符串序列</span></span><br><span class="line"><span class="comment">#     key_blocks_ori = [&#x27;2b&#x27;, &#x27;7e&#x27;, &#x27;15&#x27;, &#x27;16&#x27;, &#x27;28&#x27;, &#x27;ae&#x27;, &#x27;d2&#x27;, &#x27;a6&#x27;, &#x27;ab&#x27;, &#x27;f7&#x27;, &#x27;15&#x27;, &#x27;88&#x27;, &#x27;09&#x27;, &#x27;cf&#x27;, &#x27;4f&#x27;, &#x27;3c&#x27;]</span></span><br><span class="line"><span class="comment">#     # 将十六进制字符串转为含有 0x 前缀的十六进制值</span></span><br><span class="line"><span class="comment">#     key_blocks = [&#x27;0x&#x27; + x for x in key_blocks_ori]    </span></span><br><span class="line"><span class="comment">#     # 将其转化为 4x4 矩阵</span></span><br><span class="line"><span class="comment">#     for i in range(4):</span></span><br><span class="line"><span class="comment">#         for j in range(4):</span></span><br><span class="line"><span class="comment">#             if key_blocks[i+j*4].isprintable(): #将一排十六进制密钥，竖着一列一列存到矩阵中</span></span><br><span class="line"><span class="comment">#                 key_schedule[i][j] = key_blocks[i+j*4] #初始密钥矩阵列表,将每个字节以十六进制形式存放</span></span><br><span class="line"><span class="comment">#     key_schedule = np.array(key_schedule) #转化为矩阵</span></span><br><span class="line"><span class="comment"># =============================================================================</span></span><br><span class="line">    <span class="comment">###########################################################################</span></span><br><span class="line">    w=[[<span class="number">0</span>]*<span class="number">4</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">44</span>)] <span class="comment">#初始化存放所有操作完成后的子密钥的列表，基础元素为十六进制数</span></span><br><span class="line">    w[<span class="number">0</span>]=key_schedule[:,<span class="number">0</span>] <span class="comment">#取出初始密钥矩阵的第一列作为w[0] array([&#x27;0x3C&#x27;, &#x27;0xA1&#x27;, &#x27;0x0B&#x27;, &#x27;0x21&#x27;]</span></span><br><span class="line">    w[<span class="number">1</span>]=key_schedule[:,<span class="number">1</span>] <span class="comment">#取出初始密钥矩阵的第二列作为w[1] </span></span><br><span class="line">    w[<span class="number">2</span>]=key_schedule[:,<span class="number">2</span>] <span class="comment">#取出初始密钥矩阵的第三列作为w[2]</span></span><br><span class="line">    w[<span class="number">3</span>]=key_schedule[:,<span class="number">3</span>] <span class="comment">#取出初始密钥矩阵的第一四作为w[3]</span></span><br><span class="line">    rcon_matrix=np.array(constant.Rcon) <span class="comment">#将轮常数列表转化为矩阵</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>,<span class="number">44</span>):   </span><br><span class="line">        <span class="keyword">if</span> i%<span class="number">4</span>!=<span class="number">0</span> : <span class="comment">#i不是4的倍数时</span></span><br><span class="line">            wi1_int=np.array([<span class="built_in">int</span>(x,<span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> w[i-<span class="number">1</span>]])</span><br><span class="line">            wi4_int=np.array([<span class="built_in">int</span>(x,<span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> w[i-<span class="number">4</span>]])</span><br><span class="line">            w[i]=np.bitwise_xor(wi1_int,wi4_int) </span><br><span class="line">            w[i]=np.array([<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(x)[<span class="number">2</span>:].zfill(<span class="number">2</span>) <span class="keyword">for</span> x <span class="keyword">in</span> w[i]]) </span><br><span class="line">            <span class="comment">#将w[i]中的元素转化为16进制存放</span></span><br><span class="line">        <span class="keyword">else</span> : <span class="comment">#i是4的倍数时</span></span><br><span class="line">            wi4_int=np.array([<span class="built_in">int</span>(x,<span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> w[i-<span class="number">4</span>]]) </span><br><span class="line">            <span class="comment">#将w[i-4]中的[&#x27;0x10&#x27;,...,&#x27;0x11&#x27;],转化为整数存放[16,...,17],仅举例说明用</span></span><br><span class="line">            w[i]=np.bitwise_xor(wi4_int,T(w[i-<span class="number">1</span>],i,rcon_matrix)) </span><br><span class="line">            <span class="comment">#将w[i-4]与经过T函数操作过的w[i-1]的对应位进行异或操作得到w[i]，此时w[i]中元素类型为整型</span></span><br><span class="line">            w[i]=np.array([<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(x)[<span class="number">2</span>:].zfill(<span class="number">2</span>) <span class="keyword">for</span> x <span class="keyword">in</span> w[i]]) <span class="comment">#将w[i]中的元素转化为16进制存放</span></span><br><span class="line">    <span class="keyword">return</span> w    <span class="comment">#返回生成的轮密钥</span></span><br><span class="line">  </span><br><span class="line"><span class="comment">#明文转化为矩阵</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">plain_tran</span>(<span class="params">plaintext</span>):</span><br><span class="line">    plain_blocks = [plaintext[i] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>,<span class="built_in">len</span>(plaintext))] <span class="comment">#先将明文存入列表中</span></span><br><span class="line">    plain_schedule = [[<span class="number">0</span>]*<span class="number">4</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>)]  <span class="comment">#初始化明文初始矩阵</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">            <span class="keyword">if</span> plain_blocks[i+j*<span class="number">4</span>].isprintable(): <span class="comment">#将一排十六进制明文，竖着一列一列存到矩阵中</span></span><br><span class="line">                plain_schedule[i][j] = <span class="string">&#x27;0x&#x27;</span> + <span class="built_in">format</span>(<span class="built_in">ord</span>(plain_blocks[i+j*<span class="number">4</span>]), <span class="string">&#x27;02x&#x27;</span>) </span><br><span class="line">                <span class="comment">#初始明文矩阵列表,将每个字节以十六进制形式存放</span></span><br><span class="line">    plain_schedule = np.array(plain_schedule) <span class="comment">#转化为矩阵</span></span><br><span class="line">    <span class="comment">########################################################################### </span></span><br><span class="line"><span class="comment"># =============================================================================</span></span><br><span class="line"><span class="comment">#     #测试 PPT P58 密码书 P127</span></span><br><span class="line"><span class="comment">#     plain_schedule = np.array([[&#x27;0x32&#x27;,&#x27;0x88&#x27;,&#x27;0x31&#x27;,&#x27;0xe0&#x27;],[&#x27;0x43&#x27;,&#x27;0x5a&#x27;,&#x27;0x31&#x27;,&#x27;0x37&#x27;],[&#x27;0xf6&#x27;,&#x27;0x30&#x27;,&#x27;0x98&#x27;,&#x27;0x07&#x27;],[&#x27;0xa8&#x27;,&#x27;0x8d&#x27;,&#x27;0xa2&#x27;,&#x27;0x34&#x27;]])</span></span><br><span class="line"><span class="comment"># =============================================================================</span></span><br><span class="line">    <span class="comment">###########################################################################</span></span><br><span class="line">    <span class="keyword">return</span> plain_schedule</span><br><span class="line"></span><br><span class="line"><span class="comment">#AES加密算法</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">aes_encode</span>(<span class="params">plain_schedule,w</span>):</span><br><span class="line">    tai=[] <span class="comment">#存放tai</span></span><br><span class="line">    tai.append(plain_schedule) <span class="comment">#初始tai为明文十六进制编码的四乘四矩阵</span></span><br><span class="line">    w_array=np.array(w) <span class="comment">#w_array存放矩阵形式的w</span></span><br><span class="line">    subkey_w = [w_array[i:i + <span class="number">4</span>].T <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(w), <span class="number">4</span>)] </span><br><span class="line">    <span class="comment">#subkey_w中存放了初始密钥和十轮子密钥，共十一个密钥，每个密钥是四乘四矩阵形式</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment">#初始轮密钥加变换，就是相应位置的元素进行异或操作</span></span><br><span class="line">    tai0_int=np.array([[<span class="built_in">int</span>(x,<span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> plain_schedule])</span><br><span class="line">    subkey_int0=np.array([[<span class="built_in">int</span>(x,<span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> subkey_w[<span class="number">0</span>]])</span><br><span class="line">    tai.append(np.bitwise_xor(tai0_int,subkey_int0))</span><br><span class="line">    tai[<span class="number">1</span>]=np.array([[<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(x)[<span class="number">2</span>:].zfill(<span class="number">2</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai[<span class="number">1</span>]]) </span><br><span class="line">    <span class="comment">#将tai[i]中的元素转化为16进制存放</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">#开始循环十轮加密</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>):</span><br><span class="line">        <span class="comment">#字节代换-SubBytes</span></span><br><span class="line">        tai.append(subbytes(tai[<span class="built_in">len</span>(tai)-<span class="number">1</span>]))</span><br><span class="line">        <span class="comment">#行移位-ShiftRows</span></span><br><span class="line">        tai_tem_int = [[<span class="built_in">int</span>(x, <span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai[<span class="built_in">len</span>(tai)-<span class="number">1</span>]]</span><br><span class="line">        tai_tem = [row[i:] + row[:i] <span class="keyword">for</span> i, row <span class="keyword">in</span> <span class="built_in">enumerate</span>(tai_tem_int)] </span><br><span class="line">        <span class="comment">#实现从上到下每行左移零位，一位，两位，三位</span></span><br><span class="line">        tai_tem = np.array([[<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(x)[<span class="number">2</span>:].zfill(<span class="number">2</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai_tem])</span><br><span class="line">        tai.append(tai_tem)</span><br><span class="line">        <span class="comment">#列混淆-MixColumns</span></span><br><span class="line">        <span class="keyword">if</span> i!=<span class="number">9</span>:</span><br><span class="line">            tai_tem=np.array(<span class="built_in">list</span>(tai_tem)) </span><br><span class="line">            <span class="comment">#为什么不直接使用tai_tem呢，因为直接使用，会导致tai中append进去的tai_tem也发生变化，</span></span><br><span class="line">            <span class="comment">#所以在此进行拷贝一个副本tai_tem进行操作</span></span><br><span class="line">            tai_tem_int = [[<span class="built_in">int</span>(x, <span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai[<span class="built_in">len</span>(tai)-<span class="number">1</span>]]</span><br><span class="line">            tai_tem_matrix=np.array(tai_tem_int)</span><br><span class="line">            <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">                <span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">                    tai_tem[j][k]=row_cheng_columns(constant.mix_columns_en_matrix[j],<span class="built_in">list</span>(tai_tem_matrix[:,k]) )</span><br><span class="line">            tai_tem = np.array([[<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(<span class="built_in">int</span>(x))[<span class="number">2</span>:].zfill(<span class="number">2</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai_tem])</span><br><span class="line">            tai.append(tai_tem)</span><br><span class="line">        <span class="comment">#轮密钥加</span></span><br><span class="line">        tai_tem_int = [[<span class="built_in">int</span>(x, <span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai[<span class="built_in">len</span>(tai)-<span class="number">1</span>]]</span><br><span class="line">        subkey_int=np.array([[<span class="built_in">int</span>(x,<span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> subkey_w[i+<span class="number">1</span>]])</span><br><span class="line">        tai_tem=np.bitwise_xor(tai_tem_int,subkey_int)</span><br><span class="line">        tai_tem=np.array([[<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(x)[<span class="number">2</span>:].zfill(<span class="number">2</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai_tem])</span><br><span class="line">        tai.append(tai_tem)</span><br><span class="line">    </span><br><span class="line">    <span class="comment">#加密结果为ciphertext</span></span><br><span class="line">    ciphertext_matrix=tai[<span class="built_in">len</span>(tai)-<span class="number">1</span>].T</span><br><span class="line">    ciphertext=<span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="keyword">for</span> i  <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">            ciphertext+=<span class="built_in">str</span>(ciphertext_matrix[i][j][<span class="number">2</span>:])</span><br><span class="line">    <span class="keyword">return</span> ciphertext</span><br><span class="line">    </span><br><span class="line"><span class="comment">#列混淆常数矩阵乘以tai 实现 行列表[0x01,0x02,0x03,0x04]×列列表[0x3a,0x32,0x12,0x44]在GF(2**8)域上的运算，</span></span><br><span class="line"><span class="comment">#通过查对数表,反对数表</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">row_cheng_columns</span>(<span class="params">row,column</span>):</span><br><span class="line">    a=[]</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">        <span class="comment"># 如果当前元素为 0x00，直接跳过</span></span><br><span class="line">        <span class="keyword">if</span> row[i] == <span class="number">0x00</span> <span class="keyword">or</span> column[i] == <span class="number">0x00</span>: </span><br><span class="line">            <span class="comment">#此种特殊情况为：aes解密时，若出现查对数表0行0列的特殊情况时，直接将该乘积结果赋为0</span></span><br><span class="line">            a.append(<span class="number">0x00</span>)</span><br><span class="line">            <span class="keyword">continue</span></span><br><span class="line">        log_row_row_num=row[i]//<span class="number">16</span> </span><br><span class="line">        log_row_column_num=row[i]%<span class="number">16</span> </span><br><span class="line">        log_column_row_num=column[i]//<span class="number">16</span> </span><br><span class="line">        log_column_column_num=column[i]%<span class="number">16</span></span><br><span class="line">        tem=(constant.Log_table[log_row_row_num][log_row_column_num]+constant.Log_table[log_column_row_num][log_column_column_num])</span><br><span class="line">        <span class="keyword">if</span> tem&gt;<span class="number">255</span>: </span><br><span class="line">            <span class="comment">#此种特殊情况为，当查反对数表时出现行列值大于15的特殊情况，大于了GF(2**8),</span></span><br><span class="line">            <span class="comment">#需要 -255 或者 %255 再进行查反对数表</span></span><br><span class="line">            tem=tem%<span class="number">255</span></span><br><span class="line">        result_row=tem//<span class="number">16</span> </span><br><span class="line">        result_column=tem%<span class="number">16</span> </span><br><span class="line">        tem=constant.Antilog_table[result_row][result_column]</span><br><span class="line">        a.append(tem)</span><br><span class="line">    result=<span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> num <span class="keyword">in</span> a:</span><br><span class="line">        result^=num</span><br><span class="line">    <span class="keyword">return</span> result</span><br><span class="line"></span><br><span class="line"><span class="comment">#密文转化为矩阵</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">cipher_tran</span>(<span class="params">ciphertext</span>):</span><br><span class="line">    cipher_schedule=[[<span class="number">0</span>]*<span class="number">4</span> <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>)]</span><br><span class="line">    cipher_list=[ciphertext[i:i+<span class="number">2</span>] <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>,<span class="built_in">len</span>(ciphertext),<span class="number">2</span>)]</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">            cipher_schedule[i][j]=<span class="string">&#x27;0x&#x27;</span>+cipher_list[i+j*<span class="number">4</span>]</span><br><span class="line">    cipher_schedule=np.array(cipher_schedule)</span><br><span class="line">    <span class="keyword">return</span> cipher_schedule</span><br><span class="line"></span><br><span class="line"><span class="comment">#解密算法</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">aes_decode</span>(<span class="params">cipher_schedule,w</span>):</span><br><span class="line">    tai=[] <span class="comment">#存放tai</span></span><br><span class="line">    tai.append(cipher_schedule) <span class="comment">#初始tai为密文十六进制编码的四乘四矩阵</span></span><br><span class="line">    w_array=np.array(w) <span class="comment">#w_array存放矩阵形式的w</span></span><br><span class="line">    subkey_w = [w_array[i:i + <span class="number">4</span>].T <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(w), <span class="number">4</span>)] </span><br><span class="line">    <span class="comment">#subkey_w中存放了初始密钥和十轮子密钥，共十一个密钥，每个密钥是四乘四矩阵形式    </span></span><br><span class="line">    subkey_w = subkey_w[::-<span class="number">1</span>] <span class="comment">#将十一个密钥倒序排放，用于解密</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment">#初始轮密钥加变换，就是相应位置的元素进行异或操作</span></span><br><span class="line">    tai0_int=np.array([[<span class="built_in">int</span>(x,<span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai[<span class="number">0</span>]])</span><br><span class="line">    subkey_int10=np.array([[<span class="built_in">int</span>(x,<span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> subkey_w[<span class="number">0</span>]])</span><br><span class="line">    tai.append(np.bitwise_xor(tai0_int,subkey_int10))</span><br><span class="line">    tai[<span class="number">1</span>]=np.array([[<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(x)[<span class="number">2</span>:].zfill(<span class="number">2</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai[<span class="number">1</span>]]) </span><br><span class="line">    <span class="comment">#将tai[i]中的元素转化为16进制存放</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment">#开始循环十轮解密</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">10</span>):</span><br><span class="line">        <span class="comment">#逆行移位-InvShiftRows</span></span><br><span class="line">        tai_tem_int = [[<span class="built_in">int</span>(x, <span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai[<span class="built_in">len</span>(tai)-<span class="number">1</span>]]</span><br><span class="line">        tai_tem = [row[-i:] + row[:-i] <span class="keyword">for</span> i, row <span class="keyword">in</span> <span class="built_in">enumerate</span>(tai_tem_int)]   </span><br><span class="line">        <span class="comment">#实现从上到下每行右移零位，一位，两位，三位</span></span><br><span class="line">        tai_tem = np.array([[<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(x)[<span class="number">2</span>:].zfill(<span class="number">2</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai_tem])</span><br><span class="line">        tai.append(tai_tem)</span><br><span class="line">        <span class="comment">#逆字节代换-InvSubBytes</span></span><br><span class="line">        tai.append(invsubbytes(tai[<span class="built_in">len</span>(tai)-<span class="number">1</span>]))</span><br><span class="line">        <span class="comment">#轮密钥加</span></span><br><span class="line">        tai_tem_int = [[<span class="built_in">int</span>(x, <span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai[<span class="built_in">len</span>(tai)-<span class="number">1</span>]]</span><br><span class="line">        subkey_int=np.array([[<span class="built_in">int</span>(x,<span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> subkey_w[i+<span class="number">1</span>]])</span><br><span class="line">        tai_tem=np.bitwise_xor(tai_tem_int,subkey_int)</span><br><span class="line">        tai_tem=np.array([[<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(x)[<span class="number">2</span>:].zfill(<span class="number">2</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai_tem])</span><br><span class="line">        tai.append(tai_tem)</span><br><span class="line">        </span><br><span class="line">        <span class="comment">#逆列混淆-InvMixColumns</span></span><br><span class="line">        <span class="keyword">if</span> i!=<span class="number">9</span>:</span><br><span class="line">            tai_tem=np.array(<span class="built_in">list</span>(tai_tem)) <span class="comment">#为什么不直接使用tai_tem呢，因为直接使用，</span></span><br><span class="line">            <span class="comment">#会导致tai中append进去的tai_tem也发生变化，所以在此进行拷贝一个副本tai_tem进行操作</span></span><br><span class="line">            tai_tem_int = [[<span class="built_in">int</span>(x, <span class="number">16</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai[<span class="built_in">len</span>(tai)-<span class="number">1</span>]]</span><br><span class="line">            tai_tem_matrix=np.array(tai_tem_int)</span><br><span class="line">            <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">                <span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">                    tai_tem[j][k]=row_cheng_columns(constant.mix_columns_de_matrix[j],<span class="built_in">list</span>(tai_tem_matrix[:,k]) )</span><br><span class="line">            tai_tem = np.array([[<span class="string">&#x27;0x&#x27;</span>+<span class="built_in">hex</span>(<span class="built_in">int</span>(x))[<span class="number">2</span>:].zfill(<span class="number">2</span>) <span class="keyword">for</span> x <span class="keyword">in</span> row] <span class="keyword">for</span> row <span class="keyword">in</span> tai_tem])</span><br><span class="line">            tai.append(tai_tem)</span><br><span class="line">        </span><br><span class="line">    <span class="comment">#加密结果为plaintext</span></span><br><span class="line">    plaintext_matrix=tai[<span class="built_in">len</span>(tai)-<span class="number">1</span>].T</span><br><span class="line">    plaintext=<span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="keyword">for</span> i  <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">        <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">4</span>):</span><br><span class="line">            plaintext+=<span class="built_in">chr</span>(<span class="built_in">int</span>(plaintext_matrix[i][j],<span class="number">16</span>))</span><br><span class="line">    <span class="keyword">return</span> plaintext</span><br><span class="line"></span><br><span class="line"><span class="comment">#主程序</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;==================== AES 加密与解密 ====================&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;[1] 加密&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;[2] 解密&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;[0] 退出&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;====================================================&quot;</span>)</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            choice = <span class="built_in">int</span>(<span class="built_in">input</span>(<span class="string">&quot;请输入操作选项 (0, 1 或 2): &quot;</span>))</span><br><span class="line">            <span class="keyword">if</span> choice == <span class="number">0</span>:</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;\n\n程序已退出。感谢使用 AES 加解密工具！&quot;</span>)</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            <span class="keyword">elif</span> choice == <span class="number">1</span>:</span><br><span class="line">                <span class="comment"># 加密流程</span></span><br><span class="line">                plaintext = <span class="built_in">input</span>(<span class="string">&quot;请输入明文 (UTF-8 编码，16 个字符): &quot;</span>)</span><br><span class="line">                plain_schedule=plain_tran(plaintext)</span><br><span class="line">                key = <span class="built_in">input</span>(<span class="string">&quot;请输入密钥 (UTF-8 编码，16 个字符): &quot;</span>)</span><br><span class="line">                w=subkey_generation(key) <span class="comment">#w存入轮密钥w[0]-w[3],用来对明文进行初始的轮密钥加变化，</span></span><br><span class="line">                <span class="comment">#w[4]-w[7]作为第一轮子密钥，一共十轮，第十轮子密钥为w[40]-w[43]</span></span><br><span class="line">                <span class="keyword">if</span> <span class="keyword">not</span> plaintext <span class="keyword">or</span> <span class="keyword">not</span> key:</span><br><span class="line">                    <span class="keyword">raise</span> ValueError(<span class="string">&quot;明文和密钥均不能为空！&quot;</span>)</span><br><span class="line">                ciphertext = aes_encode(plain_schedule, w)</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;\n加密结果 (十六进制):&quot;</span>)</span><br><span class="line">                <span class="built_in">print</span>(ciphertext)</span><br><span class="line">            <span class="keyword">elif</span> choice == <span class="number">2</span>:</span><br><span class="line">                <span class="comment"># 解密流程</span></span><br><span class="line">                ciphertext = <span class="built_in">input</span>(<span class="string">&quot;请输入密文 (连续的十六进制): &quot;</span>)</span><br><span class="line">                cipher_schedule=cipher_tran(ciphertext)</span><br><span class="line">                key = <span class="built_in">input</span>(<span class="string">&quot;请输入密钥 (UTF-8 编码，16 个字符): &quot;</span>)</span><br><span class="line">                w=subkey_generation(key) <span class="comment">#w存入轮密钥w[0]-w[3],用来对明文进行初始的轮密钥加变化，</span></span><br><span class="line">                <span class="comment">#w[4]-w[7]作为第一轮子密钥，一共十轮，第十轮子密钥为w[40]-w[43]</span></span><br><span class="line">                <span class="keyword">if</span> <span class="keyword">not</span> ciphertext <span class="keyword">or</span> <span class="keyword">not</span> key:</span><br><span class="line">                    <span class="keyword">raise</span> ValueError(<span class="string">&quot;密文和密钥均不能为空！&quot;</span>)</span><br><span class="line">                plaintext = aes_decode(cipher_schedule, w)</span><br><span class="line">                <span class="built_in">print</span>(<span class="string">&quot;\n解密结果 (UTF-8 编码):&quot;</span>)</span><br><span class="line">                <span class="built_in">print</span>(plaintext)</span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                <span class="keyword">raise</span> ValueError(<span class="string">&quot;无效选项&quot;</span>)</span><br><span class="line">    </span><br><span class="line">        <span class="keyword">except</span> ValueError <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;输入错误: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;发生错误: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">AES加密算法是一种对称加密算法，本文将详细介绍AES基本知识及python实现。</summary>
    
    
    
    <category term="密码学" scheme="https://www.chaincipher.cn/categories/%E5%AF%86%E7%A0%81%E5%AD%A6/"/>
    
    <category term="AES" scheme="https://www.chaincipher.cn/categories/%E5%AF%86%E7%A0%81%E5%AD%A6/AES/"/>
    
    
    <category term="AES" scheme="https://www.chaincipher.cn/tags/AES/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://www.chaincipher.cn/posts/82084c25.html"/>
    <id>https://www.chaincipher.cn/posts/82084c25.html</id>
    <published>2024-11-13T12:36:59.000Z</published>
    <updated>2025-06-03T10:18:37.338Z</updated>
    
    <content type="html"><![CDATA[<p>博客搭建过程。</p><h1 id="博客搭建"><a href="#博客搭建" class="headerlink" title="博客搭建"></a>博客搭建</h1><p>基于hexo和butterfly主题搭建的博客。</p><p><a href="https://blog.csdn.net/qq_74035288/article/details/143231824?fromshare=blogdetail&sharetype=blogdetail&sharerId=143231824&sharerefer=PC&sharesource=qq_74035288&sharefrom=from_link">详见我的csdn博客</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;博客搭建过程。&lt;/p&gt;
&lt;h1 id=&quot;博客搭建&quot;&gt;&lt;a href=&quot;#博客搭建&quot; class=&quot;headerlink&quot; title=&quot;博客搭建&quot;&gt;&lt;/a&gt;博客搭建&lt;/h1&gt;&lt;p&gt;基于hexo和butterfly主题搭建的博客。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https:</summary>
      
    
    
    
    <category term="博客搭建" scheme="https://www.chaincipher.cn/categories/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
    
    
  </entry>
  
</feed>
