I have hacked together a small program from bits on the internet I've been learning C# with. It is supposed to take a secure string located in a file and decrypt and display the output in a console. This does not happen however there are no errors shown in VS and the build and debug sessions finish without any errors. I am just looking for a console to top up to display the string... can anyone tell me what I am doing wrong below?
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Linq;
namespace simple_vsphere_connect
{
class Program
{
static void Main(string[] args)
{
FileInfo file = new FileInfo("C:\\Users\\dude\\Desktop\\secret.txt");
if (!file.Exists)
{
SecureString password;
using (FileStream fs = file.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
{
byte[] bytes = new byte[fs.Length];
int numBytesToRead = (int)fs.Length;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
int n = fs.Read(bytes, numBytesRead, numBytesToRead);
if (n == 0)
break;
numBytesRead += n;
numBytesToRead -= n;
}
password = Encoding.Unicode.GetString(bytes).DecryptString();
}
Console.WriteLine(password.ToUnsecureString());
Console.ReadLine();
}
}
}
static class Extensions
{
public static readonly byte[] entropy = Encoding.Unicode.GetBytes("Salt Is Not A Password");
public static string EncryptString(this SecureString source)
{
if (source == null)
return null;
var encrypted = ProtectedData.Protect(Encoding.Unicode.GetBytes(source.ToUnsecureString()), entropy, DataProtectionScope.CurrentUser);
return Convert.ToBase64String(encrypted);
}
public static SecureString DecryptString(this string source)
{
if (source == null)
return null;
SecureString result = new SecureString();
try
{
var decrypted = ProtectedData.Unprotect(Convert.FromBase64String(source), entropy, DataProtectionScope.CurrentUser);
result = Encoding.Unicode.GetString(decrypted).ToSecureString();
}
catch
{
result = new SecureString();
}
return result;
}
public static SecureString ToSecureString(this IEnumerable<char> source)
{
if (source == null)
return null;
SecureString result = new SecureString();
foreach (char value in source)
result.AppendChar(value);
result.MakeReadOnly();
return result;
}
public static string ToUnsecureString(this SecureString source)
{
if (source == null)
return null;
var ptr = Marshal.SecureStringToBSTR(source);
try
{
return Marshal.PtrToStringBSTR(ptr);
}
finally
{
Marshal.ZeroFreeBSTR(ptr);
}
}
}
}