C# DSACryptoServiceProvider.ToXmlString抛出';指定的标志无效';例外
我正在尝试使用DSACryptoServiceProvider生成密钥对 代码如下:C# DSACryptoServiceProvider.ToXmlString抛出';指定的标志无效';例外,c#,.net,cryptography,dsa,C#,.net,Cryptography,Dsa,我正在尝试使用DSACryptoServiceProvider生成密钥对 代码如下: var cspParameters = new CspParameters(); cspParameters.Flags = CspProviderFlags.CreateEphemeralKey; cspParameters.KeyContainerName = Guid.NewGuid().ToString(); DSA dsa = new
var cspParameters = new CspParameters();
cspParameters.Flags = CspProviderFlags.CreateEphemeralKey;
cspParameters.KeyContainerName = Guid.NewGuid().ToString();
DSA dsa = new DSACryptoServiceProvider(2048, cspParameters); // Generate a new 2048 bit RSA key
string publicPrivateKeyXML = dsa.ToXmlString(true);
string publicOnlyKeyXML = dsa.ToXmlString(false);
在
dsa.ToXmlString上(true)代码>我遇到以下异常:指定的标志无效。怎么了?最大的keysize属性是1024,请参阅本文:
“此算法支持从512位到1024位的密钥长度,增量为64位。”问题1:您必须要求一个支持DH的加密容器
问题2:密钥大小不能大于1024(Windows是哑的)
然而,通过测试,您将发现问题3:
问题3:CreateEphemeralKey被DSACryptoProvider悄悄忽略
如果你想要一份有效的DSAManaged,可以从Mono上获取一份。这里有几个问题
(无效标志的来源)您请求了一个临时密钥,但随后将其命名。命名密钥会将其标记为持久化;因此,您请求了一个持久化的临时密钥,系统被搞糊涂了
DSACryptoServiceProvider
不支持对DSA的FIPS-186-3更新。您需要使用DSA-1024,或者升级到.NET 4.6.2并使用DSACng
,它支持FIPS-186-3(增加的密钥大小和SHA-2(SHA256、SHA384、SHA512)散列)
默认的CspParameters
对象具有ProviderType
=24,这是用于RSA的。您需要使用13,这是用于DSA的。在wincrypt.h中,幻数不那么神奇(PROV_RSA_AES=24,PROV_DSS_DH=13)
如果您想要一个短暂的DSACryptoServiceProvider,最简单的方法是不指定CspParameters对象,让它使用默认值
其中任何一项工作:
{
const int PROV_DSS_DH = 13;
var cspParameters = new CspParameters(PROV_DSS_DH);
DSA dsa = new DSACryptoServiceProvider(1024, cspParameters);
string publicPrivateKeyXML = dsa.ToXmlString(true);
string publicOnlyKeyXML = dsa.ToXmlString(false);
}
{
const int PROV_DSS_DH = 13;
var cspParameters = new CspParameters(PROV_DSS_DH);
cspParameters.Flags = CspProviderFlags.CreateEphemeralKey;
DSA dsa = new DSACryptoServiceProvider(1024, cspParameters);
string publicPrivateKeyXML = dsa.ToXmlString(true);
string publicOnlyKeyXML = dsa.ToXmlString(false);
}
{
DSA dsa = new DSACryptoServiceProvider(1024);
string publicPrivateKeyXML = dsa.ToXmlString(true);
string publicOnlyKeyXML = dsa.ToXmlString(false);
}
回答错了。看,你是对的,使用了太大的尺寸,但将尺寸更改为1024,它仍然会变大。
{
const int PROV_DSS_DH = 13;
var cspParameters = new CspParameters(PROV_DSS_DH);
DSA dsa = new DSACryptoServiceProvider(1024, cspParameters);
string publicPrivateKeyXML = dsa.ToXmlString(true);
string publicOnlyKeyXML = dsa.ToXmlString(false);
}
{
const int PROV_DSS_DH = 13;
var cspParameters = new CspParameters(PROV_DSS_DH);
cspParameters.Flags = CspProviderFlags.CreateEphemeralKey;
DSA dsa = new DSACryptoServiceProvider(1024, cspParameters);
string publicPrivateKeyXML = dsa.ToXmlString(true);
string publicOnlyKeyXML = dsa.ToXmlString(false);
}
{
DSA dsa = new DSACryptoServiceProvider(1024);
string publicPrivateKeyXML = dsa.ToXmlString(true);
string publicOnlyKeyXML = dsa.ToXmlString(false);
}