Introduction
As a general user I have never come across a security tool to encrypt my data except Bit Locker in Windows. Unfortunately, Bit Locker never worked for me. Though, we have compression tools like WinZip or WinRAR that actually compress the data. In fact, what they do is different from encryption/decryption.
You have many third-party solutions to do it. And the most popular one is TrueCrypt.
So, today we will make that kind of software/tool to do those odd jobs.
So, prepare yourself to create a look-alike tool.
Background
In background knowledge we need a basic C# idea and a few .NET framework classes.
So, I must say it is a Beginner Level Project.
Let us look up in Solution Explorer.
In this project, we have two forms (named MainForm and Settings). Additionally, we have a Resource folder that actually holds an image file and icons used in the project.
There is a back-end class that does the actual job of the project (or, I declare the class as "KERNEL").
Procedure
Step 1
First, we will start from MainForm.cs.
It looks like:
The main part of this portion is a TabControl where we have three tabs: Split, Join and About.
In the Split section, we will do our encoding. Actually, it splits your desired file (that you will select) into a number of encrypted files.
Then, in the Join portion we combine the encrypted files into one file (the same as initially).
Step 2
Let’s start the coding section from the Join portion.
With this, we select our desired file that we want to be encrypted in the near future.
For this, we want an OpenFileDialog, TextBox and a Button.
In the Button, we code:
private void browseButton_Click(object sender, EventArgs e)
{
//Browse Button
//No. Of Days : Numeric Up Down
if (noOfFileUpDown.Value != 0)
SplitButton.Enabled = true;
// TextBox Disabled
sourceLocationTextBox.Enabled = true;
if (sourceFileDialog.ShowDialog() == DialogResult.OK)
{
sourceLocationTextBox.Text = sourceFileDialog.FileName.ToString();
}
}
Explanation
"noOfFileUpDown" is a Numeric Up Down control and it sets the total number of distributions of your selected file.
So, the "Split" button will be enabled when you assign at least 1 (specifically, it should not be equal to 0) to the NumericUpDown control.
Next, we enable the TextBox that stores the path of the selected file.
Finally, if the Dialog Result is Ok then it will assign the selected file’s path to the TextBox else not.
Step 3
The Numeric Up Down control that decides how many divisions of selected file.
In the code:
private void noOfFileUpDown_ValueChanged(object sender, EventArgs e)
{
if (sourceLocationTextBox.Enabled==true)
SplitButton.Enabled = true;
}
Explanation
It it is enabled when the user selects a File from the Open File Dialog.
Step 4
When the user clicks this button then it Pops-up the Settings Form.
For that, the code will be:
private void settingButton_Click(object sender, EventArgs e)
{
Settings sett = new Settings();
sett.Show();
}
Where "Setting" is the name of the form (technically, it is the name of the class).
And, the show() method will pop-up the form.
Step 5
Let’s move to the Settings form.
And, its job is to set the default location for the destination (or, location for the output files).
Here, we have used a TextBox, two Buttons and a Folder Dialog.
Note: I have a default text value as my Desktop path, you can have your own.
So, the code for the yellow Button will be (in other words Browse):
private void folderBrowse_Click(object sender, EventArgs e)
{
folderDisplayTextBox.Enabled = true;
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
folderDisplayTextBox.Text = folderBrowserDialog1.SelectedPath;
BackEnd.outputFolder = folderDisplayTextBox.Text.ToString();
}
}
The same as done earlier, assign the selected path of the folder. So, I am skipping the explanation part for this code.
Step 6
Before I move to the Check button (green one) I want to show you the so called Kernel class (BackEnd.cs) where I have defined a few public property variables.
public static string folderDetination { get; set; }
public static string fileSource { get; set; }
public static int noOfFiles { get; set; }
public static string outputFolder { get; set; }
public static String extension { get; set; }
I want you to become aware of these property variables that are static in nature. And, I will use these frequently.
Step 7
Back to the "Setting.cs" form, where we have a Big button (check) that finishes the job.
Let’s see what is there.
private void button1_Click(object sender, EventArgs e)
{
// Ok Button
BackEnd myBackEnd = new BackEnd();
// myBackEnd.folderDetination = folderDisplayTextBox.Text.ToString();
BackEnd.folderDetination = folderDisplayTextBox.Text.ToString();
MessageBox.Show("Your Destination Path is : " + BackEnd.folderDetination);
//Close The Form
this.Close();
}
Here, we have assigned the folderDisplayTextBox (only TextBox) to the BackEnd’s Property that I have shown you in the previous step.
Doing this, we can use this value in the MainForm for processing.
At last, we call the Close() method to close the form.
Step 8
Back to the Main form, we have Split still there.
So, let’s code that which will call a user-defined SplitMethod() in the BackEnd class to do the split.
And, this method requires three arguments.
The first is the folder destination where we will finally put the split file (in other words the output files).
Then the second argument will be the source file that will be split.
And the last argument will be how many divisions there will be of the selected file.
So, let’s see how the code looks like for this.
private void SplitButton_Click(object sender, EventArgs e)
{
//Split Button Clicked
BackEnd.fileSource = sourceLocationTextBox.Text.ToString();
BackEnd.noOfFiles = int.Parse(noOfFileUpDown.Value.ToString());
//MessageBox.Show("Source : " + BackEnd.fileSource + " -- No. Of Files is : " + BackEnd.noOfFiles + " and -- Your Destination : " + BackEnd.folderDetination);
bool status = BackEnd.SplitMethod(BackEnd.folderDetination, BackEnd.fileSource, BackEnd.noOfFiles);
if (status == true)
MessageBox.Show("Your File Has Successfully Coded :)", "Success Report", MessageBoxButtons.OK, MessageBoxIcon.Information);
else
MessageBox.Show("Got Some ERROR :'( ","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
The SplitMethod() will return a BOOL value depending on the job performance/result.
Step 9
Now, we will look into SplitMethod() that does the split.
public static bool SplitMethod(string destination, string source, int number)
{
// get Extension File Name
extension = source.Substring(source.Length-3, 3);
// Store The Source File In bytes Array
Byte[] byteSource = File.ReadAllBytes(source);
//get File Information
FileInfo fiSource = new FileInfo(source);
// Calculate The Size of Each Part
int partSize = (int)Math.Ceiling((double)fiSource.Length / number);
// The Offset at which we start reading
int fileoffset = 0;
//Stores each Part
string currPartPath;
//The FileStream
FileStream fsPart;
//Stores the Remaing File
int sizeRemaining = (int)fiSource.Length;
for (int i = 0; i < number; i++)
{
//Stroes The PART
currPartPath = destination + "\\" +extension+ fiSource.Name + "." + String.Format(@"{0:D4}", i) + ".slice";
//Now, we will write it
if (!File.Exists(currPartPath))
{
fsPart = new FileStream(currPartPath, FileMode.CreateNew);
//Calculate the Remaining Size
sizeRemaining = (int)fiSource.Length - (i * partSize);
if (sizeRemaining < partSize)
{
partSize = sizeRemaining;
}
fsPart.Write(byteSource, fileoffset, partSize);
fsPart.Close();
fileoffset += partSize;
}
}
return true;
}
Step 10
Next, we have a Join section where we join those split files into a single file.
First, we need a folder path for where we want to save the output file.
So, we do the same thing as done earlier.
For the Browse button (small Yellow):
private void Browse_Click(object sender, EventArgs e)
{
if (folderOutput.ShowDialog() == DialogResult.OK)
{
JoinButton.Enabled = true;
outputFolderTextBox.Enabled = true;
outputFolderTextBox.Text = folderOutput.SelectedPath;
}
else
outputFolderTextBox.Enabled = false;
}
Step 11
When we click this button, then the joining process will begin. And it calls JoinMethod() from the BackEnd class with two arguments.
First will be the Source Folder destination where the actual split files are.
And the second argument is the new folder path where you want your new file to be.
private void button1_Click(object sender, EventArgs e)
{
//Join Button
BackEnd.outputFolder = outputFolderTextBox.Text.ToString();
//MessageBox.Show("Destination: " + BackEnd.folderDetination + " and Output Folder is : " + BackEnd.outputFolder);
if (outputFolderTextBox.Enabled)
{
if (BackEnd.JoinMethod(BackEnd.folderDetination, BackEnd.outputFolder) == true)
MessageBox.Show("Succeffully Decode In Your Desired Folder :)", "Success Report",MessageBoxButtons.OK,MessageBoxIcon.Information);
else
MessageBox.Show("Sorry !! You Got Some Error :'(", "Error Report",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
Step 12
The JoinMethod method:
public static bool JoinMethod(string folderInput,string folderOutput)
{
//get in a Directory
DirectoryInfo directSource = new DirectoryInfo(folderInput);
// Get Extension
FileInfo[] fi = directSource.GetFiles(@"*.slice");
extension = fi[0].Name.Substring(0, 3);
//FIle Stream to create FILE again
FileStream fsSource = new FileStream(folderOutput+"/GeneratedFile."+extension,FileMode.Append);
foreach(FileInfo fiPart in directSource.GetFiles(@"*.slice"))
{
Byte[] bytePart = System.IO.File.ReadAllBytes(fiPart.FullName);
//Write Those BYTES to create it again
fsSource.Write(bytePart,0,bytePart.Length);
}
//Close The Stream
fsSource.Close();
return true;
}
Output
I have selected an XML.pdf as input file to be split.
Then, we click on "Split File".
And, it seems like Success. It creates two *.slice files named "pdfXML" something.
These two files are in encrypted form and you can give this to anyone without any fear of data loss.
For decrypting this file, we need to join these sliced files.
For this, go to the "Join" tab and select the folder where these sliced files are.
I have selected Desktop, since my Slice files are there.
And, after clicking this, you are supposed to get this:
So, let’s cross-check this:
And, yes I got my Initial File (XML.pdf).
Note: every time your Generated file’s name will be "GeneratedFile" with their extension.
Conclusion
A basic encryption/decryption tool that can be used on a daily basis. And if you encounter any problem with the code or anything regarding this then it will be my pleasure to answer those. For others, you may go though the enclosed solution of this tool.