tea算法
<p>[TOC]</p>
<h1>🌓过程分析</h1>
<p>TEA是一种分组加密算法,它使用64位的明文和128位的密钥,使用 Feistel 分组加密框架,建议迭代次数为32轮,该算法使用了一个常数 δ(0×9E3779B9) 作为倍数,它来源于黄金比率,以保证每一轮加密都不相同</p>
<p>TEA主要采用的就是异或和加法,我们看一下实现的伪代码</p>
<pre><code>void Encrypt(long* v, long* k)
{
unsigned long x = v[0], y = v[1], sum = 0,
delta = 0x9e3779b9, /* 密钥调度常数 */
n = 32
while(n-->0)
{
sum += delta
x += ((y<<4)+k[0])^(y+sum)^((y>>5)+k[1])
y += ((x<<4)+k[2])^(x+sum)^((x>>5)+k[3])
}
v[0] = x
v[1] = y
}
</code></pre>
<p>举个例子来看具体过程,就拿“1,2”来说 </p>
<pre><code>x += ((2<<4)+1)^(2+2654435769)^((2>>5)+2) => 2654435737
y += ((2654435737<<4)+3)^(2654435737+2654435769)^((2654435737>>5)+4) => 38049206547
</code></pre>
<p>就拿第一轮加密来说,按道理是可以逆向回原本的数据的,逆向操作为</p>
<pre><code>x = 2654435737
y = 38049206547
y -= ((2654435737<<4)+3)^(2654435737+2654435769)^((2654435737>>5)+4) => 2
x -= ((2<<4)+1)^(2+2654435769)^((2>>5)+2) => 1
</code></pre>
<p>计算器一算就出来了,所以可以很容易得到逆向算法为 </p>
<p>将sum加到32轮的值,然后进行异或结果进行减去即可得到上一轮的结果,接着循环32轮即可得到最初的值 </p>
<p>解密伪代码为 </p>
<pre><code>void Decrypt(long *v, long *k)
{
unsigned long n = 32, sum, x = v[0], z = v[1],
delta = 0x9e3779b9
sum = delta<<5 /* 相当于sum加32轮 */
while(n-->0)
{
y -= ((x<<4)+k[2])^(x+sum)^((x>>5)+k[3])
x -= ((y<<4)+k[0])^(y+sum)^((y>>5)+k[1])
sum -= delta
}
v[0] = x
v[1] = y
}
</code></pre>
<h1>🌓代码实现</h1>
<h2>🌙Python</h2>
<pre><code class="language-python">def encrypt(v, k):
x = v[0]
y = v[1]
sum = 0
delta = 0x9e3779b9
for i in range(32):
sum += delta
x += ((y<<4)+k[0])^(y+sum)^((y>>5)+k[1])
y += ((x<<4)+k[2])^(x+sum)^((x>>5)+k[3])
return [x, y]
def decrypt(v, k):
x = v[0]
y = v[1]
delta = 0x9e3779b9
sum = delta<<5
for i in range(32):
y -= ((x<<4)+k[2])^(x+sum)^((x>>5)+k[3])
x -= ((y<<4)+k[0])^(y+sum)^((y>>5)+k[1])
sum -= delta
return [x, y]
v = [1, 2]
k = [1, 2, 3, 4]
v = encrypt(v, k)
print(v)
v = decrypt(v, k)
print(v)
</code></pre>
<p><img src="https://pic.imgdb.cn/item/637711f416f2c2beb11198e6.png" alt="" /> </p>
<h1>🌓参考文章</h1>
<p><a href="https://www.anquanke.com/post/id/224198">https://www.anquanke.com/post/id/224198</a></p>