代码之家  ›  专栏  ›  技术社区  ›  Xaqron

如何用可重复的操作从4字节产生8字节?

  •  1
  • Xaqron  · 技术社区  · 14 年前

    我有4字节的数据,需要一个8字节的数组来执行安全操作。我应该生成这8个字节的4字节数组,这应该是可复制的。

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

    4 回复  |  直到 14 年前
        1
  •  4
  •   Jon Skeet    14 年前

    为什么不将现有的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的不同版本之间发生更改。为exmaple查找类似Mersenne Twister的代码。

        2
  •  1
  •   Yann Ramin    14 年前

    块密码有多种填充方法。

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

    如果没有其他考虑,我会使用PKCS#7填充。

        3
  •  1
  •   Paul Creasey    14 年前

    怎么样

    bytes.Concat(bytes)
    
        4
  •  1
  •   Albin Sunnanbo    14 年前

    我会非常小心的。如果一个安全操作需要64位的数据,那可能是因为它需要那么多的数据。如果使用已知的可重复公式从32位创建64位,则仍然只有32位的数据值。

    如果安全性不受现有数据的影响,则只需用1或0填充其余4个字节即可。但你真的应该试着得到8字节的“真实”数据。