Click here to Skip to main content
11,805,604 members (59,111 online)
Click here to Skip to main content


, 27 Nov 2007 CPOL 22.2K 419 8
Rate this:
Please Sign up or sign in to vote.
LOCK is used to lock and unlock the files using symmetric key cryptography


This article shows a classical approach to lock a file so that it doesn't reveal its original content in any software. For locking a file, a password is required. To view the file again in its original form, it has to be unlocked with the LOCK software with the same password which was used to lock the file.


The basic approach used is the symmetric key cryptography. The file is converted into blocks of 8 bytes and repeatedly XORed with the similar block of 8 bytes obtained by the password. Because the encryption used is symmetric key cryptography, the same process is used for unlocking\decryption.

Using the code

Following is the code for main encryption routine. For more details, look at source code for the comments.

// Replicate the byte array in the key buffer to create
         // an encryption key whose size equals or exceeds the
         // size of the I/O buffer
         int count = (1024 + keyBytes.Length-1)/keyBytes.Length;
                 for( int i=0 ; i<count ; i++)
                 Array.Copy( keyBytes , 0 , keybuf , i*keyBytes.Length , keyBytes.Length);
        // Read the file in bufsize blocks, XOR-encrypt each block,
         // and write the encrypted block back to the file
         long lBytesRemaining = stream.Length;
         while (lBytesRemaining>0)
                 long lPosition = stream.Position ;
                 int nBytesRequested = (int)System.Math.Min(bufSize , lBytesRemaining); 
                 int nBytesRead = reader.Read (buffer, 0, nBytesRequested)

                 for (int i=0; i<nBytesRead; i++)
                          buffer[i] ^= keybuf[i];Stream.Seek (lPosition, SeekOrigin.Begin);
                          writer.Write (buffer, 0, nBytesRead);
                          lBytesRemaining -= nBytesRead;


Screenshot - mainScreenShot.gif

Points of Interest

This is my second article at code project. For the first article which about Handling the Big Numbers, click here. I donot have much experience of article writing. I have just tried to minimize the shortcomings I have faced drafting the First article. Suggestion regarding the clarity, confusion, code, technical writing are welcomed. Comments are also welcomed. You can also mail me at with subject Lock Code Project Article regarding the same.


This is the first version of the program. I have some inputs for the next version of the code. I am expecting some more inputs from the readers of the code. After finalizing all the inputs I would write next version of the code.

If you feel any shortcoming of this code/article, please leave a message about the same, so that these pitfalls may not appear in the subsequent versions.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Software Developer (Senior)
India India
Software Engineer based out in Noida.

Technology skillset – .NET, WPF, WCF, LINQ, XAML.

Started blogging on

Stackoverflow Profile ->

You may also be interested in...

Comments and Discussions

GeneralMy vote of 1 Pin
geniaz16-Oct-09 12:41
membergeniaz16-Oct-09 12:41 
QuestionWhat is this? Pin
Ri Qen-Sin27-Nov-07 11:27
memberRi Qen-Sin27-Nov-07 11:27 
AnswerRe: What is this? Pin
Fun@learn27-Nov-07 17:20
memberFun@learn27-Nov-07 17:20 
GeneralYikes. Pin
JohnnyLocust27-Nov-07 9:13
memberJohnnyLocust27-Nov-07 9:13 
GeneralRe: Yikes. Pin
Fun@learn27-Nov-07 17:25
memberFun@learn27-Nov-07 17:25 
GeneralRe: Yikes. Pin
JohnnyLocust27-Nov-07 17:53
memberJohnnyLocust27-Nov-07 17:53 
GeneralRe: Yikes. Pin
Ri Qen-Sin27-Nov-07 18:29
memberRi Qen-Sin27-Nov-07 18:29 
AnswerRe: Yikes. Pin
Fun@learn27-Nov-07 18:49
memberFun@learn27-Nov-07 18:49 
GeneralRe: Yikes. Pin
JohnnyLocust28-Nov-07 6:08
memberJohnnyLocust28-Nov-07 6:08 
GeneralRe: Yikes. Pin
Ri Qen-Sin28-Nov-07 8:22
memberRi Qen-Sin28-Nov-07 8:22 
Fun@learn wrote:
Integers are never a part of the algorithm apart from the arraysize or counters.
So I could not get your point.
As far as remaining bytes are concerned, i am looking for such a approach which considers the smaller chunk one at a time rather than all the file at a time.
Here the main issue is file handling rather than the encryption algorithm.
Though algorithm would also reflect the improvements.

You can XOR them faster if you XOR them 32 or 64 bits at a time. The idea is to do as much as you can in one operation.

That just scratches the surface of it.

Let's see what other "gems" I can find in your code.

  • When testing for empty strings, test for both string == null and string == String.Empty and not string == "". In fact, you should use the Path class instead if you're checking for valid paths, and extra checks to make sure you can read and/or write to them.
  • You should probably read about best practices for exception handling.
  • I believe Console.Write*(…) should be replaced with MessageBox.Show(…)?
  • You might want to write to a different stream. If the program crashes, then the user won't end up with a corrupt original.


Jokeloooool Pin
LegionFX27-Nov-07 8:38
memberLegionFX27-Nov-07 8:38 
GeneralRe: loooool Pin
LegionFX27-Nov-07 8:39
memberLegionFX27-Nov-07 8:39 
GeneralRe: loooool Pin
Fun@learn28-Nov-07 6:10
memberFun@learn28-Nov-07 6:10 
QuestionImageViewer? Pin
canozurdo27-Nov-07 7:48
membercanozurdo27-Nov-07 7:48 
AnswerRe: ImageViewer? Pin
Fun@learn27-Nov-07 17:28
memberFun@learn27-Nov-07 17:28 
GeneralRe: ImageViewer? Pin
canozurdo28-Nov-07 1:37
membercanozurdo28-Nov-07 1:37 
AnswerRe: ImageViewer? Pin
Fun@learn28-Nov-07 6:07
memberFun@learn28-Nov-07 6:07 

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

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

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.151002.1 | Last Updated 27 Nov 2007
Article Copyright 2007 by Fun@learn
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid