2011-10-28 7 views
1

C++コードをPHPに変換する際に問題があります。その目的は、XMLサーバーから要求されたパケットを暗号化/復号化するために、XTEA暗号を使用して、Webサーバー(PHP)で自分のアプリケーション(C++で構築)と通信する必要があることです。PHPにXTEA C++コードを移植するのに助けが必要

私がいくつかのプロジェクトLode's Programming Interfaceから取得した元のコードと私が意味するコードはthisです。

一部抜粋:

inline void xtea_encipher(unsigned int num_rounds, unsigned long* v, unsigned long* k) 
{ 
    unsigned long v0 = v[0], v1 = v[1]; 
    unsigned long sum = 0, delta = 0x9E3779B9; 
    for(unsigned int i = 0; i < num_rounds; i++) 
    { 
    v0 += (((v1 << 4)^(v1 >> 5)) + v1)^(sum + k[sum & 3]); 
    sum += delta; 
    v1 += (((v0 << 4)^(v0 >> 5)) + v0)^(sum + k[(sum >> 11) & 3]); 
    } 
    v[0] = v0; 
    v[1] = v1; 
} 

inline void xtea_decipher(unsigned int num_rounds, unsigned long* v, unsigned long* k) 
{ 
    unsigned long v0 = v[0], v1 = v[1]; 
    unsigned long delta = 0x9E3779B9, sum = delta * num_rounds; 
    for(unsigned int i = 0; i < num_rounds; i++) 
    { 
    v1 -= (((v0 << 4)^(v0 >> 5)) + v0)^(sum + k[(sum >> 11) & 3]); 
    sum -= delta; 
    v0 -= (((v1 << 4)^(v1 >> 5)) + v1)^(sum + k[sum & 3]); 
    } 
    v[0] = v0; 
    v[1] = v1; 
} 

template<typename T> 
void xtea_encipher(T& out, const T& in, const std::string& password) 
{ 
    out = in; 
    size_t extra_zeroes = (8 - (out.size() % 8)) % 8; 
    out.resize(out.size() + extra_zeroes, 0); //add values until the size is a multiple of 8 

    unsigned long k[4]; //128 bit key 
    std::string pw16 = password; //password with 16 chars (=128 bit) 
    pw16.resize(16, 0); 
    typedef unsigned char uc; 

    k[0] = ((uc)pw16[ 0]) | ((uc)pw16[ 1] << 8) | ((uc)pw16[ 2] << 16) | ((uc)pw16[ 3] << 24); 
    k[1] = ((uc)pw16[ 4]) | ((uc)pw16[ 5] << 8) | ((uc)pw16[ 6] << 16) | ((uc)pw16[ 7] << 24); 
    k[2] = ((uc)pw16[ 8]) | ((uc)pw16[ 9] << 8) | ((uc)pw16[10] << 16) | ((uc)pw16[11] << 24); 
    k[3] = ((uc)pw16[12]) | ((uc)pw16[13] << 8) | ((uc)pw16[14] << 16) | ((uc)pw16[15] << 24); 

    unsigned long v[2]; 

    for(size_t i = 0; i + 7 < out.size(); i += 8) 
    { 
    v[0] = ((uc)out[i + 0]) | ((uc)out[i + 1] << 8) | ((uc)out[i + 2] << 16) | ((uc)out[i + 3] << 24); 
    v[1] = ((uc)out[i + 4]) | ((uc)out[i + 5] << 8) | ((uc)out[i + 6] << 16) | ((uc)out[i + 7] << 24); 

    xtea_encipher(64, v, k); 

    out[i + 0] = (v[0]) & 255; out[i + 1] = (v[0] >> 8) & 255; out[i + 2] = (v[0] >> 16) & 255; out[i + 3] = (v[0] >> 24) & 255; 
    out[i + 4] = (v[1]) & 255; out[i + 5] = (v[1] >> 8) & 255; out[i + 6] = (v[1] >> 16) & 255; out[i + 7] = (v[1] >> 24) & 255; 
    } 

    out.push_back(extra_zeroes); //at the end, specify to the data how many zeroes can be removed after decoding 
} 

//returns false if everything went ok, returns true and does nothing if the amount of zeros is > 7 which means it wasn't an enciphered file OR the filesize modulo 8 of the input file isn't 1 
template<typename T> 
bool xtea_decipher(T& out, const T& in, const std::string& password) 
{ 
    if((in.size() % 8) != 1) return true; //error, incorrect size 

    size_t extra_zeroes = in[in.size() - 1]; 

    if(extra_zeroes >= 8) return true; //error, incorrect amount of extra zeroes indicated 

    out = in; 

    out.resize(out.size() - 1); 

    unsigned long k[4]; //128 bit key 
    std::string pw16 = password; //password with 16 chars (=128 bit) 
    pw16.resize(16, 0); 
    typedef unsigned char uc; 
    k[0] = ((uc)pw16[ 0]) | ((uc)pw16[ 1] << 8) | ((uc)pw16[ 2] << 16) | ((uc)pw16[ 3] << 24); 
    k[1] = ((uc)pw16[ 4]) | ((uc)pw16[ 5] << 8) | ((uc)pw16[ 6] << 16) | ((uc)pw16[ 7] << 24); 
    k[2] = ((uc)pw16[ 8]) | ((uc)pw16[ 9] << 8) | ((uc)pw16[10] << 16) | ((uc)pw16[11] << 24); 
    k[3] = ((uc)pw16[12]) | ((uc)pw16[13] << 8) | ((uc)pw16[14] << 16) | ((uc)pw16[15] << 24); 

    unsigned long v[2]; 

    for(size_t i = 0; i + 7 < in.size(); i += 8) 
    { 
    v[0] = ((uc)out[i + 0]) | ((uc)out[i + 1] << 8) | ((uc)out[i + 2] << 16) | ((uc)out[i + 3] << 24); 
    v[1] = ((uc)out[i + 4]) | ((uc)out[i + 5] << 8) | ((uc)out[i + 6] << 16) | ((uc)out[i + 7] << 24); 

    xtea_decipher(64, v, k); 

    out[i + 0] = (v[0]) & 255; out[i + 1] = (v[0] >> 8) & 255; out[i + 2] = (v[0] >> 16) & 255; out[i + 3] = (v[0] >> 24) & 255; 
    out[i + 4] = (v[1]) & 255; out[i + 5] = (v[1] >> 8) & 255; out[i + 6] = (v[1] >> 16) & 255; out[i + 7] = (v[1] >> 24) & 255; 
    } 

    out.resize(out.size() - extra_zeroes); 

    return false; 
} 

あり、多分PHPコードにコードの上に変換するのに役立つ可能性が誰か?すべての助けが大いに評価されます。

ありがとうございます。

+0

これまでに何がありますか?具体的に何がありますか? – PeeHaa

答えて

2

WikipediaのXTEAページにはPHP implementationへのリンクがあります。 (下のダウンロードリンクを参照)。それは良いスタートになるはずです。

+0

私の間違い!私はリンク、OMGを参照してください!ありがとう。 – REFNTiE

2

また、C++コードを保持し、それをPHPに埋め込む(それを埋め込む)方法を学ぶこともできます。私はPHPが動的にロードされた共有ライブラリの外部コードを呼び出すことができると思います。

+0

はい、簡単に再設定するにはシステム自体を所有している必要があります。セキュリティ上の理由から、システムを危険にさらす多くのWebホスティングブロック機能。とにかく、あなたからの素晴らしい入力。ありがとう。 – REFNTiE