генерировать пару ключей на основе строки - PullRequest
4 голосов
/ 25 декабря 2010

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

Насколько мне известно, RSACryptoServiceProvider генерирует пару ключей автоматически.Мне нужно генерировать одну и ту же пару каждый раз, когда я посылаю одну и ту же строку.

Есть идеи, как реализовать это в c #?

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

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

Ответы [ 2 ]

4 голосов
/ 25 декабря 2010

Вы можете попробовать следующее:Используйте Rfc2898DeriveBytes для получения двух цепочек битов.Интерпретируйте каждую часть как один BigInteger и найдите следующий штрих после него.Это ваш p, q, из которого вы можете построить свой e, d, n, используемый для RSA.Но это, вероятно, плохая идея, поскольку я ее только что изобрел, и она не основана на устоявшейся криптографии.

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

2 голосов
/ 25 декабря 2010

Нет практического способа сделать это.Теоретически вы можете взломать реализации OpenSSL для RSA и RNG и убедиться, что единственной энтропией, которую получает генератор ключей RSA, является ваша строка.Таким образом, процесс keygen будет выплевывать один и только один ключ RSA на каждую входную строку, независимо от того, сколько раз вы ее запускаете.Тем не менее, в вашей строке почти наверняка не будет достаточно энтропии, чтобы сделать сгенерированный ключ криптографически полезным.Если вам этого недостаточно, существует также проблема, связанная с тем, что этот процесс сильно зависит от внутренних компонентов процесса создания ключей RSA, который может меняться между выпусками OpenSSL, что может привести к генерированию другого ключа на основе того же ввода.

Почему вы не можете сгенерировать пару ключей RSA и зашифровать закрытый ключ своей строкой (используя симметричный алгоритм), а затем сохранить зашифрованный BLOB-объект локально?Таким образом, вместо генерации ключа каждый раз, когда ваше приложение запускается, оно может расшифровать ранее сохраненный ключ при условии, что строка (отпечаток машины?) Не изменится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...