2012-04-12 52 views
2

我試圖建立一個網站和Arduino之間的通信。我需要認證從我的網站到Arduino的所有消息,所以我發現使用XTEA加密技術的時間更少。爲網站PHP中的XTEA加密和C中的解密

我的PHP的代碼是:

mcrypt_encrypt(MCRYPT_XTEA, 'qwertyuiasdfghjk', 'asdfasdf', MCRYPT_MODE_ECB); 

其中 「qwertyuiasdfghjk」 是128個比特 鍵和 「asdfasdf」 是一個64個比特 消息。

在Arduino的側面我使用:

void _xtea_dec(void* dest, const void* v, const void* k) 
{ 
    uint8_t i; 
    uint32_t v0=((uint32_t*)v)[0], v1=((uint32_t*)v)[1]; 
    uint32_t sum=0xC6EF3720, delta=0x9E3779B9; 
    for(i=0; i<32; i++) 
    { 
     v1 -= ((v0 << 4^v0 >> 5) + v0)^(sum + ((uint32_t*)k)[sum>>11 & 3]); 
     sum -= delta; 
     v0 -= ((v1 << 4^v1 >> 5) + v1)^(sum + ((uint32_t*)k)[sum & 3]); 
    } 
    ((uint32_t*)dest)[0]=v0; ((uint32_t*)dest)[1]=v1; 
} 

其中的參數:

char dest[9]; //Destination 
char v[9]; //Encrypted message 
char k[17]; //Key 

但我解密的消息是遠離原始消息......它仍然有64個 位,但它完全不同...

我該怎麼辦?

(這是我第一次在這裏提出一個問題,平時我我所有的問題都在堆棧溢出 解決某處...)

回答

2

最有可能你的加密密鑰是不同的。確保它們在兩端都是相同的。

C:

// "annoying monkey" 
    uint32_t key[4] = {0x6f6e6e61, 0x676e6979, 0x6e6f6d20, 0x0079656b }; 

PHP:

mcrypt_encrypt(MCRYPT_XTEA, 'annoying monkey', 'data', MCRYPT_MODE_ECB); 
+1

是的!我遵循你的建議,並最終它的作品! – uDalillu 2012-04-13 19:06:27

2

至於我記得,在XTEA規範沒有提供測試向量和你的代碼似乎並不關心endianness。很可能這是一個關鍵或數據被假設/錯誤排序的問題。查看PHP源代碼中mcrypt_encrypt函數的實現。

+0

謝謝,我明白你的觀點。我會嘗試你所說的!謝謝。不幸的是,我不能給你任何意見(系統說我沒有足夠的分數)。 – uDalillu 2012-04-13 17:42:48