Write a C++ program to encrypt a file using a key of a certain length. Text encr
ID: 3620542 • Letter: W
Question
Write a C++ program to encrypt a file using a key of a certain length. Text encryption is discussed below in detail. Your program should ask the user to input the file name that contains the text to be encrypted, the key (password) to encrypt the text, and the output file where the cipher text will be stored. Remember that the XOR operator is commutative, meaning that the same key will reverse the text cipher and retrieve you the original text. Your program should be intuitive and must not crash!!! After the program finishes execution, ask the user whether or not to run it again.A sample run of my cipher program would be:
Please enter the name of the file you want to encode/decode > myDocument.txt
Please enter the cipher key > 10*myPasswd
Name of the output file > myCipher.txt
myDocument.txt succesfully XORed with your key into myCipher.txt
Do you wish to run the program again? (y/n) > n
Exiting.......
XOR Operator
Remember the XOR operator discussed in class. It has a very neat commutative property most routinely used in cryptology. Remember the XOR table given inputs A and B:
1xor1=>0
1xor0=>1
0xor1=>1
0xor0=>0
Given a message M and an encryption key K , M XOR K = C . C is a ciphered message M . It also stands that C XOR K = M , therefore M XOR K = C XOR K.
Therefore, having a message M = "b" and key K = "t", the encrypted text C = " ?". Why?
Looking at the ASCII table a HEX of "b" is 62h which in binary is 0 1 1 0 0 0 1 0
An ASCII hexadecimal value for "t" is 74 which translated to binary is 0 1 1 1 0 1 0 0
Thus, if we apply an XOR operator on the two binary value we get 0 0 0 1 0 1 1 0
In other words, a hexadecimal 16h, which according to the ASCII table is equivalent of ? .
ASCII represents your newly encrypted string. If you were to run the ASCII string through your XOR loop, XORing the string with your secret key, you would get your original text back.
Explanation / Answer
using System.IO;
using System.Security;
using System.Security.Cryptography;
using System.Runtime.InteropServices;
using System.Text;
namespace EncryptDecrypt
{
class Class1
{
// Call this function to remove the key from memory after use for security
[System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint = "RtlZeroMemory")]
public static extern bool ZeroMemory(IntPtr Destination, int Length);
// Function to Generate a 64 bits Key.
static string GenerateKey()
{
// Create an instance of Symetric Algorithm. Key and IV is generated automatically.
DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
// Use the Automatically generated key for Encryption.
return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
}
static void EncryptFile(string sInputFilename,
string sOutputFilename,
string sKey)
{
FileStream fsInput = new FileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);
FileStream fsEncrypted = new FileStream(sOutputFilename,
FileMode.Create,
FileAccess.Write);
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = DES.CreateEncryptor();
CryptoStream cryptostream = new CryptoStream(fsEncrypted,
desencrypt,
CryptoStreamMode.Write);
byte[] bytearrayinput = new byte[fsInput.Length];
fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Close();
fsInput.Close();
fsEncrypted.Close();
}
static void DecryptFile(string sInputFilename,
string sOutputFilename,
string sKey)
{
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
//A 64 bit key and IV is required for this provider.
//Set secret key For DES algorithm.
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
//Set initialization vector.
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
//Create a file stream to read the encrypted file back.
FileStream fsread = new FileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);
//Create a DES decryptor from the DES instance.
ICryptoTransform desdecrypt = DES.CreateDecryptor();
//Create crypto stream set to read and do a
//DES decryption transform on incoming bytes.
CryptoStream cryptostreamDecr = new CryptoStream(fsread,
desdecrypt,
CryptoStreamMode.Read);
//Print the contents of the decrypted file.
StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
fsDecrypted.Flush();
fsDecrypted.Close();
}
static void Main()
{
// Must be 64 bits, 8 bytes.
// Distribute this key to the user who will decrypt this file.
string sSecretKey;
// Get the Key for the file to Encrypt.
sSecretKey = GenerateKey();
// For additional security Pin the key.
GCHandle gch = GCHandle.Alloc(sSecretKey, GCHandleType.Pinned);
// Encrypt the file.
EncryptFile(@"C:MyData.txt",
@"C:Encrypted.txt",
sSecretKey);
// Decrypt the file.
DecryptFile(@"C:Encrypted.txt",
@"C:Decrypted.txt",
sSecretKey);
// Remove the Key from memory.
ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2);
gch.Free();
}
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.