需要帮助将XTEA C ++代码移植到PHP [英] Need help porting XTEA C++ code to PHP

查看:195
本文介绍了需要帮助将XTEA C ++代码移植到PHP的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在将C ++代码转换为PHP时遇到一些问题.目的是我需要使用 XTEA密码通过XMLRPC与Web服务器(PHP)通信我的应用程序(使用C ++生成),以进行加密/解密.

I have some problem convert C++ code to PHP. The purpose is I need to communicate my application (build with C++) with web server (PHP ) using XTEA cipher to encrypt/decrypt the requested packet via XMLRPC.

我从某些项目中获取的原始代码 Lode的编程接口 ,而我的意思是 .

The original code I taken from some project Lode's Programming Interface and the code that I mean is 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代码?所有提供的帮助都将不胜感激.

There maybe someone who could help to convert above code to PHP code? All help given is greatly appreciated.

提前谢谢.

推荐答案

维基百科上的XTEA页面>带有指向 PHP实现的链接. (请参阅底部的下载链接).那应该是一个好的开始.

The XTEA page on Wikipedia has a links to a PHP implementation. (See the download links at the bottom). That should be a good start.

这篇关于需要帮助将XTEA C ++代码移植到PHP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆