2015-11-28 107 views
0

我已經在C++中實現了TEA。以下是代碼:加密和解密結果在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)不同。 請指出我無法看到的錯誤。

回答

3

您將n設置爲16,而示例實現on Wikipedia將循環運行32次。

如果我在你的代碼更改n到32,它的工作原理:See it live on Coliru

+0

不挑剔,但其他答案似乎提供了一個更好的理解*爲什麼*它不工作,以及如何解決它在一般情況下:) – melak47

2
sum = n * delta 

您計算sumdelta << 5相當於delta * 32。這適用於默認值n = 32,但是您將n減少爲16,而不修復sum的計算。用sum = delta * n代替sum=delta<<5;

另請注意,減少回合次數會削弱對密碼分析的抵抗力。