2016-04-15 4 views
3

Nach der Arbeit an dem Code zum Entschlüsseln der SAML-Antwort sieht die entschlüsselte Zeichenfolge immer noch verschlüsselt aus. Entschlüssele ich es nicht mit dem richtigen Schlüssel, dem Verschlüsselungstyp, ist meine angehängte SAML-Antwort beschädigt oder was mache ich falsch? Klar verstehe ich SAML und die Verschlüsselung nicht genug, um das zu funktionieren.Entschlüsseln Die Antwort sieht immer noch falsch codiert aus

Im Folgenden sind die Schritte, die ich nahm:

  1. Haben Sie den privaten Schlüssel aus dem X509Certificate.
  2. Den verschlüsselten Verschlüsselungsschlüssel vom XML-Knoten erhalten: // xenc: VerschlüsselterKey // xenc: CipherData // xenc: CipherValue. Konvertiert das von Base64 Zeichenfolge in Byte [].
  3. die privaten Schlüssel RSACryptoServiceProvider
  4. die richtige Verschlüsselungsmethode gewöhnte unter Verwendung des verschlüsselten Schlüssel zu entschlüsseln: 128 AES
  5. die entschlüsselten Schlüssel aus Schritt 3 und der Verschlüsselungsalgorithmus verwendet, um den Chiffrewert von dem Knoten zu entschlüsseln:// xenc: EncryptedData // xenc: CipherData // xenc: CipherValue
  6. Hat Encoding.UTF8.GetString, um die entschlüsselten Daten in Zeichenfolge zu konvertieren.

Das Ergebnis sieht wie folgt aus:

CJ | = 9 \ U0003 \ u001f_] bLJ8DE \ u001c = /> P \ u001f \ u0012 \ u0005 (@ mƇG \ u000eh.f \

SAML-Antwort (geänderte Werte):

<?xml version="1.0" encoding="UTF-8"?> 
<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" Destination="https://cct.bananaqa.net/SignIn/SamlAcs" ID="_584d6720576184d6a6f7c396f850b019" InResponseTo="Banana_7a26613a-b24e-461c-af39-b5ea8e11be89" IssueInstant="2016-04-13T18:10:00.709Z" Version="2.0"> 
    <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://scb1.cct.edu/idp/shibboleth</saml2:Issuer> 
    <saml2p:Status> 
     <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" /></saml2p:Status> 
    <saml2:EncryptedAssertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"> 
     <xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" Id="_4cd6916c8c1adc98c371a202c6c50f4f" Type="http://www.w3.org/2001/04/xmlenc#Element"> 
      <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" /> 
      <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
       <xenc:EncryptedKey Id="_aa1cb5932dd3ed1a5d968e09f41c79e8" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"> 
        <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"> 
         <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" /> 
        </xenc:EncryptionMethod> 
        <ds:KeyInfo> 
         <ds:X509Data> 
          <ds:X509Certificate>MIIFODCCBCCgAwIBAgIJAOqAYZiaSD9SMA0GCSqGSIb3DQEBCwUAMIG0MQswCQYDVQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2.......BgwFoAUQMK9J47MNIMwojPX+2yz8LQsgM4wMwYDVR0RBCwwKoIUKi5hd2FyZHNwcmluZy1xYS5uZXSCEmF3YXJkc3ByaW5nLXFhLm5ldDAdBgNVHQ4EFgQUADqtjmhLN8HW6DDSOJ5PE2UVNKgwDQY.......Eh6G+GMByWVvSi80WXqnzV2oGTthFx3a2hyT3ndcr9RL17GE7wT5nw=</ds:X509Certificate> 
         </ds:X509Data> 
        </ds:KeyInfo> 
        <xenc:CipherData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"> 
         <xenc:CipherValue>......w8QEZG0qI/asmzbIDcP4ahkfeKQ96pUDg7xTtcPhKseRlOxUW7alwe2PHVYP9O0bWWxz/4Ih6kvl2cVPDql6QRpJAimmdY...==</xenc:CipherValue> 
        </xenc:CipherData> 
       </xenc:EncryptedKey> 
      </ds:KeyInfo> 
      <xenc:CipherData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"> 
       <xenc:CipherValue>.........SEGgqL4Kxr/Ddon78edBK4tSLUyLS12bmYHKQQRCauL9kuIskAQJdx8dMEW0dKC+r+n445Gc5k2fGuvIReIKRU4SgUloWhqme29SYC3La5t1k9QvGFuh7qc1/KrH/UAdtA47NfnxE4ZXdjTmAAwxrf41ARHFCEb5it9F8zvv21vfkACExYVQFY8Kgcww2augZldehH/Ycx4IdDVgGQmLz46HGrHfFM3y9Yy1GET1jELQ/R/HLc35KbFdzHa8fxKB4/boS+Yp2e6Sme62FCVJkSljP1XOGhfX/K+p6X67YR9Atyqova4UqNP+8Fv8qAlPM5kQC75WqKI2LtpjvngTG5MjqCUphZM/wKFKWFjH8D5YatK31xIcG9hqdxpDcq3Eh84tRPWKG+WF2Rl3kmjCy1XvyTPhcAqGna/BRtqcrtFrDY4GyOAJTtj.......</xenc:CipherValue> 
      </xenc:CipherData> 
     </xenc:EncryptedData> 
    </saml2:EncryptedAssertion> 
</saml2p:Response> 

gesamter Code-Block:

using System; 
using System.IO; 
using System.Linq; 
using System.Security.Cryptography; 
using System.Security.Cryptography.X509Certificates; 
using System.Security.Cryptography.Xml; 
using System.Text; 
using System.Xml; 

namespace Service.SSO 
{ 
public class Saml2DecryptResponse 
{ 
    private XmlNamespaceManager _nsManager; 
    private XmlDocument _xmlDoc; 

    public Saml2DecryptResponse(XmlDocument xmlDocument) 
    { 
     _xmlDoc = xmlDocument; 

     _nsManager = new XmlNamespaceManager(_xmlDoc.NameTable); 
     _nsManager.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#"); 
     _nsManager.AddNamespace("saml", "urn:oasis:names:tc:SAML:2.0:assertion"); 
     _nsManager.AddNamespace("samlp", "urn:oasis:names:tc:SAML:2.0:protocol"); 
     _nsManager.AddNamespace("xenc", "http://www.w3.org/2001/04/xmlenc#"); 
    } 

    public XmlNode GetDecryptedAssertion(X509Certificate2 myCert) 
    { 
     RSACryptoServiceProvider privateCsp = (RSACryptoServiceProvider)myCert.PrivateKey; 

     // load the xmlDoc 
     EncryptedXml encXml = new EncryptedXml(_xmlDoc); 
     XmlElement encryptedDataElement = _xmlDoc.GetElementsByTagName("xenc:EncryptedData")[0] as XmlElement; 
     EncryptedData encryptedData = new EncryptedData(); 
     encryptedData.LoadXml(encryptedDataElement); 

     //get your cipher data from the encrypted assertion key info 
     byte[] cipherBytes = GetKeyCipherValue(); 

     // use the RSACryptoServiceProvider to decrypt it 
     var symKey = privateCsp.Decrypt(cipherBytes, true); 

     // get the assertion data 
     byte[] dataCipherBytes = GetEncryptedAssertionData(); 

     // and the encryption method 
     string encMethod = GetEncryptionMethod(); 

     // build your symmetric algorythm, used to decrypt your assertion data 
     SymmetricAlgorithm symAlg = null; 
     symAlg = GetAlgorithm(encMethod); 
     symAlg.IV = encXml.GetDecryptionIV(encryptedData, encMethod); 

     // decrypt the assertion data 
     byte[] decryptedAssertionData = DecryptBytes(symAlg, dataCipherBytes, symKey, symAlg.IV); 
     string rawText = Encoding.UTF8.GetString(decryptedAssertionData); 

     // clean up the unencrypted text 
     int samlStart = rawText.IndexOf("<saml:Assertion"); 
     int samlEnd = rawText.IndexOf("</saml:Assertion>") + 17 - samlStart; 
     string cleanText = rawText.Substring(samlStart, samlEnd); 

     // turn it into an xml element and return it 
     XmlDocumentFragment fragment = _xmlDoc.CreateDocumentFragment(); 
     fragment.InnerXml = cleanText; 
     return fragment; 
    } 

    public static byte[] DecryptBytes(SymmetricAlgorithm algorithm, byte[] encryptedData, byte[] keyBytes, byte[] iv) 
    { 
     byte[] plainTextBytes; 

     int decryptedBytesCount; 

     using (var decryptor = algorithm.CreateDecryptor(keyBytes, iv)) 
     { 
      using (var memoryStream = new MemoryStream(encryptedData)) 
      { 
       using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) 
       { 
        plainTextBytes = new byte[encryptedData.Length]; 
        decryptedBytesCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); 

        memoryStream.Close(); 
        cryptoStream.Close(); 
       } 
      } 
     } 

     return plainTextBytes; 
    } 

    public byte[] GetKeyCipherValue() 
    { 
     var node = GetNode("//xenc:EncryptedKey//xenc:CipherData//xenc:CipherValue"); 
     return Convert.FromBase64String(node.InnerText); 
    } 

    public byte[] GetEncryptedAssertionData() 
    { 
     var node = GetNode("//xenc:EncryptedData//xenc:CipherData//xenc:CipherValue"); 
     return Convert.FromBase64String(node.InnerText); 
    } 

    public string GetEncryptionMethod() 
    { 
     XmlNode node = GetNode("//xenc:EncryptionMethod"); 
     return node.Attributes["Algorithm"].Value.Trim(); 
    } 

    public XmlNode GetNode(string xpath) 
    { 
     return _xmlDoc.SelectSingleNode(xpath, _nsManager); 
    } 

    private static SymmetricAlgorithm GetAlgorithm(string symAlgUri) 
    { 
     SymmetricAlgorithm symAlg = null; 

     switch (symAlgUri) 
     { 
      case EncryptedXml.XmlEncAES128Url: 
      case EncryptedXml.XmlEncAES128KeyWrapUrl: 
       symAlg = SymmetricAlgorithm.Create("Rijndael"); 
       symAlg.KeySize = 128; 
       symAlg.Padding = PaddingMode.None; 
       break; 
      case EncryptedXml.XmlEncAES192Url: 
      case EncryptedXml.XmlEncAES192KeyWrapUrl: 
       symAlg = SymmetricAlgorithm.Create("Rijndael"); 
       symAlg.KeySize = 192; 
       break; 
      case EncryptedXml.XmlEncAES256Url: 
      case EncryptedXml.XmlEncAES256KeyWrapUrl: 
       symAlg = SymmetricAlgorithm.Create("Rijndael"); 
       symAlg.KeySize = 256; 
       break; 
      case EncryptedXml.XmlEncDESUrl: 
       symAlg = SymmetricAlgorithm.Create("DES"); 
       break; 
      case EncryptedXml.XmlEncTripleDESUrl: 
      case EncryptedXml.XmlEncTripleDESKeyWrapUrl: 
       symAlg = SymmetricAlgorithm.Create("TripleDES"); 
       break; 
      default: 
       throw new ArgumentException("symAlgUri"); 
     } 

     return symAlg; 
    } 
} 
} 

Der Code meist aus genommen: http://www.bjw.co.nz/developer/misc/82-general-dev/1203-decrypting-a-saml-encrypted-assertion

Antwort