2011-07-06 2 views
8

Я хотел бы, чтобы сгенерировать пару ключей и просто ввести что-то вроде:Простой rsa-шифрование/дешифрование в .NET?

Rsa.Decrypt(data, privateKey); 
Rsa.Encrypt(data, publicKey); 

Есть ли простой способ сделать это? Я знаю, что есть что-то вроде RsaCryptoServiceProvider, но для создания подходящего объекта ему нужен XML. Я хотел бы хранить частный/открытый ключ в виде простой строки (не XML), который я помещу в web.config в:

<appSettings> 
    <add key="MyPublicKey" value"...."/> 
    <add key="MyrivateKey" value"...."/> 
</appSettings> 

А потом я буду шифровать web.config, так что все будет в безопасности (IIS справится с этим). Возможно ли это сделать таким образом?

+0

Не шифруйте произвольные данные с помощью RSA. RSA * очень * хрупкий и должен использоваться правильно с правильным заполнением и т. Д. Чтобы зашифровать произвольные данные, вы должны использовать комбинацию RSA и блок-шифр. – CodesInChaos

+1

На вопрос сразу возникают два вопроса: во-первых, как вы планируете безопасно связывать открытый ключ с получателем сообщения? Помните, что криптография с открытым ключом является такой же безопасной, как и система управления ключами. Во-вторых, неужели вам не кажется безумно опасным поставить * закрытый * ключ в известный файл, такой как web.config? Я бы сохранил свой секретный ключ в системе, специально разработанной для хранения конфиденциальных данных, а не просто вставляя ее в web.config. –

+3

@CodeInChaos: другими словами, используйте известный стандарт, такой как синтаксис криптографического сообщения или PGP (с .net, CMS, вероятно, лучше поддерживается). @ Эрик: как для закрытого ключа, если web.config хорошо защищен (и я полагаю, что у большинства клиентов не должно быть доступа к нему), тогда это так же хорошо, как и любое другое. Если вы храните его в надежном месте, вы можете быть защищены от копирования, но вам все равно нужно получить к нему доступ из автоматизированной системы, итак, где вы храните ключ доступа/пароль? (для очень надежных систем вы, конечно, можете использовать HSM или TPM). –

ответ

10

Создание объекта RSACryptoServiceProvider с привилегированной вашего размера клавиш (512/1024/2048 ...):

int keySize = 1024; 
m_ServiceProvider = new RSACryptoServiceProvider(keySize); 

Или использовать по умолчанию размер:

m_ServiceProvider = new RSACryptoServiceProvider(); 

Затем использовать ExportParameters, чтобы получить то, что вам нужно в массиве байтов, например, чтобы получить модульную часть использования открытого ключа:

byte[] publicModulus = m_ServiceProvider.ExportParameters(true).Modulus; 

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

, а затем вам нужно только, чтобы преобразовать массив байтов в строку:

string publicModulusStr = Convert.ToBase64String(modulus); 

Позже, когда вы хотите прочитать из web.config и и воссоздать объект RSACryptoServiceProvider, создать RSAParameters объект с текстом вы сохранили в файле, а затем передаете RSAP-параметры в конструктор RSACryptoServiceProvider.

И только примечание: файл web.config, который вы сохраняете, должен храниться в очень закрытом состоянии, поскольку вы храните свои секретные ключи внутри.

Смежные вопросы