2

System.Security.Cryptography私は.NET名前空間、特にRSACryptoServiceProviderクラスを掘り下げてきました。データの署名に使用する2つのメソッドが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:CspProviderFlags.Noneの代わりにCspフラグCspProviderFlags.UseArchivableKeyを指定すると、CryptographicException「無効なフラグが指定されました。」でファイルのロードが失敗します(rsa.FromXmlString()で)。なぜですか?「達成可能な」音は私が欲しいものと同じですよね?

QRSACryptoServiceProvider新しいキーペアも作成せずに作成する方法はありますか(すぐに既存のキーをロードするため)?

2)MSDNによると、2つの方法SignHashVerifyHash使用して、秘密鍵を使用して任意のデータのハッシュに署名し、公開鍵を使用して検証してデータの有効性を確認できます。

Q:公開鍵をアプリケーション(埋め込みリソースやbase64でエンコードされた文字列など)と一緒に配布して、秘密鍵を使用してハッシュおよび署名されたライセンス鍵を検証するとどうなりますか?他の誰もライセンス鍵を生成できないことを確認できますか?アプリケーションによって有効と見なされるもの(秘密鍵を秘密にしておくと仮定)?結局のところ、それが公開/秘密鍵の目的ですよね?

署名コードの例:

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

前もって感謝します。

4

0 に答える 0