教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 MD5加密算法Golang实现

MD5加密算法Golang实现

发布时间:2022-02-19   编辑:jiaochengji.com
教程集为您提供MD5加密算法Golang实现等资源,欢迎您收藏本站,我们将为您提供最新的MD5加密算法Golang实现资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><h2>什么是MD5?</h2>

MD5消息摘要算法(Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用于确保信息传输完整一致。MD5有MD4、MD3、MD2改进而来,主要增强算法复杂度和不可逆性。MD5广泛使用在为文件传输提供一定的可靠性方面。例如:服务器预先提供一个MD5校验和,用户下载完文件之后,用MD5算法计算下载文件的MD5校验和,然后通过检查这两个检验和是否一致,就能判断下载的文件是否出错。

<h2>
MD5算法介绍</h2>

MD5算法处理不定长的输入信息,得到定长的128位输出。MD5将输入信息以512位进行分组,且每一分组又被划分为16个32位子分组,经过一系列处理之后算法的输出得到4个32位的输出,将此四个输出拼接起来就可以获得最终的加密结果。

下面介绍算法的主要步骤:

<ul><li>第一步:填充(padding) <ul><li>首先将输入信息用二进制串来表示,其长度设为<code>k</code> bits,如果二进制串长度<code>k mod 512!=448</code>,则在该二进制串最后面补充<code>p</code> bits的标识,100…0(一个1和多个0),1≤p≤512,使得填充后的消息位数满足:<span class="katex--inline"><span class="katex"><span class="katex-mathml"> k p ≡ 448 ( m o d 512 ) k p ≡ 448(mod 512) </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.77777em; vertical-align: -0.08333em;"/><span class="mord mathit" style="margin-right: 0.03148em;">k</span><span class="mspace" style="margin-right: 0.222222em;"/><span class="mbin"> </span><span class="mspace" style="margin-right: 0.222222em;"/></span><span class="base"><span class="strut" style="height: 0.65819em; vertical-align: -0.19444em;"/><span class="mord mathit">p</span><span class="mspace" style="margin-right: 0.277778em;"/><span class="mrel">≡</span><span class="mspace" style="margin-right: 0.277778em;"/></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"/><span class="mord">4</span><span class="mord">4</span><span class="mord">8</span><span class="mopen">(</span><span class="mord mathit">m</span><span class="mord mathit">o</span><span class="mord mathit">d</span><span class="mord">5</span><span class="mord">1</span><span class="mord">2</span><span class="mclose">)</span></span></span></span></span></li><li>然后,再向上述填充好的消息尾部附加<code>k</code>值二进制串表示的低64位(即<span class="katex--inline"><span class="katex"><span class="katex-mathml"> k m o d 2 64 k mod 2^{64} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.814108em; vertical-align: 0em;"/><span class="mord mathit" style="margin-right: 0.03148em;">k</span><span class="mord mathit">m</span><span class="mord mathit">o</span><span class="mord mathit">d</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.814108em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span><span class="mord mtight">4</span></span></span></span></span></span></span></span></span></span></span></span></span> ),由于MD5加密算法采用小端模式(little-endian),所以将此64位二进制串的最后一个字节放置在最前方,倒数第二个字节放置在第二个自接触,……,第一个字节放置在最后方,最终处理过后的信息长度为512的整数倍。</li></ul></li><li>第二步:分块
把填充后的消息结果分割为<code>L</code>个512-bit分组:<span class="katex--inline"><span class="katex"><span class="katex-mathml"> Y 0 Y_0 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.83333em; vertical-align: -0.15em;"/><span class="mord"><span class="mord mathit" style="margin-right: 0.22222em;">Y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.22222em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""/></span></span></span></span></span></span></span></span></span>,<span class="katex--inline"><span class="katex"><span class="katex-mathml"> Y 1 Y_1 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.83333em; vertical-align: -0.15em;"/><span class="mord"><span class="mord mathit" style="margin-right: 0.22222em;">Y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.22222em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""/></span></span></span></span></span></span></span></span></span>,…,<span class="katex--inline"><span class="katex"><span class="katex-mathml"> Y L − 1 Y_{L-1} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.891661em; vertical-align: -0.208331em;"/><span class="mord"><span class="mord mathit" style="margin-right: 0.22222em;">Y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.328331em;"><span class="" style="top: -2.55em; margin-left: -0.22222em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathit mtight">L</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.208331em;"><span class=""/></span></span></span></span></span></span></span></span></span>。然后再将每个分组继续划分为16个32-bit长的子分组<span class="katex--inline"><span class="katex"><span class="katex-mathml"> X 0 X_0 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.83333em; vertical-align: -0.15em;"/><span class="mord"><span class="mord mathit" style="margin-right: 0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.07847em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""/></span></span></span></span></span></span></span></span></span>,<span class="katex--inline"><span class="katex"><span class="katex-mathml"> X 1 X_1 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.83333em; vertical-align: -0.15em;"/><span class="mord"><span class="mord mathit" style="margin-right: 0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.07847em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""/></span></span></span></span></span></span></span></span></span>,…,<span class="katex--inline"><span class="katex"><span class="katex-mathml"> X 15 X_{15} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.83333em; vertical-align: -0.15em;"/><span class="mord"><span class="mord mathit" style="margin-right: 0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.07847em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""/></span></span></span></span></span></span></span></span></span></li><li>第三步:初始化
初始化一个128-bit的MD缓冲区,记为<span class="katex--inline"><span class="katex"><span class="katex-mathml"> C V q CV_q </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.969438em; vertical-align: -0.286108em;"/><span class="mord mathit" style="margin-right: 0.07153em;">C</span><span class="mord"><span class="mord mathit" style="margin-right: 0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.151392em;"><span class="" style="top: -2.55em; margin-left: -0.22222em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mathit mtight" style="margin-right: 0.03588em;">q</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""/></span></span></span></span></span></span></span></span></span>,表示成4个32-bit寄存器(A,B,C,D);其中,<span class="katex--inline"><span class="katex"><span class="katex-mathml"> C V 0 = I V CV_0=IV </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.83333em; vertical-align: -0.15em;"/><span class="mord mathit" style="margin-right: 0.07153em;">C</span><span class="mord"><span class="mord mathit" style="margin-right: 0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.22222em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""/></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"/><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"/></span><span class="base"><span class="strut" style="height: 0.68333em; vertical-align: 0em;"/><span class="mord mathit" style="margin-right: 0.07847em;">I</span><span class="mord mathit" style="margin-right: 0.22222em;">V</span></span></span></span></span>。迭代在MD缓冲区进行,最后一步的128-bit输出结果结尾算法结果。寄存器(A,B,C,D)置16进制初初始值作为初始向量IV,并采用小端存储(little-endian)的存储结构:</li></ul><pre><code class="lang-bash hljs"> A <span class="token operator">=</span> 0x67452301 B <span class="token operator">=</span> 0xEFCDAB89 C <span class="token operator">=</span> 0x98BADCFE D <span class="token operator">=</span> 0x10325476 </code></pre> <table><thead><tr><th>wordA</th><th>01</th><th>23</th><th>45</th><th>67</th></tr></thead><tbody><tr><td>workB</td><td>89</td><td>AB</td><td>CD</td><td>EF</td></tr><tr><td>wordC</td><td>FE</td><td>DC</td><td>BA</td><td>09</td></tr><tr><td>wordD</td><td>76</td><td>54</td><td>32</td><td>10</td></tr></tbody></table><blockquote>

Little-Endian
将低位字节排放在内存的低地址端,高位字节排放在内存的高地址端,相反Big-Endian将高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。存储结构与CPU体系结构和语言编译器有关。PowerPC系列采用Big Endian方式存储数据,而Intel x86系列则采用Little-Endian方式存储。

</blockquote> <ul><li>

第四步:总控流程
以512-bit消息分组为单位,每一份组<span class="katex--inline"><span class="katex"><span class="katex-mathml"> Y q ( q = 0 , 1 , . . . L − 1 ) Y_q(q=0,1,...L-1) </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1.03611em; vertical-align: -0.286108em;"/><span class="mord"><span class="mord mathit" style="margin-right: 0.22222em;">Y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.151392em;"><span class="" style="top: -2.55em; margin-left: -0.22222em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mathit mtight" style="margin-right: 0.03588em;">q</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""/></span></span></span></span></span><span class="mopen">(</span><span class="mord mathit" style="margin-right: 0.03588em;">q</span><span class="mspace" style="margin-right: 0.277778em;"/><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"/></span><span class="base"><span class="strut" style="height: 0.87777em; vertical-align: -0.19444em;"/><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"/><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"/><span class="mord">.</span><span class="mord">.</span><span class="mord">.</span><span class="mord mathit">L</span><span class="mspace" style="margin-right: 0.222222em;"/><span class="mbin">−</span><span class="mspace" style="margin-right: 0.222222em;"/></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"/><span class="mord">1</span><span class="mclose">)</span></span></span></span></span>经过四轮循环压缩算法,表示为:
<span class="katex--inline"><span class="katex"><span class="katex-mathml"> C V 0 = I V CV_0 = IV </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.83333em; vertical-align: -0.15em;"/><span class="mord mathit" style="margin-right: 0.07153em;">C</span><span class="mord"><span class="mord mathit" style="margin-right: 0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: -0.22222em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""/></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"/><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"/></span><span class="base"><span class="strut" style="height: 0.68333em; vertical-align: 0em;"/><span class="mord mathit" style="margin-right: 0.07847em;">I</span><span class="mord mathit" style="margin-right: 0.22222em;">V</span></span></span></span></span>
<span class="katex--inline"><span class="katex"><span class="katex-mathml"> C V i = H M D 5 ( C V i − 1 , Y i ) CV_i = H_{MD5}(CV_{i-1}, Y_i) </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.83333em; vertical-align: -0.15em;"/><span class="mord mathit" style="margin-right: 0.07153em;">C</span><span class="mord"><span class="mord mathit" style="margin-right: 0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: -0.22222em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mathit mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""/></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"/><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"/></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"/><span class="mord"><span class="mord mathit" style="margin-right: 0.08125em;">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.328331em;"><span class="" style="top: -2.55em; margin-left: -0.08125em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathit mtight" style="margin-right: 0.10903em;">M</span><span class="mord mathit mtight" style="margin-right: 0.02778em;">D</span><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""/></span></span></span></span></span><span class="mopen">(</span><span class="mord mathit" style="margin-right: 0.07153em;">C</span><span class="mord"><span class="mord mathit" style="margin-right: 0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: -0.22222em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathit mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.208331em;"><span class=""/></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"/><span class="mord"><span class="mord mathit" style="margin-right: 0.22222em;">Y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: -0.22222em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mathit mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""/></span></span></span></span></span><span class="mclose">)</span></span></span></span></span>
输出结果:<span class="katex--inline"><span class="katex"><span class="katex-mathml"> M D = C V L MD = CV_L </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.68333em; vertical-align: 0em;"/><span class="mord mathit" style="margin-right: 0.10903em;">M</span><span class="mord mathit" style="margin-right: 0.02778em;">D</span><span class="mspace" style="margin-right: 0.277778em;"/><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"/></span><span class="base"><span class="strut" style="height: 0.83333em; vertical-align: -0.15em;"/><span class="mord mathit" style="margin-right: 0.07153em;">C</span><span class="mord"><span class="mord mathit" style="margin-right: 0.22222em;">V</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.328331em;"><span class="" style="top: -2.55em; margin-left: -0.22222em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mathit mtight">L</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""/></span></span></span></span></span></span></span></span></span>

</li><li>

第五步:MD5压缩函数<span class="katex--inline"><span class="katex"><span class="katex-mathml"> H M D 5 H_{MD5} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.83333em; vertical-align: -0.15em;"/><span class="mord"><span class="mord mathit" style="margin-right: 0.08125em;">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.328331em;"><span class="" style="top: -2.55em; margin-left: -0.08125em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathit mtight" style="margin-right: 0.10903em;">M</span><span class="mord mathit mtight" style="margin-right: 0.02778em;">D</span><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""/></span></span></span></span></span></span></span></span></span>

<ul><li><span class="katex--inline"><span class="katex"><span class="katex-mathml"> H M D 5 H_{MD5} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.83333em; vertical-align: -0.15em;"/><span class="mord"><span class="mord mathit" style="margin-right: 0.08125em;">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.328331em;"><span class="" style="top: -2.55em; margin-left: -0.08125em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathit mtight" style="margin-right: 0.10903em;">M</span><span class="mord mathit mtight" style="margin-right: 0.02778em;">D</span><span class="mord mtight">5</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""/></span></span></span></span></span></span></span></span></span>从<span class="katex--inline"><span class="katex"><span class="katex-mathml"> C V CV </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.68333em; vertical-align: 0em;"/><span class="mord mathit" style="margin-right: 0.07153em;">C</span><span class="mord mathit" style="margin-right: 0.22222em;">V</span></span></span></span></span>输入128位,从消息分组输入512位,完成4轮循环后,输出128位,用于下一轮输入的<span class="katex--inline"><span class="katex"><span class="katex-mathml"> C V CV </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.68333em; vertical-align: 0em;"/><span class="mord mathit" style="margin-right: 0.07153em;">C</span><span class="mord mathit" style="margin-right: 0.22222em;">V</span></span></span></span></span>值。</li><li>四轮循环中使用的生成函数轮函数是一个32位非线性逻辑函数(F,G,H,I中的一个)</li><li>每轮循环分别为不同的生成函数(F,G,H,I),结果指定的<code>T</code>表示元素<code>T[]</code>和和消息分组的不同部分<code>X[]</code>做16次迭代运算,生成下一轮循环的输入。</li><li>四轮循环总共有64次迭代运算。</li></ul></li><li>

说明:

</li></ul>

迭代运算如下:

<pre><code class="lang-go hljs">dtemp <span class="token operator">:=</span> d d <span class="token operator">=</span> c c <span class="token operator">=</span> b b <span class="token operator">=</span> b <span class="token operator"> </span> <span class="token punctuation">(</span><span class="token punctuation">(</span>a<span class="token operator"> </span>轮函数<span class="token punctuation">(</span>b<span class="token punctuation">,</span>c<span class="token punctuation">,</span>d<span class="token punctuation">)</span><span class="token operator"> </span>X<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token operator"> </span>T<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><<</span><span class="token operator"><</span> s<span class="token punctuation">)</span><span class="token punctuation">)</span> a <span class="token operator">=</span> dtemp </code></pre>

轮函数定义如下:

<table><thead><tr><th>轮次</th><th>Function g</th><th>g(b,c,d)</th></tr></thead><tbody><tr><td>1</td><td>F(b,c,d)</td><td>(b & c) | (~b & d)</td></tr><tr><td>2</td><td>G(b,c,d)</td><td>(b & d) | (c & ~d)</td></tr><tr><td>3</td><td>H[b,c,d)</td><td>(b ^ c ^ d)</td></tr><tr><td>4</td><td>I(b,c,d)</td><td>c ^ (b | ~d)</td></tr></tbody></table>

<code>a,b,c,d</code>:MD缓冲区(A,B,C,D)的当前值;
<code>X[k]</code>:当前处理消息分组的16个子分组;
<code>T[i]</code>:T表的第i个元素,32位字;T表总共有64个元素,也称为加法常数
<code><<<s</code>:将32位输入循环左移s位
<code> </code> : 模<span class="katex--inline"><span class="katex"><span class="katex-mathml"> 2 32 2^{32} </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.814108em; vertical-align: 0em;"/><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.814108em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span></span>加法。

其中<code>X[k]</code>具体如下:
4轮循环中,第i次迭代(i=0…63)使用的<code>X[k]</code>的确定;

<ul><li>第一轮循环:k = i (0~15)
顺序使用X[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15]</li><li>第二轮循环:k=(1 5i) mod 16 (16~31)
顺序使用X[1, 6,11, 0, 5,10,15, 4, 9,14, 3, 8,13, 2, 7,12]</li><li>第三轮循环:k=(5 3i) mod 16(32~47)
顺序使用X[5, 8,11,14, 1, 4, 7,10,13, 0, 3, 6, 9,12,15, 2]</li><li>第四轮循环:k=7i mod 16(48~63)
顺序使用X[0, 7,14, 5,12, 3,10, 1, 8,15, 6,13, 4,11, 2, 9]</li></ul>

<code>T</code>表定义如下:
<span class="katex--inline"><span class="katex"><span class="katex-mathml"> T [ i ] = i n t ( 2 32 ∗ ∣ s i n ( i ) ∣ ) T[i] = int(2^{32}*|sin(i)|) </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"/><span class="mord mathit" style="margin-right: 0.13889em;">T</span><span class="mopen">[</span><span class="mord mathit">i</span><span class="mclose">]</span><span class="mspace" style="margin-right: 0.277778em;"/><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"/></span><span class="base"><span class="strut" style="height: 1.06411em; vertical-align: -0.25em;"/><span class="mord mathit">i</span><span class="mord mathit">n</span><span class="mord mathit">t</span><span class="mopen">(</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.814108em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"/><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"/><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"/></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"/><span class="mord">∣</span><span class="mord mathit">s</span><span class="mord mathit">i</span><span class="mord mathit">n</span><span class="mopen">(</span><span class="mord mathit">i</span><span class="mclose">)</span><span class="mord">∣</span><span class="mclose">)</span></span></span></span></span>
int 取整函数,sin 正弦函数,以 i 作为弧度输入。
各次迭代运算采用的T值:

<pre><code class="lang-go hljs"><span class="token keyword">var</span> T <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">uint32</span><span class="token punctuation">{</span> <span class="token number">0xd76aa478</span><span class="token punctuation">,</span> <span class="token number">0xe8c7b756</span><span class="token punctuation">,</span> <span class="token number">0x242070db</span><span class="token punctuation">,</span> <span class="token number">0xc1bdceee</span><span class="token punctuation">,</span> <span class="token number">0xf57c0faf</span><span class="token punctuation">,</span> <span class="token number">0x4787c62a</span><span class="token punctuation">,</span> <span class="token number">0xa8304613</span><span class="token punctuation">,</span> <span class="token number">0xfd469501</span><span class="token punctuation">,</span> <span class="token number">0x698098d8</span><span class="token punctuation">,</span> <span class="token number">0x8b44f7af</span><span class="token punctuation">,</span> <span class="token number">0xffff5bb1</span><span class="token punctuation">,</span> <span class="token number">0x895cd7be</span><span class="token punctuation">,</span> <span class="token number">0x6b901122</span><span class="token punctuation">,</span> <span class="token number">0xfd987193</span><span class="token punctuation">,</span> <span class="token number">0xa679438e</span><span class="token punctuation">,</span> <span class="token number">0x49b40821</span><span class="token punctuation">,</span> <span class="token number">0xf61e2562</span><span class="token punctuation">,</span> <span class="token number">0xc040b340</span><span class="token punctuation">,</span> <span class="token number">0x265e5a51</span><span class="token punctuation">,</span> <span class="token number">0xe9b6c7aa</span><span class="token punctuation">,</span> <span class="token number">0xd62f105d</span><span class="token punctuation">,</span> <span class="token number">0x02441453</span><span class="token punctuation">,</span> <span class="token number">0xd8a1e681</span><span class="token punctuation">,</span> <span class="token number">0xe7d3fbc8</span><span class="token punctuation">,</span> <span class="token number">0x21e1cde6</span><span class="token punctuation">,</span> <span class="token number">0xc33707d6</span><span class="token punctuation">,</span> <span class="token number">0xf4d50d87</span><span class="token punctuation">,</span> <span class="token number">0x455a14ed</span><span class="token punctuation">,</span> <span class="token number">0xa9e3e905</span><span class="token punctuation">,</span> <span class="token number">0xfcefa3f8</span><span class="token punctuation">,</span> <span class="token number">0x676f02d9</span><span class="token punctuation">,</span> <span class="token number">0x8d2a4c8a</span><span class="token punctuation">,</span> <span class="token number">0xfffa3942</span><span class="token punctuation">,</span> <span class="token number">0x8771f681</span><span class="token punctuation">,</span> <span class="token number">0x6d9d6122</span><span class="token punctuation">,</span> <span class="token number">0xfde5380c</span><span class="token punctuation">,</span> <span class="token number">0xa4beea44</span><span class="token punctuation">,</span> <span class="token number">0x4bdecfa9</span><span class="token punctuation">,</span> <span class="token number">0xf6bb4b60</span><span class="token punctuation">,</span> <span class="token number">0xbebfbc70</span><span class="token punctuation">,</span> <span class="token number">0x289b7ec6</span><span class="token punctuation">,</span> <span class="token number">0xeaa127fa</span><span class="token punctuation">,</span> <span class="token number">0xd4ef3085</span><span class="token punctuation">,</span> <span class="token number">0x04881d05</span><span class="token punctuation">,</span> <span class="token number">0xd9d4d039</span><span class="token punctuation">,</span> <span class="token number">0xe6db99e5</span><span class="token punctuation">,</span> <span class="token number">0x1fa27cf8</span><span class="token punctuation">,</span> <span class="token number">0xc4ac5665</span><span class="token punctuation">,</span> <span class="token number">0xf4292244</span><span class="token punctuation">,</span> <span class="token number">0x432aff97</span><span class="token punctuation">,</span> <span class="token number">0xab9423a7</span><span class="token punctuation">,</span> <span class="token number">0xfc93a039</span><span class="token punctuation">,</span> <span class="token number">0x655b59c3</span><span class="token punctuation">,</span> <span class="token number">0x8f0ccc92</span><span class="token punctuation">,</span> <span class="token number">0xffeff47d</span><span class="token punctuation">,</span> <span class="token number">0x85845dd1</span><span class="token punctuation">,</span> <span class="token number">0x6fa87e4f</span><span class="token punctuation">,</span> <span class="token number">0xfe2ce6e0</span><span class="token punctuation">,</span> <span class="token number">0xa3014314</span><span class="token punctuation">,</span> <span class="token number">0x4e0811a1</span><span class="token punctuation">,</span> <span class="token number">0xf7537e82</span><span class="token punctuation">,</span> <span class="token number">0xbd3af235</span><span class="token punctuation">,</span> <span class="token number">0x2ad7d2bb</span><span class="token punctuation">,</span> <span class="token number">0xeb86d391</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> </code></pre>

各次迭代运算采用的做循环移位s的值:

<pre><code class="lang-go hljs"><span class="token comment">// 向左位移数</span> <span class="token keyword">var</span> s <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">uint32</span><span class="token punctuation">{</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">22</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">22</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">22</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">22</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">14</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">14</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">14</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">14</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">,</span> <span class="token number">23</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">,</span> <span class="token number">23</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">,</span> <span class="token number">23</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">,</span> <span class="token number">23</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">,</span> <span class="token number">21</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">,</span> <span class="token number">21</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">,</span> <span class="token number">21</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">,</span> <span class="token number">21</span><span class="token punctuation">,</span> <span class="token punctuation">}</span> </code></pre> <h2>
算法实现</h2> <pre><code class="lang-go hljs"><span class="token comment">// 下方函数为MD5加密算法的核心,迭代加密步骤</span> <span class="token keyword">func</span> <span class="token function">trans</span><span class="token punctuation">(</span>text <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 将512-bit消息划分为16组</span> X <span class="token operator">:=</span> <span class="token function">div_group</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span> <span class="token keyword">var</span> f<span class="token punctuation">,</span> k <span class="token builtin">uint32</span> <span class="token comment">// result存储最初的A,B,C,D</span> a <span class="token operator">:=</span> result<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> b <span class="token operator">:=</span> result<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> c <span class="token operator">:=</span> result<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> d <span class="token operator">:=</span> result<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token function">uint32</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token function">uint32</span><span class="token punctuation">(</span><span class="token number">64</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator"> </span> <span class="token punctuation">{</span> <span class="token keyword">if</span> i <span class="token operator"><</span> <span class="token number">16</span> <span class="token punctuation">{</span> f <span class="token operator">=</span> <span class="token function">F</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> c<span class="token punctuation">,</span> d<span class="token punctuation">)</span> k <span class="token operator">=</span> i <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> i <span class="token operator"><</span> <span class="token number">32</span> <span class="token punctuation">{</span> f <span class="token operator">=</span> <span class="token function">G</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> c<span class="token punctuation">,</span> d<span class="token punctuation">)</span> k <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">5</span><span class="token operator">*</span>i <span class="token operator"> </span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">16</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> i <span class="token operator"><</span> <span class="token number">48</span> <span class="token punctuation">{</span> f <span class="token operator">=</span> <span class="token function">H</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> c<span class="token punctuation">,</span> d<span class="token punctuation">)</span> k <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">3</span><span class="token operator">*</span>i <span class="token operator"> </span> <span class="token number">5</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">16</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> f <span class="token operator">=</span> <span class="token function">I</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> c<span class="token punctuation">,</span> d<span class="token punctuation">)</span> k <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token number">7</span> <span class="token operator">*</span> i<span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">16</span> <span class="token punctuation">}</span> dtemp <span class="token operator">:=</span> d d <span class="token operator">=</span> c c <span class="token operator">=</span> b b <span class="token operator">=</span> b <span class="token operator"> </span> <span class="token punctuation">(</span><span class="token function">shift</span><span class="token punctuation">(</span>a<span class="token operator"> </span>f<span class="token operator"> </span>T<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token operator"> </span>X<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">,</span> s<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> a <span class="token operator">=</span> dtemp <span class="token punctuation">}</span> result<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> result<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator"> </span> a result<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> result<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator"> </span> b result<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> result<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator"> </span> c result<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> result<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator"> </span> d <span class="token punctuation">}</span> </code></pre>

加密结果如下:

<pre><code class="lang-bash hljs">// 下方三组数据来自wiki The quick brown fox jumps over the lazy dog: 9e107d9d372bb6826bd81d3542a419d6 The quick brown fox jumps over the lazy cog: 1055d3e698d289f2af8663725127bd4b <span class="token keyword">:</span> d41d8cd98f00b204e9800998ecf8427e //空字符串加密结果 </code></pre>

完整代码详见Github

到此这篇关于“MD5加密算法Golang实现”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
php md5加密的另类应用
php MD5加密16位的实现方法
javascript实现MD5加密
php MD5函数的简单示例
有关discuz程序中PHP加密函数的原理分析
Python常用模块之hashlib
go语言加解密算法 md5 sha256
Go从入门到精通系列视频之go编程语言密码学哈希算法
php md5 与md5_file区别详细说明
【哈希密码】PHP比md5更安全的加密方式

[关闭]
~ ~