Click here to Skip to main content
15,892,480 members
Articles / Desktop Programming / Windows Forms

Securing Data in .NET

Rate me:
Please Sign up or sign in to vote.
4.81/5 (29 votes)
28 Oct 2007CPOL10 min read 93.3K   5.9K   108  
Need to learn further on cryptology? This article takes an overview of common cryptosystems, along with a step by step description of the Data Encryption Standard and the Advanced Encryption Standard.
//Copyright (c), October 2007, Some Rights Reserved 
//By Murat Firat

using System;
using System.Text;
using System.IO;
using System.Collections;

namespace Cipher
{
    class DES 
    {
        private byte[] IP, IP1, P, E, PC1, PC2, LeftShifts;
        private byte[,] Ss;

        protected string Key = null;
        private BitArray[] Keys;               


        public DES()
        {
            InitializeTables();
        }       

        protected BitArray Encrypt64Bit(BitArray block)
        {
            block = Table(IP, block);

            BitArray Left = new BitArray(32),
                     Right = new BitArray(32),
                     Temp;

            int tmp = block.Length / 2;
            Copy(block, 0, Left, 0, tmp); //Left=block[0-31];
            Copy(block, tmp, Right, 0, tmp); //Right=block[32-63];

            for (int i = 1; i <= 16; i++)
            {
                Temp = Left;
                Left = Right;
                Right = Temp.Xor(F(Right, Keys[i - 1]));
            }

            Copy(Right, 0, block, 0, 32); //block[0-31]=Right;
            Copy(Left, 0, block, 32, 32); //block[32-63]=Left;

            block = Table(IP1, block);

            return block;
        }

        protected BitArray Decrypt64Bit(BitArray block)
        {
            block = Table(IP, block);

            BitArray Left = new BitArray(32),
                     Right = new BitArray(32),
                     Temp;

            int tmp = block.Length / 2;
            Copy(block, 0, Left, 0, tmp); //Left=block[0-31];
            Copy(block, tmp, Right, 0, tmp); //Right=block[32-63];

            for (int i = 1; i <= 16; i++)
            {
                Temp = Left;
                Left = Right;
                Right = Temp.Xor(F(Right, Keys[16 - i]));
            }

            Copy(Right, 0, block, 0, 32); //block[0-31]=Right;
            Copy(Left, 0, block, 32, 32); //block[32-63]=Left;

            block = Table(IP1, block);

            return block;
        }

        private BitArray F(BitArray R, BitArray K)
        {
            R = Table(E, R);
            BitArray B = R.Xor(K);
            BitArray S = new BitArray(8 * 4);

            int x, y;
            BitArray Temp;
            for (int i = 0; i < 8; i++)
            {
                x = (B[i * 6 + 0] ? 2 : 0) + (B[i * 6 + 5] ? 1 : 0);
                y = (B[i * 6 + 1] ? 8 : 0) + (B[i * 6 + 2] ? 4 : 0) +
                    (B[i * 6 + 3] ? 2 : 0) + (B[i * 6 + 4] ? 1 : 0);

                Temp = new BitArray(new byte[] { Ss[i, 16 * x + y] });
                Copy(Temp, 0, S, i * 4, 4);
            }

            S = Table(P, S);
            return S;
        }

        protected void PermuteKeys(string Key)
        {
            if (Key.Length != 8)
            {
                throw new Exception("Key Size Must Be 8 Characters Long..");
            }

            this.Key = Key;
            BitArray key = new BitArray(Encoding.ASCII.GetBytes(Key));
            key = Table(PC1, key);

            BitArray C = new BitArray(28),
                     C_Old = new BitArray(28),
                     D = new BitArray(28),
                     D_Old = new BitArray(28);

            Copy(key, 0, C, 0 * 28, 28);
            Copy(key, 28, D, 0 * 28, 28);

            Keys = new BitArray[16];//16 keys, each one of which has 48 bits

            BitArray Temp = new BitArray(28 * 2), TempKey;

            //generate 16 keys
            for (int i = 1; i <= 16; i++)
            {
                C_Old = C;
                D_Old = D;
                //left shifts
                for (int j = 0; j < 28; j++)
                {
                    C[j] = C_Old[(j + LeftShifts[i - 1]) % 28];
                    D[j] = D_Old[(j + LeftShifts[i - 1]) % 28];
                }

                Copy(C, 0, Temp, 0, 28);
                Copy(D, 0, Temp, 28, 28);

                TempKey = Table(PC2, Temp);

                //save the key
                Keys[i - 1] = new BitArray(8 * 6);
                Copy(TempKey, 0, Keys[i - 1], 0, 48);
            }
        }

        private BitArray Table(byte[] Table, BitArray block)
        {
            int tmp = Table.Length;
            BitArray Result = new BitArray(tmp);
            for (int i = 0; i < tmp; i++)
            {
                Result[i] = block[Table[i] - 1];
            }
            return Result;
        }

        private void Copy(BitArray sourceArray, int sourceIndex,
                   BitArray destinationArray, int destinationIndex, int lenght)
        {
            for (int i = 0; i < lenght; i++)
            {
                if (sourceIndex + i < sourceArray.Length)
                {
                    destinationArray[destinationIndex + i] = sourceArray[sourceIndex + i];
                }
                else
                {
                    destinationArray[destinationIndex + i] = false;
                }
            }
        }

        protected void InitializeTables()
        {
            IP = new byte[8 * 8]{   58,    50,   42,    34,    26,   18,    10,    2,
                                    60,    52,   44,    36,    28,   20,    12,    4,
                                    62,    54,   46,    38,    30,   22,    14,    6,
                                    64,    56,   48,    40,    32,   24,    16,    8,
                                    57,    49,   41,    33,    25,   17,     9,    1,
                                    59,    51,   43,    35,    27,   19,    11,    3,
                                    61,    53,   45,    37,    29,   21,    13,    5,
                                    63,    55,   47,    39,    31,   23,    15,    7 
            };

            E = new byte[8 * 6] { 
                                     32,     1,    2,     3,     4,    5,
                                      4,     5,    6,     7,     8,    9,
                                      8,     9,   10,    11,    12,   13,
                                     12,    13,   14,    15,    16,   17,
                                     16,    17,   18,    19,    20,   21,
                                     20,    21,   22,    23,    24,   25,
                                     24,    25,   26,    27,    28,   29,
                                     28,    29,   30,    31,    32,    1 
            };

            P = new byte[8 * 4]{
                                     16,   7,  20,  21,
                                     29,  12,  28,  17,
                                      1,  15,  23,  26,
                                      5,  18,  31,  10,
                                      2,   8,  24,  14,
                                     32,  27,   3,   9,
                                     19,  13,  30,   6,
                                     22,  11,   4,  25                                 
            };

            IP1 = new byte[8 * 8] {
                                    40,     8,   48,    16,    56,   24,    64,   32,
                                    39,     7,   47,    15,    55,   23,    63,   31,
                                    38,     6,   46,    14,    54,   22,    62,   30,
                                    37,     5,   45,    13,    53,   21,    61,   29,
                                    36,     4,   44,    12,    52,   20,    60,   28,
                                    35,     3,   43,    11,    51,   19,    59,   27,
                                    34,     2,   42,    10,    50,   18,    58,   26,
                                    33,     1,   41,     9,    49,   17,    57,   25
            };

            PC1 = new byte[8 * 7]{
                                      57,   49,    41,   33,    25,    17,    9,
                                       1,   58,    50,   42,    34,    26,   18,
                                      10,    2,    59,   51,    43,    35,   27,
                                      19,   11,     3,   60,    52,    44,   36,
                                      63,   55,    47,   39,    31,    23,   15,
                                       7,   62,    54,   46,    38,    30,   22,
                                      14,    6,    61,   53,    45,    37,   29,
                                      21,   13,     5,   28,    20,    12,    4
            };

            PC2 = new byte[8 * 6] {  
                                     14,    17,   11,    24,     1,    5,
                                      3,    28,   15,     6,    21,   10,
                                     23,    19,   12,     4,    26,    8,
                                     16,     7,   27,    20,    13,    2,
                                     41,    52,   31,    37,    47,   55,
                                     30,    40,   51,    45,    33,   48,
                                     44,    49,   39,    56,    34,   53,
                                     46,    42,   50,    36,    29,   32
            };

            LeftShifts = new byte[16] { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };

            Ss = new byte[8, 4 * 16] 
            { 
                 {
                     14,  4,  13,  1,   2, 15,  11,  8,   3, 10,   6, 12,   5,  9,   0,  7,
                      0, 15,   7,  4,  14,  2,  13,  1,  10,  6,  12, 11,   9,  5,   3,  8,
                      4,  1,  14,  8,  13,  6,   2, 11,  15, 12,   9,  7,   3, 10,   5,  0,
                     15, 12,   8,  2,   4,  9,   1,  7,   5, 11,   3, 14,  10,  0,   6, 13
                 } ,
         

                {
                     15,  1,   8, 14,   6, 11,   3,  4,   9,  7,   2, 13,  12, 0,   5, 10,
                      3, 13,   4,  7,  15,  2,   8, 14,  12,  0,   1, 10,   6,  9,  11,  5,
                      0, 14,   7, 11,  10,  4,  13,  1,   5,  8,  12,  6,   9,  3,   2, 15,
                     13,  8,  10,  1,   3, 15,   4,  2,  11,  6,   7, 12,   0,  5,  14,  9
                } ,
           

                {
                     10,  0,   9, 14,   6,  3,  15,  5,   1, 13,  12,  7,  11,  4,   2,  8,
                     13,  7,   0,  9,   3,  4,   6, 10,   2,  8,   5, 14,  12, 11,  15,  1,
                     13,  6,   4,  9,   8, 15,   3,  0,  11,  1,   2, 12,   5, 10,  14,  7,
                      1, 10,  13,  0,   6,  9,   8,  7,   4, 15,  14,  3,  11,  5,   2, 12
                } ,


                {
                      7, 13,  14,  3,   0,  6,   9, 10,   1,  2,   8,  5,  11, 12,   4, 15,
                     13,  8,  11,  5,   6, 15,   0,  3,   4,  7,   2, 12,   1, 10,  14,  9,
                     10,  6,   9,  0, 12, 11,   7, 13,  15,  1,  3, 14,   5,  2,   8,  4,
                      3, 15,   0,  6,  10,  1,  13,  8,   9,  4,   5, 11,  12,  7,   2, 14
                } , 


                {
                      2, 12,   4,  1,   7, 10,  11,  6,  8,  5,   3, 15,  13,  0,  14,  9,
                     14, 11,   2, 12,   4,  7,  13,  1,   5,  0,  15, 10,   3,  9,   8,  6,
                      4,  2,   1, 11,  10, 13,   7,  8,  15,  9,  12,  5,   6,  3,   0, 14,
                     11,  8,  12,  7,   1, 14,   2, 13,   6, 15,   0,  9,  10,  4,   5,  3
                } , 


                {
                     12,  1,  10, 15,   9,  2,   6,  8,   0, 13,   3,  4,  14,  7,   5, 11,
                     10, 15,   4,  2,   7, 12,   9,  5,   6,  1,  13, 14,   0, 11,   3,  8,
                      9, 14,  15,  5,   2,  8,  12,  3,   7,  0,   4, 10,   1, 13,  11,  6,
                      4,  3,   2, 12,   9,  5,  15, 10,  11, 14,   1,  7,   6,  0,   8, 13
                } , 


                {
                      4, 11,   2, 14,  15,  0,   8, 13,   3, 12,   9,  7,   5, 10,   6,  1,
                     13,  0,  11,  7,   4,  9,   1, 10,  14,  3,   5, 12,   2, 15,   8,  6,
                      1,  4,  11, 13,  12,  3,   7, 14,  10, 15,   6,  8,   0,  5,   9,  2,
                      6, 11,  13,  8,   1,  4,  10,  7,   9,  5,   0, 15,  14,  2,   3, 12
                } , 


                {
                     13,  2,   8,  4,   6, 15,  11,  1,  10,  9,   3, 14,   5,  0,  12,  7,
                      1, 15,  13,  8,  10,  3,   7,  4,  12,  5,   6, 11,   0, 14,   9,  2,
                      7, 11,   4,  1,   9, 12,  14,  2,   0,  6,  10, 13,  15,  3,   5,  8,
                      2,  1,  14,  7,   4, 10,   8, 13,  15, 12,   9,  0,   3,  5,   6, 11
                }
           };
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

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


Written By
Software Developer (Senior)
Turkey Turkey
Has BS degree on computer science, working as software engineer in istanbul.

Comments and Discussions