我在C ++中实现了TEA。以下是代码:
#include <stdio.h>
#include <iostream>
#include <iostream>
using namespace std;
int main()
{
unsigned long y=24,z=32, sum=0,
delta=0x9e3779b9, n=16 ;
int k[4] = { 0x28, 0xc0, 0x20, 0xd0 };
unsigned long v[2] = {0,0};
cout<<"original y is "<< y<<". original z is "<<z<<endl;
while (n-->0)
{
sum += delta ;
y += ((z<<4)+k[0]) ^ (z+sum) ^ ((z>>5)+k[1]) ;
z += ((y<<4)+k[2]) ^ (y+sum) ^ ((y>>5)+k[3]) ;
}
v[0]=y ; v[1]=z ;
cout<<"encrypted y is "<< v[0]<<". encrypted z is "<<v[1]<<endl;
n=16;
y=v[0];
z=v[1];
delta=0x9e3779b9 ;
sum=delta<<5 ;
/* start cycle */
while (n-->0)
{
z-= ((y<<4)+k[2]) ^ (y+sum) ^ ((y>>5)+k[3]) ;
y-= ((z<<4)+k[0]) ^ (z+sum) ^ ((z>>5)+k[1]) ;
sum-=delta ;
}
v[0]=y ; v[1]=z ;
cout<<"decrypted y is "<< v[0]<<". decrypted z is "<<v[1]<<endl;
getchar();
return 0;
}
但最后,结果并不相同,即解密值与原始输入(y
和z
)不同。
请指出我无法看到的错误。
答案 0 :(得分:3)
您将n
设置为16,而示例实现on Wikipedia运行循环32次。
如果我在代码中将n
更改为32,则可以:See it live on Coliru
答案 1 :(得分:2)
sum = n * delta
您将sum
计算为与delta << 5
对应的delta * 32
。这适用于默认值n = 32
,但您将n
缩减为16
,而不修复sum
的计算。将sum=delta<<5;
替换为sum = delta * n
。
另请注意,减少轮次次数会削弱对加密分析的抵抗力。