2016-09-03 5 views
0

Eigentlich entschlüssle ich Strings, die ich mit Powershell in C# erstellt habe.Decrypt SecureString mit benutzerdefinierten Schlüssel

erstelle ich die Secure mit folgenden Powershell-Befehl:

ConvertTo-SecureString -String "TopSecret" -AsPlainText -Force | ConvertFrom-SecureString 

ich die Secure mit folgenden C# -Code zu entschlüsseln:

 string exportedData = string.Empty; 
     bool SecureStringOK = true; 

     try 
     { 
      // Read args[0] to string 
      exportedData = args[0]; 
     } 
     catch (System.IndexOutOfRangeException) 
     { 
      Console.WriteLine("NO_SECURESTRING"); 
      Debug.WriteLine("NO_SECURESTRING"); 
      SecureStringOK = false; 
     } 

     if (SecureStringOK) 
     { 

      // Decrypt the byte array to Unicode byte array 
      try 
      { 
       // Remove all new-lines 
       exportedData = exportedData.Replace(Environment.NewLine, ""); 

       // Convert the hex dump to byte array 
       int length = exportedData.Length/2; 
       byte[] encryptedData = new byte[length]; 
       for (int index = 0; index < length; ++index) 
       { 
        encryptedData[index] = byte.Parse(exportedData.Substring(2 * index, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture); 
       } 

       byte[] data = ProtectedData.Unprotect(encryptedData, (byte[])null, DataProtectionScope.CurrentUser); 

       // Convert Unicode byte array to string 
       string password = Encoding.Unicode.GetString(data); 

       // Write Output 
       Console.WriteLine(password); 
       Debug.WriteLine(password); 
      } 
      catch (System.Security.Cryptography.CryptographicException) 
      { 
       Console.WriteLine("WRONG_SECURESTRING: " + args[0]); 
       Debug.WriteLine("WRONG_SECURESTRING: " + args[0]); 
      } 
      catch (System.FormatException) 
      { 
       Console.WriteLine("WRONG_SECURESTRING_FORMAT: " + args[0]); 
       Debug.WriteLine("WRONG_SECURESTRING_FORMAT: " + args[0]); 
      } 

     } 

Dies funktioniert in beide Richtungen gut, aber jetzt erstelle ich die Secure in Powershell mit meiner eigenen Schlüsseldatei:

ConvertTo-SecureString -String "TopSecret" -AsPlainText -Force | ConvertFrom-SecureString -Key $KeyPath 

Irgendwelche Ideen was Ich muss den C# -Code ändern, um eine bestimmte Schlüsseldatei zu verwenden?

Antwort

0

Wenn Sie einen Schlüssel angeben, verschlüsselt PowerShell die System.Security.Cryptography.Aes-Klasse anstelle von ProtectedData, Sie müssen also einige Änderungen vornehmen.

Wenn ein Verschlüsselungsschlüssel mithilfe der Taste bzw. SecureKey Parameter angegeben ist, wird der Advanced Encryption Standard (AES) Verschlüsselung Algorithmus verwendet. Der angegebene Schlüssel muss eine Länge von 128, 192, oder 256 Bit haben, da dies die vom Verschlüsselungsalgorithmus AES unterstützten Schlüssellängen sind. Wenn kein Schlüssel angegeben ist, wird die Windows Data Schutz-API (DPAPI) verwendet, um die Standardzeichenfolge zu verschlüsseln.

ConvertFrom-SecureString @ TechNet

Persönlich würde ich die ConvertTo-SecureString -cmdlet in C# verwenden Sie das Rad zu vermeiden, neu zu erfinden.

Siehe Aes Constructor @ MSDN und previous SO-question für C# -Lösung.

Verwandte Themen