#c# #rsacryptoserviceprovider
#c# #rsacryptoserviceprovider
Вопрос:
Я копался в . System.Security.Cryptography
Пространство имен NET, в частности RSACryptoServiceProvider
класс. Он использует два метода для подписи данных, SignHash()
VerifyHash()
и у меня есть несколько вопросов относительно использования этого класса и методов.
1) При создании экземпляра RSACryptoServiceProvider
создается ключевая пара, например:
// 1 = RSA compatible. http://msdn.microsoft.com/en-us/library/1dh4wac4.aspx
CspParameters cspParams = new CspParameters( 1 );
cspParams.Flags = CspProviderFlags.NoFlags;
rsa = new RSACryptoServiceProvider( 2048, cspParams ); // rsa is a class member
rsa.PersistKeyInCsp = false;
Затем закрытый и открытый ключи можно сохранить на диск, используя следующий код:
public void WriteKeys( FileInfo file, bool includePrivateKey )
{
using( FileStream fs = new FileStream( file.FullName, FileMode.Create, FileAccess.Write, FileShare.None ) ) {
string xml = rsa.ToXmlString( includePrivateKey );
byte[] b = Encoding.UTF8.GetBytes( xml );
string base64 = Convert.ToBase64String( b );
b = Encoding.UTF8.GetBytes( base64 );
fs.Write( b, 0, b.Length );
fs.Close();
}
}
Вопрос: Есть ли что-нибудь, что может предотвратить последующую загрузку открытого ключа на клиентский компьютер позже (исключение прав доступа к файлам и т. Д.), Используя такой код, как этот:
private void ReadKeyFromFile( FileInfo keyFile )
{
byte[] b = File.ReadAllBytes( keyFile.FullName );
string base64 = Encoding.UTF8.GetString( b );
byte[] b = Convert.FromBase64String( base64 );
string xml = Encoding.UTF8.GetString( b );
rsa.FromXmlString( xml );
}
Вопрос: Если указать Csp-флаг CspProviderFlags.Используйте archivablekey вместо CspProviderFlags.Нет, загрузка файла завершается с ошибкой (в rsa.FromXmlString()) с CryptographicException «Указаны недопустимые флаги»., почему это? «Достижимый» звучит так же, как то, что я хочу, нет?
Вопрос: Существует ли возможность создания a RSACryptoServiceProvider
без создания новой пары ключей (поскольку вскоре после этого я загружу существующий ключ)?
2) Согласно MSDN, два метода SignHash
и VerifyHash
могут использоваться для подписи хэша некоторых произвольных данных с использованием закрытого ключа, затем проверяются с использованием открытого ключа для обеспечения достоверности данных.
Вопрос: Что, если я распространяю открытый ключ с моим приложением (встроенный ресурс или строка в кодировке base64 и т. Д.) Для проверки лицензионного ключа, который был хэширован и подписан с использованием моего закрытого ключа — могу ли я быть уверен, что никто другой не сможет генерировать лицензионные ключи, которые считаются действительными приложением (при условии, что ядержите закрытый ключ закрытым)? В конце концов, для этого и нужны открытые / закрытые ключи, не так ли?
Пример кода подписи:
using( SHA1 sha = SHA1.Create() ) {
byte[] hash = sha.ComputeHash( data );
byte[] signature = rsa.SignHash( hash, CryptoConfig.MapNameToOID( "SHA1" ) );
}
Заранее спасибо.
Комментарии:
1. Злоумышленник может просто декомпилировать ваш код и вставить свой собственный открытый ключ.
2. Очень много вопросов в 1. Не беспокойтесь о (дополнительных) сгенерированных ключах, у вас есть все инструменты для загрузки / сохранения / создания ключей. И вы правы в отношении процесса подписания, но, как прокомментировал @slaks в качестве лицензии, это тяжелый замок на картонной двери.
3. Ну, да, конечно. Такова проблема с любым программным обеспечением, независимо от языка. Даже запутывание кода и шифрование открытого ключа не будут на 100% защищены от определенного злоумышленника; они могут даже отключить всю проверку, что, вероятно, было бы проще. Теперь мой вопрос не о том, что может или не может сделать хакер, а о механизме криптографии.
4. Потому что вы не понимаете назначение открытого ключа. Это должно быть предоставлено кому-то, кто хочет использовать его для проверки источника сообщения. Лицензионный хакер не захотел бы этого, что сделало бы его бесполезным именно для тех людей, для которых, по вашему мнению, вы хотите его использовать.
5. Нет, спасибо. Не интересует.