实际上我正在解密我在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#代码中更改哪些内容以使用特定的密钥文件?
答案 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。