如何通过可重现的操作从4个字节产生8个字节?

时间:2010-11-19 08:28:16

标签: c# security bitwise-operators binary-reproducibility

我有4个字节的数据,需要8个字节的数组才能进行安全操作。我应该从4字节字节数组生成这8个字节,这应该是可重现的。

我正在考虑使用精确的字节数组并添加4个额外的字节,并用已知序列中的初始数组的AND,OR,XOR ...填充它们。我不确定这是不是一个好主意。我只需要这个4字节的8字节数组,操作应该是可重复的(相同的8字节,相同的给定4字节)。请举例说明C#

4 个答案:

答案 0 :(得分:4)

为什么不用另外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的代码,例如。

答案 1 :(得分:1)

有多种方法可以为分组密码进行填充。

这篇维基百科的文章涵盖了一些更受欢迎的解决方案:http://en.wikipedia.org/wiki/Padding_(cryptography)#Padding_methods

除非考虑任何其他因素,否则我会使用PKCS#7填充。

答案 2 :(得分:1)

怎么样

bytes.Concat(bytes)

答案 3 :(得分:1)

我会非常小心。如果安全操作需要64位数据,则​​可能是因为它需要大量数据。如果使用已知的可重现公式从32位创建64位,则仍将只有32位数据。

如果安全性不受您拥有的数据的影响,您可以使用1或0填充剩余的4个字节。但你应该真正尝试获得8个字节的“真实”数据。