MD5加密算法Golang实现
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位的输出,将此四个输出拼接起来就可以获得最终的加密结果。
下面介绍算法的主要步骤:
把填充后的消息结果分割为<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方式存储。
第四步:总控流程
以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>
第五步: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>的确定;
顺序使用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值:
各次迭代运算采用的做循环移位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更安全的加密方式