2017-06-13 16 views
1

にInvalidCastExceptionがで失敗し、私は次の操作を実行しよう:XMLは、.NET 4.6を使用して.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(); 

このコードを実行しているとき、私は方法GetDecryptionKey()によってスローされ、次のInvalidCastException取得:私の知る限りは、MSDNの例を理解しているとして、このコードからEncryptedKey要素を拾う必要があり

Object of type "System.Security.Cryptography.RSACryptoServiceProvider" cannot be cast to "System.Security.Cryptography.SymmetricAlgorithm". 

を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です:暗号化された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> 
+0

可能な場合は、ブレークポイントを追加することができ、この行の後に 'rsaKey = encryptionPfx.PrivateKey;'とrsaKeyはその後nullでないことを確認してください?これは、いくつかのオンライン検索の後で、あなたのコードは、いくつかの行を除いて完全に正しいと思われるからです(通常は 'RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);)。 –

+0

@KeyurPATEL' rsaKey'はこの行の後で、デバッガには、PFXファイルからロードされた正しいキーが含まれています。 –

+0

[mcve]を提供してください - あなたは 'GetDecryptionKey'について話しますが、これはあなたのメソッドの一部ではありません。 (もしあなたのメソッドが*あなたのメソッドであれば、そう言えばいいと思いますが、どのラインが例外をスローしているかを示しています...) –

答えて

0

。私が要素を新しいKeyInfo要素の子としてEncryptedKeyに移動すると、私のコードが機能します。 RSACryptoServiceProviderとして

<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> 
関連する問題