TEA中的加密和解密结果不同

时间:2015-11-28 08:21:34

标签: c++ algorithm encryption

我在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;
}

但最后,结果并不相同,即解密值与原始输入(yz)不同。 请指出我无法看到的错误。

2 个答案:

答案 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

另请注意,减少轮次次数会削弱对加密分析的抵抗力。