c# - XXTEA的返回值

标签 c# c++ cryptography

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

这是来自维基百科的 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 的数据,只能读取。

我没看到什么?

最佳答案

我在谷歌搜索“XXTEA C#”时发现了这个页面。找不到任何现成的实现,所以我自己做了。借助闭包的魔力,它实际上是引用代码的逐字拷贝。我已将它发布给到达此处的任何其他人。

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

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

关于c# - XXTEA的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1481793/

相关文章:

c# - Excel 数据读取器问题、列名称和工作表选择

C++ 用户输入关闭程序调试

c++ - 通过容器的 protected 继承来 boost foreach

c++ - Delphi 函数和 C++ 中的等效函数

passwords - 与密码一起存储 PBKDF2 设置

javascript - 如何使用javascript文件解码编码?

java - 实例化类的正确方法,以便我能够验证证书中的路径链

c# - 模拟和 BackgroundWorker

c# - 在 C# 中捕获所有异常

c# - 每小时运行一次的 Windows 服务