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

Encryption and decryption results are not same in TEA

本文关键字:结果 解密 加密 TEA      更新时间:2023-10-16

我已经在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)不同。请指出我看不见的错误。

您将n设置为16,而维基百科上的示例实现运行循环32次。

如果我在您的代码中将n更改为32,它会起作用:在Coliru 上实时查看

sum = n * delta

sum计算为对应于delta * 32delta << 5。这适用于默认值n = 32,但您将n减少为16,而没有修复sum的计算。将sum=delta<<5;替换为sum = delta * n

还要注意,减少循环次数会削弱对密码分析的抵抗力。