2012-04-12 16 views
2

私はウェブサイトとArduinoの間の通信を確立しようとしています。私は自分のウェブサイトからArduinoまでのすべてのメッセージを認証する必要があるので、時間のかかる方法がより少なくても、XTEA暗号を使用していることが分かりました。PHPでのXTEA暗号化とCでの復号化

ウェブサイトのための私のPHPコードは:

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

"qwertyuiasdfghjkは" 128  キービットと "asdfasdf" である場合は、64  ビットメッセージです。私が使用しているArduinoの側で

:それはまだ64を持っ

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

が、私の復号化されたメッセージは、遠く離れた元のメッセージからです...:パラメータは

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

 ビットですが、それはまったく違っています...

どうすればよいですか?

(これは私がここに質問を初めて、通常、私はすべての私の質問は、どこかでスタックオーバーフロー で解決されている...)

答えて

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

2

私が覚えている限りでは、XTEA仕様は、テストベクトルを提供しなかったし、あなたのコードを約endiannessを気にしていないようです。ほとんどの場合、それは鍵またはデータの仮定であり、間違ったエンディアンにある。 PHPソースのmcrypt_encrypt関数の実装を見てください。

+0

ありがとう、私はあなたのポイントを得た。私はあなたが言ったことを試みます!ありがとう。残念ながら、私はあなたに何かのポイントを与えることはできません(システムは私にポイントが足りないと言っています)。 – uDalillu