我想通过 RSACryptoServiceProvider
来签名和验证数据为此,我需要公钥和私钥。
在我的项目中,我将MyPublic和私钥存储在XML文件中。
有一次,我生成了MyPublic和私钥
public bool SignutureCheckForVerify(string myData, byte[] SignedData)
{
...
RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();
RSAalg.FromXmlString(MyPublicKey());
return RSAalg.VerifyData(Encoding.ASCII.GetBytes(myData), new MineCryptoService(), SignedData);
...
}
private static string MyPublicKey()
{
return "<RSAKeyValue><Modulus>-----Pubic Key Here ----</RSAKeyValue>";
}
在上面,我展示了“通过公钥验证数据”
我的SignData方法类似。
在那里,
RSAalg.FromXmlString(GetPrivateKey());
...
RSAalg.SignData(...)
我的问题是;在某些例子中,我认识到了这一点;公钥和私钥通过crt / pem / cert等证书文件导入。在那里我存储在XML文件中。
我的解决方案错了吗?
第二个问题,
如果我使用此方法导入密钥
https://msdn.microsoft.com/en-us/library/tswxhw92(v=vs.110).aspx
GetKeyFromContainer( “MyKeyContainer”);
IS MyKeyContainer私钥和公钥是否静态?
每次运行时,我可以使用相同的私钥/公钥
或每次运行我都有不同的密钥集?强调文本
答案 0 :(得分:0)
我的解决方案是错误的吗?
这取决于您的要求和威胁模型。应将RSACryptoServiceProvider
的签名生成显式设置为除MD5或SHA-1之外的哈希。如果发生这种情况,你的问题就不清楚了。
如果我使用此方法导入密钥
https://msdn.microsoft.com/en-us/library/tswxhw92(v=vs.110).aspx
GetKeyFromContainer("MyKeyContainer");
MyKeyContainer私钥和公钥是静态的吗?
是的,无论如何,这是使用密钥存储区的一般想法。
每次运行时,我可以拥有相同的私钥/公钥吗?或者每次生成签名时我是否应该设置不同的密钥?
是的,你可以,因为你使用了足够的密钥大小,比如2048位或更高。
实际上,为了使您的解决方案安全,接收方需要信任公钥。如果没有建立信任,任何人都可以向他们发送他们的公钥。