我有 4 个字节的数据,需要一个 8 字节的数组来进行安全操作。我应该从 4 字节字节数组中生成这 8 个字节,这应该是可重现的。
我正在考虑使用精确字节数组并添加 4 个额外字节,并以已知序列中的初始数组的 AND、OR、XOR 填充它们。我不确定这是否是个好主意。我只需要这 4 个字节中的一个 8 字节数组,并且操作应该是可重现的(相同的 8 个字节与相同的给定 4 个字节)。请举一个C#的例子
我有 4 个字节的数据,需要一个 8 字节的数组来进行安全操作。我应该从 4 字节字节数组中生成这 8 个字节,这应该是可重现的。
我正在考虑使用精确字节数组并添加 4 个额外字节,并以已知序列中的初始数组的 AND、OR、XOR 填充它们。我不确定这是否是个好主意。我只需要这 4 个字节中的一个 8 字节数组,并且操作应该是可重现的(相同的 8 个字节与相同的给定 4 个字节)。请举一个C#的例子
为什么不用另外 4 个字节的零填充现有的 4 个字节?或者重复原来的 4 个字节。例如:
static byte[] Pad(byte[] input)
{
// Alternatively use Array.Resize
byte[] output = new byte[input.Length + 4];
Buffer.BlockCopy(input, 0, output, 0, input.Length);
return output;
}
static byte[] Repeat(byte[] input)
{
byte[] output = new byte[input.Length * 2];
Buffer.BlockCopy(input, 0, output, 0, input.Length);
Buffer.BlockCopy(input, 0, output, input.Length, input.Length);
return output;
}
我相信这两个都符合您最初的标准……但我怀疑您正在寻找其他东西。如果是这种情况,您需要明确说明您需要什么。
编辑:正如我在评论中所说,你基本上没有在这里添加任何真正的安全性 - 填充会使这更清楚,IMO。另一方面,如果您确实想要一些隐蔽的安全性,您可以找到一个允许播种的随机数生成器,并将其用作起点。例如:
// Don't use this - see below. Just the concept...
int seed = BitConverter.ToInt32(input, 0); // TODO: Cope with endianness
Random rng = new Random(seed);
byte[] output = new byte[8];
Buffer.BlockCopy(input, 0, output, 0, 4);
for (int i = 4; i < 8; i++) {
output[i] = (byte) rng.Next(256);
}
现在,我得到上述评论的原因是您可能需要一种保证不会在 .NET 版本之间更改的算法。例如,查找 Mersenne Twister 之类的代码。
有多种方法可以对分组密码进行填充。
这篇维基百科文章涵盖了一些更被接受的解决方案:http ://en.wikipedia.org/wiki/Padding_(cryptography)#Padding_methods
除非有任何其他考虑,我会使用 PKCS#7 填充。
怎么样
bytes.Concat(bytes)
我会非常小心。如果安全操作需要 64 位的数据,那可能是因为它需要那么多数据。如果您使用已知的可重现公式从 32 位创建 64 位,您仍然只有 32 位的数据。
如果安全性不受您拥有的数据的影响,您可以用 1 或 0 填充剩余的四个字节。但是你真的应该尝试获取 8 个字节的“真实”数据。