Как получить 8 байтов из 4 байтов с воспроизводимой операцией? - PullRequest
1 голос
/ 19 ноября 2010

У меня есть 4 байта данных и мне нужен массив из 8 байтов для обеспечения безопасности. Я должен создать эти 8 байтов из массива байтов в 4 байта, и это должно быть воспроизводимо.

Я думал об использовании точного байтового массива и добавлении 4 дополнительных байтов и заполнении их AND, OR, XOR ... исходного массива в известной последовательности. Я не уверен, что это хорошая идея. Мне просто нужен массив из 8 байтов из этих 4 байтов, и операция должна быть воспроизводимой (те же 8 байтов с теми же заданными 4 байтами). Пожалуйста, приведите пример на C #

Ответы [ 4 ]

4 голосов
/ 19 ноября 2010

Почему бы просто не дополнить существующие 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 голос
/ 19 ноября 2010

Я был бы очень осторожен.Если операция безопасности требует данных на 64 бита, это, вероятно, потому, что требует такого количества данных.Если вы создадите свои 64-битные из 32-битных с известной воспроизводимой формулой, у вас останутся только 32-битные данные.

Если данные не влияют на безопасность, вы можете просто заполнить остальные четыребайты с единицами или нулями.Но вы действительно должны попытаться получить 8 байтов «реальных» данных.

1 голос
/ 19 ноября 2010

Как насчет

bytes.Concat(bytes)
1 голос
/ 19 ноября 2010

Существует несколько методов заполнения для блочных шифров.

В этой статье Википедии рассматриваются некоторые из наиболее приемлемых решений: http://en.wikipedia.org/wiki/Padding_(cryptography)#Padding_methods

За исключением любых других соображений, я бы использовал заполнение PKCS # 7.

...