Click here to Skip to main content
15,867,308 members
Articles / Programming Languages / C#
Article

Vernam encryption/decryption of files

Rate me:
Please Sign up or sign in to vote.
5.00/5 (13 votes)
27 Sep 2008CDDL2 min read 104.2K   6.1K   30   14
Class for encrypting/decrypting files using a Vernam chipher.

Introduction

In this article, I'll show how to do a simple but robust encryption/decryption, with the algorithm of Gilbert Sandford, Vernam. This kind of encryption is truly unbreakable as long the key is maintained a secret.

Background

Vernam cipher is a stream cipher where the original or plain data is XORed with a random (actually pseudorandom) stream of data of the same length to generate the encrypted data. When the stream of data used as key is truly random and used only once, it is called a one-time pad. A widely used implementation of the Vernam cipher is RC4.

Advantages

The Vernam cipher with one-time pads is the only known encryption procedure where, in theory, information is secure and can't be deciphered, if the key is randomly and only once used for encryption . For decrypting, only the secret key and the encrypted data is used.

Other encryption methods (such as AES) achieve their security with the immense burden of calculating theoretically conceivable decoding, which is practically not feasible. In other words, a potential attacker lacks the necessary resources (computing capacity or time) to perform his attack successfully. The security of one-time pad, on the other hand, is based on the unique use of the key and sufficient randomness of the used key. Even with increasing computing power, it can't be broken.

Due to the fact that encryption is done by XOR, the algorithm is pretty fast. For decrypting data, the same algorithm can be used - it's symmetric.

Disadvantages

The Vernam cipher requires a key with the same length as the original data. For example, the encryption of a hard disk requires a second hard disk (with at lest the same size) to store the key.

Another disadvantage of one-time pads is that the data of the key has to be, ideally, completely randomly chosen. Most computers are not able to generate really random keys.

How the algorithm works

First, the bytes of the input file are read:

C#
byte[] originalBytes;
using (FileStream fs = new FileStream(originalFile, FileMode.Open))
{
    originalBytes = new byte[fs.Length];
    fs.Read(originalBytes, 0, originalBytes.Length);
}

Then, the one-time pad - the key - is created. This is done by generating random bytes that are of the same length as the original (plain) bytes. The key bytes get written to the specified file.

C#
byte[] keyBytes = new byte[originalBytes.Length];
Random random = new Random();
random.NextBytes(keyBytes);

// Write the key to the file:
using (FileStream fs = new FileStream(keyFile, FileMode.Create))
{
    fs.Write(keyBytes, 0, keyBytes.Length);
}

The encryption - for decryption the same algorithm is used - is straightforward, by using XOR.

C#
private void DoVernam(byte[] inBytes, byte[] keyBytes, ref byte[] outBytes)
{
    // Check arguments:
    if ((inBytes.Length != keyBytes.Length) ||
        (keyBytes.Length != outBytes.Length))
        throw new ArgumentException("Byte-array are not of same length");

    // Encrypt/decrypt by XOR:
    for (int i = 0; i < inBytes.Length; i++)
        outBytes[i] = (byte)(inBytes[i] ^ keyBytes[i]);
}

Using the code

To encrypt/decrypt data, the class provided is quite simple. See the example below.

C#
using gfoidl.Security;

// Create an instance of the class:
Vernam vernam = new Vernam();

// Test with an image:
vernam.EncryptFile("Image.gif", "Image_encrypted.gif", "Key01.dat");
vernam.DecryptFile("Image_encrypted.gif", "Key01.dat", 
                   "Image_decrypted.gif");

// Test with text file:
vernam.EncryptFile("Text.txt", "Text_encrypted.txt", "Key02.dat");
vernam.DecryptFile("Text_encrypted.txt", "Key02.dat", 
                   "Text_decrypted.txt");

// Test with pdf file:
vernam.EncryptFile("Text.pdf", "Text_encrypted.pdf", "Key03.dat");
vernam.DecryptFile("Text_encrypted.pdf", "Key03.dat", 
                   "Text_decrypted.pdf");

The key is produced by the class and has the same length as the original data. Randomly generated bytes are used as keys.

For decryption the same key has to be used as for encrypting the file.

License

This article, along with any associated source code and files, is licensed under The Common Development and Distribution License (CDDL)


Written By
Software Developer (Senior) Foidl Günther
Austria Austria
Engineer in combustion engine development.
Programming languages: C#, FORTRAN 95, Matlab

FIS-overall worldcup winner in Speedski (Downhill) 2008/09 and 2009/10.

Comments and Discussions

 
Praise+1 Pin
Member 1287087426-Nov-16 11:19
Member 1287087426-Nov-16 11:19 
QuestionPersonal Input From TextBox. Pin
Justin Weldon2-Apr-15 2:36
Justin Weldon2-Apr-15 2:36 
GeneralMy vote of 5 Pin
John Underhill12-Sep-13 5:42
John Underhill12-Sep-13 5:42 
Simple yet elegant solution.. thanks
QuestionMFC equivalent Pin
DPLNeural1-Jul-13 21:41
DPLNeural1-Jul-13 21:41 
GeneralMy vote of 5 Pin
Manoj Kumar Choubey29-Mar-12 20:12
professionalManoj Kumar Choubey29-Mar-12 20:12 
GeneralMy vote of 5 Pin
Manoj Kumar Choubey26-Feb-12 21:33
professionalManoj Kumar Choubey26-Feb-12 21:33 
GeneralQuestion Pin
kma6911-Feb-09 7:14
kma6911-Feb-09 7:14 
GeneralRe: Question Pin
kma6911-Feb-09 7:21
kma6911-Feb-09 7:21 
General"Cracking" a Random Number Generator Pin
jcdege30-Sep-08 2:23
jcdege30-Sep-08 2:23 
GeneralRe: "Cracking" a Random Number Generator Pin
Günther M. FOIDL30-Sep-08 3:02
Günther M. FOIDL30-Sep-08 3:02 
GeneralUse of Random class Pin
Aelthegrin29-Sep-08 8:08
Aelthegrin29-Sep-08 8:08 
GeneralRe: Use of Random class Pin
Günther M. FOIDL29-Sep-08 10:03
Günther M. FOIDL29-Sep-08 10:03 
GeneralInteresting article Pin
rht34128-Sep-08 4:12
rht34128-Sep-08 4:12 
GeneralRe: Interesting article Pin
Günther M. FOIDL22-Oct-09 10:57
Günther M. FOIDL22-Oct-09 10:57 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.