2016-11-25 3 views
1

Контекст: VS 2015 winforms, Windows 7, с использованием библиотеки Inferno SecurityDriven.Создание частного CngKey (ECDH_P384) из кодовой фразы

Я кодирую офлайн-приложение, которое создает зашифрованные файлы для отправки в виде вложений электронной почты (поэтому не используется в контексте клиент-сервер). Файлы сначала зашифровываются Inferno (ETM_Transform), а затем отправляются (иногда, чтобы сбросить пароль) другой файл, обрабатывая обмен ключами DHM.

Открытый ключ каждого пользователя хранится в виде данных, созданных и сохраняемых приложением, что обеспечивает быстрый доступ во время процесса обмена ключами. Однако для частного ключа моя проблема заключается в том, что пользователи (включая меня) предпочли бы воссоздать свой закрытый ключ из фразы прохода, избавляя от необходимости скрывать ключ, повышая безопасность и переносимость. Поэтому мне нужно будет создать ключ из хранимого открытого ключа и хэшированной фразы.

Является ли это разумным подходом или, возможно, лучше для этого конкретного контекста?

Вот очень короткий пример кода, который выдает исключение: «Запрошенная операция не поддерживается». Как мне перейти на импорт данных в ключ?

internal static void CreateKey(string passPhrase) 
    { 
     byte[] keyType = new byte[] { 0x45, 0x43, 0x4B, 0x34 }; 
     byte[] keyLength = new byte[] { 0x30, 0x0, 0x0, 0x0 };    

     CryptoRandom cr = new CryptoRandom(); // rng used for this example 
     byte[] prKey = cr.NextBytes(48); // salt+hash passphrase and pass it to the private key part 
     byte[] pbKey = cr.NextBytes(96); // the public part, if I understand the format correctly for a cngkey using ECDH_P384 
     byte[] blob = Utils.Combine(keyType, keyLength); // same as concat 
     blob = Utils.Combine(blob, pbKey, prKey); 

     CngKey key = CngKey.Import(blob, CngKeyBlobFormat.EccPrivateBlob);       
    } 

ответ

2

Вы не можете произвольно генерировать открытый ключ. Открытый ключ вычисляется из закрытого ключа (и кривой), и вы, вероятно, получаете сообщение об ошибке: a) общедоступный X не соответствует ожидаемому от закрытого ключа, и b) что координата Y неверна для заданной координатой X.

Вам нужно будет вычислить значение открытого ключа из выбранного вами частного ключа. Насколько я знаю, ни .NET, ни Windows CNG не раскрывают эту функциональность.

1

CngKey DHM blob имеет определенный формат, который включает заголовок - это не просто случайный массив байтов. Вам не хватает этого заголовка, поэтому вы получаете исключение. Будьте рады, что вы получаете исключение, поскольку то, что вы пытаетесь сделать, концептуально неверно. ECDH_P384 не предназначен для того, чтобы каждая случайная комбинация с закрытым ключом была действительным/правильным личным ключом. Вы не должны вручную генерировать CngKey - оставьте CngKey поколениям соответствующие методы CngKey.

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

+0

Очень поучительный ответ. Я как раз собирался опубликовать вопрос о хранилище секретных ключей, но я внимательно изучу Minilock и узнаю, что я могу, прежде чем продолжить ... – Frank