这似乎是一个愚蠢的问题,但我找不到答案...
这是来自维基百科的 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/