使用自定义密钥解密SecureString

时间:2016-09-03 21:36:15

标签: c# powershell encryption symmetric-key

实际上我正在解密我在c#中用powershell创建的字符串。

我使用以下Powershell命令创建SecureString:

requests

我使用以下C#代码解密SecureString:

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

这在两个方向都可以正常工作,但现在我使用自己的密钥文件在Powershell中创建SecureString:

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

        }

我想在c#代码中更改哪些内容以使用特定的密钥文件?

1 个答案:

答案 0 :(得分:0)

指定密钥时,PowerShell使用System.Security.Cryptography.Aes - 类而不是ProtectedData进行加密,因此您需要进行一些更改。

  

如果使用Key或SecureKey指定加密密钥   参数,高级加密标准(AES)加密   使用算法。指定的密钥长度必须为128,192,   或256位,因为它们是AES支持的密钥长度   加密演算法。如果未指定密钥,则为Windows数据   Protection API(DPAPI)用于加密标准字符串   表示。

ConvertFrom-SecureString @ TechNet

就个人而言,我会在C#中使用ConvertTo-SecureString - cmdlet来避免重新发明轮子。

请参阅Aes Constructor @ MSDN和此previous SO-question了解C#-solution。