Utilities.cs 原始程式碼 (CNG 範例)
Utilities.cs 檔案提供您 Cryptography Next Generation (CNG) 安全通訊範例所使用的公用程式方法。其中包含下列程式碼。
using System; // IDisposable interface
using System.Diagnostics; // Process control
using System.Runtime.InteropServices; // MoveWindow, GetConsoleWindow Win32 APIs
public partial class CNG_SecureCommunicationExample
{
static string sep = "------------------------------------" +
"------------------------------------",
sep1 = sep + "\n", sep2 = "\n" + sep1;
static string MyName;
// Application control flags
static int Version = 0; // 1 - Plaintext, 2 - Encryption, 3 - Signing
// 4 - Private digital signature, 5 - Termination
static bool fVerbose; // Display encrypted output
static bool fMallory; // Disable Mallory
[DllImport("user32.dll")]
public static extern bool MoveWindow(IntPtr hwnd, int x, int y,
int nWidth, int nHeight, bool bRepaint);
[DllImport("kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
// Run the Bob and Mallory executable.
// If Alice.exe is a standalone process, it is not being run from
// the Visual Studio debugger; therefore, it must programatically
// run Bob and Mallory.
static bool Autoloader()
{
Process [] AliceProcess = Process.GetProcessesByName("Alice");
if (AliceProcess.Length > 0)
{
try {
Process.Start("bob.exe");
Process.Start("mallory.exe");
}
catch(Exception e)
{
Display("\nFailure loading Bob.exe or Mallory.exe:\n"
+ e.Message + "\n",1);
return false;
}
}
return true;
}
// Set console size, position, title
static void InitConsole(string name, int left, int top)
{
Console.Clear();
IntPtr hwnd = GetConsoleWindow();
MoveWindow(hwnd, left, top, 600, 500, true);
Console.SetBufferSize(72, 500);
MyName = name;
SplashScreen();
}
// Provide titling services
static void SplashScreen()
{
Console.Clear();
Display(" Cryptography Next Generation " +
"Secure Communication Example\n\n" + sep);
Console.Title = "Hi, I'm " + MyName + "!";
}
// Prompt user for input.
// fBlankOkay = true if blank lines are acceptable
static string ReadALine(bool fBlankOkay)
{
while (true)
{
Display(":> ", 1);
Display("", 3);
string s = Console.ReadLine();
if (fBlankOkay)
return s;
if ("" != s)
return s;
}
}
// Read until a character from list is entered.
// Do not accept a blank.
static string ReadAChar(string options)
{
while(true)
{
string s = ReadALine(false); // No blanks allowed.
if (options.Contains(s))
return s;
}
}
// Display session options, prompt for input
static string InitializeOptions()
{
string s;
if ("Alice Green" == MyName)
{
Display("Please select a security model:\n\n" +
"1 = Plaintext only\n" +
"2 = Encrypt messages\n" +
"3 = Encrypt messages, use public key to digitally sign messages.\n" +
"4 = Encrypt messages, use private key to digitally sign messages.\n" +
"5 = Encrypt messages, use private key to digitally sign messages\n" +
" and cryptographic keys. Terminate on all security failures.\n" +
"x = Exit\n\n", 1);
s = ReadAChar("12345x");
if ("x" == s) return "exit";
Version = Int32.Parse(s);
Display("Include Mallory? Y/N\n", 1);
fMallory = "y" == ReadAChar("ynYN") ? true : false;
if (Version != 1)
{
Display("Verbose output mode? Y/N\n", 1);
fVerbose = "y" == ReadAChar("ynYN") ? true : false;
}
}
Console.Clear();
Console.Title = "Hi, I'm " + MyName + "!";
Console.Title += " Security Version " + Version;
Display(" Cryptography Next Generation Secure Communication Example\n\n" +
"Security Version: " + Version +
" Mode: " + (fVerbose ? "Verbose" : "Regular") +
" Mallory: " + (fMallory ? "Yes":"No") +
" Signatures: " + (Version >= 3? "Yes":"No"));
Display(sep2, 1);
return (fVerbose ? "y" : "n") + (fMallory ? "y" : "n") + Version;
}
// Calls
static void Display(string s)
{
Display(s, MyColor);
}
/////////////////////////////////////////////////////////////////////////////////////////
// NAME Display: Ouput function that wraps Console.Write calls and
// colors the output message.
//
// PARAMETERS: string DisplayString: Output message.
// int color: Output message color. If no color, use yellow.
//
// COLOR USE DESCRIPTION
// ------------------------------------------------------------------------
// 0 Red Security failures Error message displayed to the user
// 1 Yellow Default color Options menu and application messages
// 2 White Bob's color Messages from Bob White
// 3 Cyan User's color User input
// 4 Green Alice's color Messages from Alice Green
// 5 Majenta Mallory's color Messages from Mallory Purple
// 6 Yellow Default color Application Restart prompt
// 7 Gray Encrypted data
//
// RETURN: string: "r": rerun the application
// "exit": close the application
//
// OPERATION: 1. Set ConsoleColor to color. If color is not specified,
// the default yellow color is set.
// 2. Write the DisplayString in the requested color.
// 3. Process Continue functionality if color = 6.
// Display("", 6) will generate a prompt, and query the user
// to continue the application.
//
/////////////////////////////////////////////////////////////////////////////////////////
static void Display(string DisplayString, int color)
{
ConsoleColor[] cc = { ConsoleColor.Red, ConsoleColor.Yellow,
ConsoleColor.White, ConsoleColor.Cyan,
ConsoleColor.Green, ConsoleColor.Magenta,
ConsoleColor.Yellow,ConsoleColor.Gray
};
Console.ForegroundColor = cc[color];
Console.Write(DisplayString);
if (6 == color)
{
Console.WriteLine(sep + sep +
"Press the enter key to continue\n\n");
Console.ReadLine();
}
}
} // End Utilities.cs: public partial class CNG_SecureCommunicationExample