Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要帮助移植XTEA C++;PHP代码 我有一些问题把C++代码转换成PHP。目的是我需要使用xteacipher将我的应用程序(用C++构建)与web服务器(PHP)通信,以通过XMLRPC加密/解密请求的数据包_Php_C++_Xml Rpc_Porting_Block Cipher - Fatal编程技术网

需要帮助移植XTEA C++;PHP代码 我有一些问题把C++代码转换成PHP。目的是我需要使用xteacipher将我的应用程序(用C++构建)与web服务器(PHP)通信,以通过XMLRPC加密/解密请求的数据包

需要帮助移植XTEA C++;PHP代码 我有一些问题把C++代码转换成PHP。目的是我需要使用xteacipher将我的应用程序(用C++构建)与web服务器(PHP)通信,以通过XMLRPC加密/解密请求的数据包,php,c++,xml-rpc,porting,block-cipher,Php,C++,Xml Rpc,Porting,Block Cipher,我从某个项目中获取的原始代码,我的意思是 一些片段: 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++)

我从某个项目中获取的原始代码,我的意思是

一些片段:

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;
}
内联void xtea_加密(无符号整数次、无符号长*v、无符号长*k)
{
无符号长v0=v[0],v1=v[1];
无符号长和=0,增量=0x9E3779B9;
for(无符号整数i=0;i5))+v1^(sum+k[sum&3]);
总和+=增量;
v1+=((v0>5))+v0^(和+k[(和>>11)和3]);
}
v[0]=v0;
v[1]=v1;
}
内联void xtea_解密(无符号整数次,无符号长*v,无符号长*k)
{
无符号长v0=v[0],v1=v[1];
无符号长增量=0x9E3779B9,总和=增量*num_轮;
for(无符号整数i=0;i5))+v0^(和+k[(和>>11)和3]);
总和-=增量;
v0-=((v1>5))+v1^(sum+k[sum&3]);
}
v[0]=v0;
v[1]=v1;
}
样板
无效xtea_加密(T&out、常数T&in、常数std::字符串和密码)
{
out=in;
大小额外的零=(8-(out.size()%8))%8;
out.resize(out.size()+额外的0);//添加值,直到大小为8的倍数
无符号长k[4];//128位密钥
std::string pw16=password;//带16个字符(=128位)的密码
pw16.调整大小(16,0);
typedef无符号字符uc;

k(0)]((UC)PW16(0))((UC)PW16(1)< P>上有一个链接,A(参见底部的下载链接)。这应该是一个好的开始。< /P> < P>上的XTEA页有一个链接到A。(见底部的下载链接)。这应该是一个好的开始。

< P>另一个可能是保持C++代码,并学习如何粘贴它。(即将它嵌入到PHP中。我认为PHP能够在动态加载的共享库中调用外部代码。

< P>)另一种可能是保持C++代码,并学习如何粘贴它(即嵌入它)。进入PHP。我认为PHP能够在动态加载的共享库中调用外部代码。

到目前为止,你有什么特别的问题?到目前为止,你有什么特别的问题?你有什么特别的问题?是的,但我必须拥有系统本身,以便轻松重新配置。出于安全目的,许多web主机都会阻止f危及他们系统的函数。不管怎样,你的输入很好。谢谢。是的,但我必须拥有系统本身,以便轻松重新配置。出于安全目的,许多web主机阻止危及他们系统的函数。不管怎样,你的输入很好。谢谢。我的错误!我看不出这是链接,OMG!谢谢。另一个实现(我编写的):-并且它被确认是PHP7兼容和64位兼容的(我在野外测试了几个php xtea实现,它们似乎都不能在64位PHP7系统上工作;因此我自己做了。我想大部分野外实现都是2006年左右的)我错了!我看不出这是链接,天哪!谢谢。另一个实现(这是我写的):-它被证实是PHP7兼容和64位兼容的(我在野外测试了几个php xtea实现,它们似乎都不能在64位PHP7系统上工作;因此我自己做了。我想大部分野外实现都是从2006年左右开始的)