.NET RSA数据签名,我的假设是否正确?

时间:2011-10-17 19:58:55

标签: c# rsacryptoserviceprovider

我一直在深入研究.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();
    }
}

:有什么能阻止以后在客户端计算机上加载公钥(免除文件访问权限等),使用以下代码:

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“指定了无效标志。”,为什么就是它? 'Achivable'声音就像我想要的那样,不是吗?

:无论如何创建RSACryptoServiceProvider而不创建新的密钥对(因为我将在不久之后加载现有密钥)?

2 )根据MSDN,可以使用两个方法SignHashVerifyHash来使用私钥对某些任意数据的哈希进行签名,然后进行验证使用公钥来确保数据的有效性。

:如果我使用我的应用程序(嵌入式资源或base64编码的字符串等)分发公钥以验证已使用我的私钥进行哈希和签名的许可证密钥,该怎么办?确保没有其他人可以生成应用程序认为有效的许可证密钥(假设我将私钥保密)?毕竟,这就是公钥/私钥的用途,不是吗?

示例签名代码:

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

提前致谢。

0 个答案:

没有答案