using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace APress.DotNetSecurity.Chapter2.PDBSample
{
class PDBSampleTester
{
static void Main(string[] args)
{
try
{
Console.WriteLine("Creating the salt...");
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] rngData = new byte[8];
rng.GetBytes(rngData);
Console.WriteLine("Salt value is " + ArrayToHexString(rngData));
PasswordDeriveBytes pwdDerive = new PasswordDeriveBytes("SuperSecretPassword",
rngData);
Console.WriteLine("Creating the IV...");
byte[] ivData = new byte[8];
rng.GetBytes(ivData);
Console.WriteLine("IV value is " + ArrayToHexString(ivData));
Console.WriteLine("Deriving the RC2 key...");
RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider();
byte[] RC2Key =
pwdDerive.CryptDeriveKey("RC2", "SHA", 128, ivData);
rc2.Key = RC2Key;
Console.WriteLine("Key value is " + ArrayToHexString(rc2.Key));
}
catch(CryptographicUnexpectedOperationException cuoe)
{
Console.WriteLine("CryptographicUnexpectedOperationException: "
+ cuoe.Message);
Console.WriteLine(cuoe.StackTrace);
}
catch(CryptographicException ce)
{
Console.WriteLine("CryptographicException: " + ce.Message);
Console.WriteLine(ce.StackTrace);
}
catch(Exception ge)
{
Console.WriteLine("Exception: " + ge.GetType().Name + " " + ge.Message);
Console.WriteLine(ge.StackTrace);
}
finally
{
Console.WriteLine("Press the return key to continue...");
Console.Read();
}
}
private static String ArrayToHexString(byte[] ByteData)
{
StringBuilder retVal = new StringBuilder();
foreach(byte b in ByteData)
{
retVal.Append(b.ToString("X2"));
retVal.Append(" ");
}
retVal.Remove(retVal.Length - 1, 1);
return retVal.ToString();
}
}
}