Подписание данных .NET RSA, мои предположения верны? - PullRequest
2 голосов
/ 17 октября 2011

Я копался в пространстве имен .NET System.Security.Cryptography, в частности, в классе 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();
    }
}

Q :Есть ли что-нибудь, что может предотвратить последующую загрузку открытого ключа на клиентском компьютере в более позднее время (освобождая права доступа к файлу и т. Д.), Используя такой код:

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 );
}

Q : Если указать Csp флаг CspProviderFlags.UseArchivableKey вместо CspProviderFlags.None, загрузка файла завершится неудачно (в rsa.FromXmlString ()) с CryptographicException «Указаны неверные флаги.», Почему это так?Звук «Достижимый» так же, как то, что я хочу, не так ли?

Q : есть ли способ создать RSACryptoServiceProvider без создания новой пары ключей (поскольку я загружу существующуювскоре после этого)?

2 ) Согласно MSDN, два метода SignHash и VerifyHash могут использоваться для подписи хэша некоторых произвольных данных, используя закрытый ключ,затем проверить с использованием открытого ключа, чтобы обеспечить достоверность данных.

Q : Что если я распространю открытый ключ вместе с моим приложением (встроенный ресурс или строка в кодировке base64 и т. Д.) Для проверки лицензионного ключа, который был хеширован и подписан с использованием моего личного ключа -могу ли я быть уверен, что никто другой не сможет сгенерировать лицензионные ключи, которые приложение считает действительными (при условии, что я храню закрытый ключ в секрете)?В конце концов, для этого нужны открытые / закрытые ключи?

Пример кода подписи:

using( SHA1 sha = SHA1.Create() ) {
    byte[] hash = sha.ComputeHash( data );
    byte[] signature = rsa.SignHash( hash, CryptoConfig.MapNameToOID( "SHA1" ) );
}

Заранее спасибо.

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