我对加载 XML 的必需/可选要求有点困惑DSACryptoServiceProvider
。
从这个网站,以下是架构:架构定义:
<element name="DSAKeyValue" type="ds:DSAKeyValueType"/>
<complexType name="DSAKeyValueType">
<sequence>
<sequence minOccurs="0">
<element name="P" type="ds:CryptoBinary"/>
<element name="Q" type="ds:CryptoBinary"/>
</sequence>
<element name="G" type="ds:CryptoBinary" minOccurs="0"/>
<element name="Y" type="ds:CryptoBinary"/>
<element name="J" type="ds:CryptoBinary" minOccurs="0"/>
<sequence minOccurs="0">
<element name="Seed" type="ds:CryptoBinary"/>
<element name="PgenCounter" type="ds:CryptoBinary"/>
</sequence>
</sequence>
</complexType>
但是,根据MSDN,DsaKeyValue XML 定义如下:
<DSAKeyValue>
<!-- Child elements -->
P,
Q,
G?,
Y,
J?,
Seed,
PgenCounter
</DSAKeyValue>
从 XML 导入时,我得到了错误的数据。以下是我的代码:
JsonDictionary privateKeyDictionary = (JsonDictionary) JsonReader.Parse(privateKey);
//FYI: this private signing key was generated using Keyczar.
var dsaParameterArray = privateKeyDictionary["publicKey"] as JsonDictionary;
DSACryptoServiceProvider signer = new DSACryptoServiceProvider(1024);
var pArray = Encoding.UTF8.GetBytes(dsaParameterArray["p"].ToString());
string p = Convert.ToBase64String(pArray);
var qArray = Encoding.UTF8.GetBytes(dsaParameterArray["q"].ToString());
string q = Convert.ToBase64String(qArray);
var gArray = Encoding.UTF8.GetBytes(dsaParameterArray["g"].ToString());
string g = Convert.ToBase64String(gArray);
var yArray = Encoding.UTF8.GetBytes(dsaParameterArray["y"].ToString());
string y = Convert.ToBase64String(yArray);
xml = String.Format("<DSAKeyValue><P>{0}</P><Q>{1}</Q><G>{2}</G><Y>{3}</Y><J/><Seed/><PgenCounter/></DSAKeyValue>", p, q, g, y);
doc = new XmlDocument();
doc.LoadXml(xml);
signer.FromXmlString(doc.InnerXml);
综上所述,我的问题是我的密钥中没有“J”、“Seed”和“PgenCounter”,因此我没有提供它们。根据 W3C,这是可选的。但是,我的密钥中确实有一个“x”,但不确定那是什么。
根据 W3C,Seed 和 PgenCounter 标签是可选的。但是,MSDN 根据需要对其进行了定义。
我试过删除 J、Seed 和 PgenCounter 标签,但这似乎没有帮助。
谢谢!