使用C#解密PowerShell中的SecureString

3
我有以下 PowerShell 代码来加密我的密码: $my_secure_password = convertto-securestring "myPW" -asplaintext -force $my_encrypted_string = convertfrom-securestring $my_secure_password -key(1..16)
输出结果类似于
76492d1116743f0423413b16050a5345MgB8AHMASgB1AFMARwBxAFMAYgA1AFIAYwAyAE4AOABqAHMAOQBaADgAbwBGAEEAPQA9AHwANwBk................。
如何在 C# 中解密此输出以便在 C# 中将其用作 SecureString?
我尝试了以下内容,但对我没有用:
var runSpace_new = RunspaceFactory.CreateRunspace();
runSpace_new.Open();

PowerShell PSinstance = PowerShell.Create();
PSinstance.AddScript("$decrypt = convertto-securestring -key (1..16) -string 76492d1116743f0423413b.......");
var psOutput_new = PSinstance.Invoke();
var a = runSpace_new.SessionStateProxy.PSVariable.GetValue("decrypt");

但是a为空....

更新 我已经找到了解决方法:

SecureString new_sec_pass = new SecureString();
PowerShell instance = PowerShell.Create();

instance.AddScript("convertto-securestring -key (1..16) -string 76492d1...");

foreach (PSObject psOutput in instance.Invoke())
{
    new_sec_pass = psOutput.BaseObject as SecureString;
}

PSCredential new_credentials = new PSCredential(Username, new_sec_pass);
1个回答

1
你可以尝试这个(对我而言有效,也许对你有帮助):
using System.Collections.ObjectModel;
using System.Management.Automation;

     static void Main(string[] args)
        {

            var variable = PowerShell.Create().AddScript("$xtr = convertto-securestring -key (1..16) -string" + 
            " '76492d1116743f0423413b16050a5345MgB8AEQAbQBIAEIASQB6ADcAeQA0AH" + 
            "UAaAB6AFEAawBJAEYAVAA0AHcAUwBoAGcAPQA9AHwAMQAzAGUANwBmADIAOAAxADEANwAwAGUAZQBjADMANwBlAG" +
            "QAYQAxADcAZABlADEAMQBhAGYAZgBiADkAOQBiADIAMAAwAGMAMgA1AGEAZgAxADcAMABhADAAYwBjAGIAMQBhADAAZAAwADMAMwAzADMAOQAwADcAYQAzAGMANwA='" + 
            ";$PwdPointer = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($xtr);"+
            "$PlainTextPassword = [Runtime.InteropServices.Marshal]::PtrToStringAuto($PwdPointer);$PlainTextPassword").AddCommand("out-string");
        Collection<PSObject> results = variable.Invoke();

            foreach (var str in results)
            {

                Console.WriteLine(str);
                Console.ReadKey();

            }
        }

当我执行这个操作时,str是= System.Security.SecureString。但是我该如何在var credentials = new PSCredential(Username, new_sec_pass);中使用它呢? - user7445564
好的。你能做到这个吗?:foreach (var str in results) `{ Console.WriteLine(Convert.ToString(str)); Console.ReadKey(); }` - Vitaly
我的脚本看起来像这样:`instance.AddScript("$decryptedpw = convertto-securestring -key (1..16) -string 76492d1.....; $decryptedpw").AddCommand("out-string"); var psOutput = instance.Invoke(); foreach (var result in psOutput) { Console.WriteLine(result); Console.WriteLine(Convert.ToString(result));` 两者输出结果相同:System.Security.SecureString - user7445564
是的,抱歉,你可以进行转换。我编辑了我的回答。如果你运行这段代码,它会将你的安全字符串转换为不安全的密码。 - Vitaly
谢谢。请查看我的第一篇帖子中的更新,我已经找到了另一个解决方案。 - user7445564
你真是个牛人。这对我很有帮助。 - Cameron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接