Подтвердить что ты не робот

Как создать ключ шифрования для алгоритмов шифрования?

Я хочу использовать алгоритм шифрования, доступный в пространстве имен .Net Security, однако я пытаюсь понять, как сгенерировать ключ, например, алгоритм AES требует 256 бит, ключа с 16 байтами и некоторого вектора инициализации, что также мало байт.

  • Можно ли использовать любую комбинацию значений в моем ключе и IV? например все нули в Key и IV действительны или нет? Я знаю детали алгоритма, который делает много xors, поэтому нуль не принесет ничего хорошего, но существуют ли какие-либо ограничения этими алгоритмами?

  • Или мне нужно сгенерировать ключ с помощью какой-либо программы и сохранить ее где-то где-то?

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

4b9b3361

Ответ 1

Если вы используете шифрование для обмена данными, вам понадобится протокол обмена ключами, но вы сами не сделаете это самостоятельно, используя один готовый вариант, например TLS или SSL.

Если вы используете шифрование для хранения данных, вы генерируете IV, используя CryptGenRandom (или его эквивалент .net RandomNumberGenerator.GetBytes) и сохраните его по документу (ясно, не нужно защищать IV). Вы никогда не записываете ключ, ключ предоставляется пользователем. Обычно вы извлекаете ключ из фраз паролей, используя CryptDeriveKey или его .Net-эквивалент PasswordDeriveKey.CryptDeriveKey.

Обновление

Чтобы хранить секрет в базе данных, доступный только пользователю и администратору, вам необходимо использовать 3 клавиши:

  • один для шифрования данных (назовем его ключом DK)
  • один ключ пользователя для шифрования ключа DK (назовем его UK)
  • один ключ администратора для шифрования ключа DK (назовите его AK)

В теории вы шифруете данные с помощью DK, а затем шифруете DK с Великобританией и сохраняете ее, и шифруете DK с помощью AK и сохраняете его. Таким образом, пользователь может снова использовать Великобританию для дешифрования DK, а затем расшифровать данные, и администратор может использовать AK для дешифрования DK, а затем расшифровать данные. Большая проблема заключается в том, что система всегда автоматизирована, поэтому система нуждается в доступе к ключу администратора, что означает, что это не является подлинным ключом администратора, а является системным ключом (он не может использоваться для целей не- например, отказ).

Как хэдз-ап, знание того, что такое IV, или как использовать AES с С#, и как работает алгоритм криптографии, вы получите ровно 0 (ноль) тяги при решении таких проблем. Проблема не в том, что IV и ключ к использованию, проблема всегда ключевое обеспечение. Для реальных криптографических операций просто используйте встроенную поддержку из базы данных, см. Криптография в SQL Server. Я могу легко утверждать, что единственным средством, которое вам нужно, является TDE (прозрачное шифрование данных) для защиты от случайной потери носителей.

Ответ 2

Вы действительно должны сделать это правильно:)

1) Используйте безопасно созданный случайный IV
2) Используйте безопасно сгенерированный случайный ключ
3) Не используйте режим ECB - КОГДА-ЛИБО

AesManaged aes = new AesManaged();
aes.GenerateKey();
aes.GenerateIV();

Приведенный выше код будет правильно и безопасно генерировать случайный IV и случайный ключ для вас.

Ответ 3

Похоже, вам нужно прочитать в классе Rfc2898DeriveBytes.

Rfc2898DeriveBytes.GetBytes();

Он имеет метод (выше), который позволяет вам настроить размер массивов байтов, которые подаются в свойства .Key и .IV по симметричному алгоритму шифрования, просто путем подачи значения int. Официальная публикация MS 70-536 предлагает сделать это программно, разделив свойство KeySize/8.

I.e TripleDes или AESManaged. Независимо от того, что вы используете, сам алгоритм будет иметь некоторые предварительные требования, которые необходимо будет выполнить в первую очередь. I. удовлетворяет условиям размера ключа. RunTime автоматически заполнит свойства и поля и т.д. Лучшие и самые сильные значения для вас. Но IV и Ключ должны исходить от вас. Как вы можете сделать следующее:

RijndaelManaged myAlg = new RiRijndaelManaged();
byte[] salt = Encoding.ASCII.GetBytes("Some salt value");
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes("some password", salt);
myAlg.Key = key.GetBytes( myAlg.KeySize / 8);
myAlg.IV  = key.GetBytes( myAlg.BlockSize / 8);
// myAld should now fully set-up.

Выше вы можете видеть, что я имею в виду, про грамматически, поскольку это должно в значительной степени сделайте все это для вас, даже если вам даже не нужно бить глазной крышкой, чтобы встретить его заранее.

В книге Microsoft 70-536 указано, что свойства .Key ожидают, что байт-массивы, которые вы поставляете к ним в байтах, а не в битах. Класс RFC работает в байтах, где в качестве алгоритмов свойство KeySize работает в битах. 1 байт = 8 бит. Вы можете видеть, куда это идет...? Это должно дать вам представление о том, почему вышеуказанный образец кода выполняется так, как он есть! Я изучил его, и это придает мне хороший смысл!

Вышеупомянутый ответ должен позволить вам создать объект алгоритма с предоставленным паролем и значением статической соли, которое может быть жестким кодом с обоих концов. Единственное, что вам нужно сделать, это беспокоиться о том, как вы будете следить за тем, чтобы байт-массивы, хранящиеся в .Key и .IV, были безопасно доставлены получателю, чтобы можно было успешно расшифровать зашифрованное сообщение. Безопасным восстановлением одного и того же объекта алгоритма.

OBTW:

AESManaged имеет keyize req ': 128Bits = 16 Bytes!!! (8 * 8 = 64, 64 бит /8 бит на байт = 8 байтов) Поэтому

64 * 2 = 128Bit, 8 * 2, == > размер ключа 16bytes!

256Bit = 32Bytes!!!!


В соответствии с 70-536 официальным учебным пособием, Aes ограничивается наличием ключей размером 128 битов. 256 бит, 192 и 128, например, могут использоваться с классом Rijndael.


С другой стороны, вы можете полностью забыть все это дерьмо и просто использовать методы .GenerateKey и GenerateIV, чтобы избавить вас от всех проблем, связанных с сортировкой предопределенных и согласованных значений пароля и статических солей. Ваша единственная проблема заключается в том, чтобы определить способ хранения и получения массивов ключей и IV байтов. Бинарный форматирующий?.

Ответ 4

Генерировать случайные буквы/шестнадцатеричный код определенной длины.

Эта функция (взятая из здесь) возвращает случайный ключ определенной длины:

private static string CreateSalt(int size)
{
    //Generate a cryptographic random number.
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] buff = new byte[size];
    rng.GetBytes(buff);

    // Return a Base64 string representation of the random number.
    return Convert.ToBase64String(buff);
}

Ответ 5

Используйте System.Security.Cryptography.RandomNumberGenerator для генерации случайных байтов:

var rnd = new System.Security.Cryptography.RandomNumberGenerator.Create();
var key = new byte[50];
rnd.GetBytes(key);

Ответ 6

Это действительно зависит от того, что вам нужно делать с ключом.

Если ключ должен быть сгенерирован компьютером (и может быть любым случайным значением), я обычно беру SHA256 пары GUID. Это примерно так же беспорядочно, как и вы, без генератора случайных чисел.

Вы можете использовать ключи со всеми 0, но, очевидно, это будет не очень безопасно.