与非对称密钥解密XML失败,InvalidCastException的.NET中
问题描述:
使用.NET 4.6我尽量做到以下几点:与非对称密钥解密XML失败,InvalidCastException的.NET中
- 负载从一个PFX文件解密的密钥。
- 解密XML文档与从上面的文件中的私钥。
我的代码基于来自MSDN的How to: Decrypt XML Elements with Asymmetric Keys。
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = "XML_ENC_RSA_KEY";
// Load PFX
X509Certificate2 encryptionPfx = new X509Certificate2(@"file.pfx", "test_password");
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey = encryptionPfx.PrivateKey as RSACryptoServiceProvider;
// Decrypt XML
EncryptedXml encryptedXml = new EncryptedXml(xmlDocument);
encryptedXml.AddKeyNameMapping("TESTKEY", rsaKey);
encryptedXml.DecryptDocument();
当运行该代码出现以下InvalidCastException
这是由该方法GetDecryptionKey()
抛出:
Object of type "System.Security.Cryptography.RSACryptoServiceProvider" cannot be cast to "System.Security.Cryptography.SymmetricAlgorithm".
据我理解了MSDN例如,此代码应该拿起从EncryptedKey
元件XML并使用RSA密钥解密密钥。
我在这里错过了什么?
下面是完整的堆栈跟踪:
System.InvalidCastException wurde nicht behandelt.
HResult=-2147467262
Message=Das Objekt des Typs "System.Security.Cryptography.RSACryptoServiceProvider" kann nicht in Typ "System.Security.Cryptography.SymmetricAlgorithm" umgewandelt werden.
Source=System.Security
StackTrace:
bei System.Security.Cryptography.Xml.EncryptedXml.GetDecryptionKey(EncryptedData encryptedData, String symmetricAlgorithmUri)
bei System.Security.Cryptography.Xml.EncryptedXml.DecryptDocument()
bei XML_Encryption_Tools.XmlDecryption.DecryptDocument(XmlDocument xmlDocument) in C:\Users\user\Documents\Visual Studio 2015\Projects\XML Encryption Tools\XML Encryption Tools\XmlDecryption.cs:Zeile 38.
bei XML_Encryption_Tools.Program.Main(String[] args) in C:\Users\user\Documents\Visual Studio 2015\Projects\XML Encryption Tools\XML Encryption Tools\Program.cs:Zeile 17.
bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
InnerException:
这是加密的XML:
<xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" Id="G051f21d6-44b8-4ca8-abcd-bcec94a81ffa" Type="http://www.w3.org/2001/04/xmlenc#Element">
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
<dsig:KeyInfo xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
<dsig:KeyName>TESTKEY</dsig:KeyName>
<xenc:EncryptedKey Id="EK65c1fdc2-a757-4482-8238-1d19c5d05006">
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p">
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
</xenc:EncryptionMethod>
<xenc:CipherData>
<xenc:CipherValue>Here is cipherValue_1</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedKey>
</dsig:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>Here is cipherValue_2</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
答
经过紧张的调试看来,如果加密的XML是不太正确的。如果我的KeyName
元素移动到一个新的KeyInfo
元素为EncryptedKey
个孩子,我的代码工作。
<xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" Id="G051f21d6-44b8-4ca8-abcd-bcec94a81ffa" Type="http://www.w3.org/2001/04/xmlenc#Element">
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
<dsig:KeyInfo xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
<!-- This KeyName is found but not associated with the encrypted key. -->
<dsig:KeyName>TESTKEY</dsig:KeyName>
<xenc:EncryptedKey Id="EK65c1fdc2-a757-4482-8238-1d19c5d05006">
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p">
<!-- If I place the KeyInfo and KeyName here, my code works. -->
<dsig:KeyInfo xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
<dsig:KeyName>TESTKEY</dsig:KeyName>
</dsig:KeyInfo>
<dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
</xenc:EncryptionMethod>
<xenc:CipherData>
<xenc:CipherValue>Here is cipherValue_1</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedKey>
</dsig:KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>Here is cipherValue_2</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
如果可能的话,你可以在这行之后添加一个断点:rsaKey = encryptionPfx.PrivateKey作为RSACryptoServiceProvider;'确保rsaKey在此之后不为空?这是因为一些网上搜索后,似乎你的代码是除了那些几行完全正确的(通常它'的RSACryptoServiceProvider rsaKey =新的RSACryptoServiceProvider(cspParams);') –
@KeyurPATEL的'rsaKey'不为空此行之后,并根据调试器它包含从PFX文件加载的正确密钥。 –
请提供一个[mcve] - 你谈论'GetDecryptionKey',但这不是你方法的一部分。 (或者,如果*是*你的方法,这将是值得这么说的话,并显示该行抛出异常......) –