代码之家  ›  专栏  ›  技术社区  ›  Ruud

XXTEA返回值

  •  1
  • Ruud  · 技术社区  · 15 年前

    这似乎是个愚蠢的问题,但我找不到答案…

    这是维基百科的xxtea代码:

    #include <stdint.h>
    #define DELTA 0x9e3779b9
    #define MX ((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (k[(p&3)^e] ^ z));
    
    void btea(uint32_t *v, int n, uint32_t const k[4]) {
      uint32_t y, z, sum;
      unsigned p, rounds, e;
      if (n > 1) {          /* Coding Part */
        rounds = 6 + 52/n;
        sum = 0;
        z = v[n-1];
        do {
          sum += DELTA;
          e = (sum >> 2) & 3;
          for (p=0; p<n-1; p++)
            y = v[p+1], z = v[p] += MX;
          y = v[0];
          z = v[n-1] += MX;
        } while (--rounds);
      } else if (n < -1) {  /* Decoding Part */
        n = -n;
        rounds = 6 + 52/n;
        sum = rounds*DELTA;
        y = v[0];
        do {
          e = (sum >> 2) & 3;
          for (p=n-1; p>0; p--)
            z = v[p-1], y = v[p] -= MX;
          z = v[n-1];
          y = v[0] -= MX;
        } while ((sum -= DELTA) != 0);
      }
    }
    

    我把这个移植到C。我不知道我忽略了什么,但是加密的结果存储在哪里?我假设它在V中,但是来自V的数据从来没有被设置过,只有读取。

    我看不见的是什么?

    5 回复  |  直到 14 年前
        1
  •  1
  •   Kirill V. Lyadvinsky    15 年前

    运算符=-++=在表达式中具有相同的优先级,它们根据C++标准5.17从右到左相关联(并且我相信C中也有相同的规则)。例如,这:

    y = v[p] -= MX;
    

    可替换为:

    v[p] -= MX; // <<< modification of data here
    y = v[p];
    
        2
  •  7
  •   Ben M    14 年前

    我在谷歌搜索“XXTEA C”时找到了这个页面。找不到任何现成的实现,所以我自己做了。有了闭包的魔力,它实际上是引用代码的逐字复制。我已经把它贴给其他来这里的人了。

    注意,虽然它接受任意长度的字节数组,但返回的数组的长度始终是4的倍数。而且,与引用实现不同,这个实现返回修改过的数据,而不是更改原始数据。

    using System;
    
    namespace Encryption
    {
        public enum XXTEAMode
        {
            Encrypt,
            Decrypt
        }
    
        static public class XXTEA
        {
            static public byte[] Code(byte[] data, uint[] k, XXTEAMode mode)
            {
                uint[] v = new uint[(int)Math.Ceiling((float)data.Length / 4)];
                Buffer.BlockCopy(data, 0, v, 0, data.Length);
    
                unchecked
                {
                    const uint DELTA = 0x9e3779b9;
                    uint y = 0, z = 0, sum = 0, p = 0, rounds = 0, e = 0;
                    int n = v.Length;
                    Func<uint> MX = () => (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum ^ y) + (k[(p & 3) ^ e] ^ z)));
    
                    if (mode == XXTEAMode.Encrypt)
                    {
                        rounds = (uint)(6 + 52 / n);
                        z = v[n - 1];
                        do
                        {
                            sum += DELTA;
                            e = (sum >> 2) & 3;
                            for (p = 0; p < n - 1; p++)
                            {
                                y = v[p + 1];
                                z = v[p] += MX();
                            }
                            y = v[0];
                            z = v[n - 1] += MX();
                        } while (--rounds > 0);
                    }
                    else
                    {
                        rounds = (uint)(6 + 52 / n);
                        sum = rounds * DELTA;
                        y = v[0];
                        do
                        {
                            e = (sum >> 2) & 3;
                            for (p = (uint)(n - 1); p > 0; p--)
                            {
                                z = v[p - 1];
                                y = v[p] -= MX();
                            }
                            z = v[n - 1];
                            y = v[0] -= MX();
                        } while ((sum -= DELTA) != 0);
                    }
                }
    
                byte[] rvl = new byte[v.Length * 4];
                Buffer.BlockCopy(v, 0, rvl, 0, rvl.Length);
                return rvl;
            }
        }
    }
    
        3
  •  2
  •   Alan    15 年前

    在编码部分: z = v[n-1] += MX;

    在解码部分: y = v[p] -= MX;

    这些行对v数组的一个元素执行+=操作,然后将新值复制到z或y中。编写代码的人将简洁优先于清晰,这在实际使用中通常不是一件好事。

        4
  •  1
  •   Georg Fritzsche    15 年前

    在该行中设置V,例如:

    y = v[0] -= MX;
    

    也可以写为:

    v[0] = v[0] - MX;
    y = v[0];
    
        5
  •  1
  •   Marc Gravell    15 年前

    指针末尾数组中的数据 v 更新,但是:

    v[p] += MX;
    ...
    z = v[n-1] += MX;
    ...
    z = v[p-1], y = v[p] -= MX;
    ...
    y = v[0] -= MX;
    

    是的,这是数据 提到 V 已更新。