2016-09-03 127 views
0

實際上,我正在解密使用c#中的powershell創建的字符串。使用自定義密鑰解密SecureString

我創建了SecureString的以下PowerShell命令:

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

我解密SecureString的使用下面的C#代碼:

 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]); 
      } 

     } 

這工作正常,在這兩個方向,但現在我創建SecureString的中Powershell與我自己的密鑰文件:

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

任何想法什麼我必須改變在C#代碼使用特定的密鑰文件?

回答

0

指定密鑰時,PowerShell使用System.Security.Cryptography.Aes類加密,而不是ProtectedData,因此您需要進行一些更改。

如果通過使用密鑰或SecureKey 參數指定的加密密鑰,高級加密標準(AES)加密 算法。指定的密鑰長度必須爲128,192, 或256位,因爲這些密鑰是AES 加密算法所支持的密鑰長度。如果未指定密鑰,則使用Windows Data Protection API(DPAPI)加密標準字符串 表示法。

ConvertFrom-SecureString @ TechNet

就個人而言,我會使用ConvertTo-SecureString -cmdlet在C#中,以避免重新發明輪子。

請參閱Aes Constructor @ MSDN和這previous SO-question爲C#解決方案。

相關問題