我有4个字节的数据,需要8个字节的数组才能进行安全操作。我应该从4字节字节数组生成这8个字节,这应该是可重现的。
我正在考虑使用精确的字节数组并添加4个额外的字节,并用已知序列中的初始数组的AND,OR,XOR ...填充它们。我不确定这是不是一个好主意。我只需要这个4字节的8字节数组,操作应该是可重复的(相同的8字节,相同的给定4字节)。请举例说明C#
答案 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个字节的“真实”数据。