Advertisement
mrAnderson33

DES

Jun 14th, 2018
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 14.15 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using CipherNamespace;
  5.  
  6. namespace _15._03._2018
  7. {
  8.     class DES
  9.     {
  10.         static int[] pc1 = {
  11.             57, 49, 41, 33, 25, 17, 9,
  12.             1, 58, 50, 42, 34, 26, 18,
  13.             10, 2, 59, 51, 43, 35, 27,
  14.             19, 11, 3, 60, 52, 44, 36,
  15.             63, 55, 47, 39, 31, 23, 15,
  16.             7, 62, 54, 46, 38, 30, 22,
  17.             14, 6, 61, 53, 45, 37, 29,
  18.             21, 13, 5, 28, 20, 12, 4
  19.                             };
  20.         static int[] shifts = {
  21.             1, 1, 2, 2, 2, 2, 2, 2,
  22.             1, 2, 2, 2, 2, 2, 2, 1
  23.                             };
  24.         static int[] pc2 = {
  25.             14, 17, 11, 24, 1, 5,
  26.             3, 28, 15, 6, 21, 10,
  27.             23, 19, 12, 4, 26, 8,
  28.             16, 7, 27, 20, 13, 2,
  29.             41, 52, 31, 37, 47, 55,
  30.             30, 40, 51, 45, 33, 48,
  31.             44, 49, 39, 56, 34, 53,
  32.             46, 42, 50, 36, 29, 32
  33.                             };
  34.         static int[] ip = {
  35.             58, 50, 42, 34, 26, 18, 10, 2,
  36.             60, 52, 44, 36, 28, 20, 12, 4,
  37.             62, 54, 46, 38, 30, 22, 14, 6,
  38.             64, 56, 48, 40, 32, 24, 16, 8,
  39.             57, 49, 41, 33, 25, 17, 9, 1,
  40.             59, 51, 43, 35, 27, 19, 11, 3,
  41.             61, 53, 45, 37, 29, 21, 13, 5,
  42.             63, 55, 47, 39, 31, 23, 15, 7
  43.                             };
  44.  
  45.         static int[] exp = {
  46.             32, 1, 2, 3, 4, 5,
  47.             4, 5, 6, 7, 8, 9,
  48.             8, 9, 10, 11, 12, 13,
  49.             12, 13, 14, 15, 16, 17,
  50.             16, 17, 18, 19, 20, 21,
  51.             20, 21, 22, 23, 24, 25,
  52.             24, 25, 26, 27, 28, 29,
  53.             28, 29, 30, 31, 32, 1
  54.                             };
  55.  
  56.  
  57.         static int[][][] sbox = {
  58.                    new int[][]{
  59.                         new int[]{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 },
  60.                         new int[]{0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 },
  61.                         new int[]{4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 },
  62.                         new int[]{15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 }
  63.                            },
  64.                     new int[][]{
  65.                         new int[]{15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 },
  66.                         new int[]{3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 },
  67.                         new int[]{0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 },
  68.                         new int[]{13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 }
  69.                              },
  70.                     new int[][]{
  71.                     new int[]{10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 },
  72.                     new int[]{13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 },
  73.                     new int[]{13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 },
  74.                     new int[]{1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12}
  75.                     },
  76.                     new int[][]{
  77.                     new int[]{ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 },
  78.                     new int[]{ 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 },
  79.                     new int[]{ 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 },
  80.                     new int[]{ 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 }
  81.                     },
  82.  
  83.                     new int[][]{
  84.                     new int[]{ 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 },
  85.                     new int[]{ 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 },
  86.                     new int[]{ 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14},
  87.                     new int[]{ 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3}
  88.                     },
  89.                     new int[][]{
  90.                     new int[]{ 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 },
  91.                     new int[]{  10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 },
  92.                     new int[]{ 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 },
  93.                     new int[]{ 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 }
  94.                     },
  95.                     new int[][]{
  96.                     new int[]{ 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 },
  97.                     new int[]{ 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 },
  98.                     new int[]{ 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 },
  99.                     new int[]{ 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 }
  100.                     },
  101.                     new int[][]{
  102.                     new int[]{ 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 },
  103.                     new int[]{ 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 },
  104.                     new int[]{ 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 },
  105.                     new int[]{ 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 }
  106.                     }
  107.                     };
  108.         static int[] p = {  16, 7, 20, 21,
  109.                             29, 12, 28, 17,
  110.                             1, 15, 23, 26,
  111.                             5, 18, 31, 10,
  112.                             2, 8, 24, 14,
  113.                             32, 27, 3, 9,
  114.                             19, 13, 30, 6,
  115.                             22, 11, 4, 25};
  116.  
  117.         static int[] ip1 = {40, 8, 48, 16, 56, 24, 64, 32,
  118.                             39, 7, 47, 15, 55, 23, 63, 31,
  119.                             38, 6, 46, 14, 54, 22, 62, 30,
  120.                             37, 5, 45, 13, 53, 21, 61, 29,
  121.                             36, 4, 44, 12, 52, 20, 60, 28,
  122.                             35, 3, 43, 11, 51, 19, 59, 27,
  123.                             34, 2, 42, 10, 50, 18, 58, 26,
  124.                             33, 1, 41, 9, 49, 17, 57, 25};
  125.  
  126.         public static BitArray[] DecryptBlocks(BitArray[] blocks, BitArray[] keys)
  127.         {
  128.             var res = new List<BitArray>();
  129.  
  130.             foreach (var block in blocks)
  131.             {
  132.                 if(block.Count < 64)
  133.                     block.IncreaseLength(64 - block.Count);
  134.                 res.Add(DeCrypt(block, keys));
  135.             }
  136.             return res.ToArray();
  137.         }
  138.  
  139.         public static BitArray[] EnCryptBlocks(BitArray[] blocks, BitArray[] keys)
  140.         {
  141.             var res = new List<BitArray>();
  142.  
  143.             foreach (var block in blocks)
  144.             {
  145.                 if (block.Count < 64)
  146.                     block.IncreaseLength(64 - block.Count);
  147.                 res.Add(EnCrypt(block, keys));
  148.             }
  149.             return res.ToArray();
  150.         }
  151.  
  152.         public static BitArray StringKeyToBitArray(string key)
  153.         {
  154.             var keyInBytes = Encoding.ASCII.GetBytes(key);
  155.  
  156.             if (keyInBytes.Length > 8) throw new Exception("Неверный размер ключа");
  157.  
  158.             var keyInBitArr = new BitArray(8);
  159.             var tempKey = new byte[8];
  160.  
  161.             for (int i = 0; i < keyInBytes.Length; i++)
  162.                 tempKey[i] = keyInBytes[i];
  163.  
  164.             var tmp = new List<byte>(tempKey);
  165.  
  166.             tmp.Reverse();
  167.  
  168.             keyInBytes = tmp.ToArray();
  169.  
  170.             keyInBitArr.getBitArrayFromByteArr(new List<byte>(keyInBytes));
  171.  
  172.             return keyInBitArr;
  173.         }
  174.         public static BitArray[] StringToBitArrays(string msg)
  175.         {
  176.             var msgInBytes = Encoding.ASCII.GetBytes(msg);
  177.             var tempMsgInBits = new List<BitArray>();
  178.  
  179.             int countPartsOfMessage = msgInBytes.Length / 8;
  180.  
  181.             var tempByteArr = new  List<byte>();
  182.  
  183.             for (int i = 0; i < msgInBytes.Length; i++)
  184.             {
  185.                 if(((i+1)%8==0)||(i == msgInBytes.Length-1))
  186.                 {
  187.                     var temp = new BitArray(tempByteArr);
  188.                     tempMsgInBits.Add(temp);
  189.                     tempByteArr = new List<byte>();
  190.                 }
  191.  
  192.                 tempByteArr.Add(msgInBytes[i]);
  193.             }
  194.  
  195.             return tempMsgInBits.ToArray();
  196.  
  197.         }
  198.  
  199.         #region Modes
  200.  
  201.         public static BitArray[] EnCryptECB(string msg, string key)
  202.         {
  203.             var msgInBytes = Encoding.ASCII.GetBytes(msg);
  204.  
  205.             var blocks = StringToBitArrays(msg);
  206.             var keyy = StringKeyToBitArray(key);
  207.  
  208.             var keys = Key(keyy);
  209.  
  210.             var encrypted = EnCryptBlocks(blocks, keys);
  211.  
  212.             return encrypted;
  213.         }
  214.         public static string DeCryptECB(BitArray[] encrypted, string key)
  215.         {
  216.             var keyy = StringKeyToBitArray(key);
  217.  
  218.             var keys = Key(keyy);
  219.  
  220.             var decrypted = DecryptBlocks(encrypted, keys);
  221.  
  222.             var templist = new List<BitArray>(decrypted);
  223.  
  224.             templist.Reverse();
  225.  
  226.             decrypted = templist.ToArray();
  227.  
  228.             foreach (var block in decrypted)
  229.                     block.removeNullsfromBegin();
  230.  
  231.             return Encoding.ASCII.GetString(BitArray.ConcatArr(decrypted).getByteArrayFromBitArray);
  232.  
  233.             }
  234.  
  235.         public static BitArray[] EnCryptCBC(string msg, string key, byte[] IV)
  236.         {
  237.             var IvInBits = new BitArray(IV);
  238.  
  239.             var msgInBytes = Encoding.ASCII.GetBytes(msg);
  240.  
  241.             var res = new List<BitArray>();
  242.  
  243.             var blocks = StringToBitArrays(msg);
  244.             var keyy = StringKeyToBitArray(key);
  245.  
  246.             var keys = Key(keyy);
  247.  
  248.  
  249.             foreach (var block in blocks)
  250.             {
  251.                 if (block.Count < 64)
  252.                     block.IncreaseLength(64 - block.Count);
  253.                 var tempBlock = EnCrypt(block ^ IvInBits, keys);
  254.                 res.Add(tempBlock);
  255.                 IvInBits = tempBlock.Clone() as BitArray;
  256.             }
  257.  
  258.             return  res.ToArray();
  259.         }
  260.  
  261.         public static string DeCryptCBC(BitArray[] encrypted, string key, byte[] IV)
  262.         {
  263.             var IvInBits = new BitArray(IV);
  264.  
  265.             var c = new BitArray(IV);
  266.  
  267.             var keyy = StringKeyToBitArray(key);
  268.  
  269.             var keys = Key(keyy);
  270.  
  271.             var res = new List<BitArray>();
  272.  
  273.             foreach (var block in encrypted)
  274.             {
  275.                 if (block.Count < 64)
  276.                     block.IncreaseLength(64 - block.Count);
  277.                 var temp = block.Clone() as BitArray;
  278.  
  279.                 var tempBlock = DeCrypt(block, keys);
  280.                 res.Add(tempBlock ^ IvInBits);
  281.  
  282.                 IvInBits = temp;
  283.             }
  284.  
  285.             res.Reverse();
  286.  
  287.             foreach (var block in res)
  288.                 block.removeNullsfromBegin();
  289.  
  290.             return Encoding.ASCII.GetString(BitArray.ConcatArr(res.ToArray()).getByteArrayFromBitArray);
  291.         }
  292.  
  293.         #endregion
  294.         public static BitArray DeCrypt(BitArray msgInBitArr, BitArray[] keys)
  295.         {
  296.             msgInBitArr.applyPermutations(ip);
  297.  
  298.             var temp = new List<BitArray>(keys);
  299.  
  300.             temp.Reverse();
  301.  
  302.             keys = temp.ToArray();
  303.  
  304.             var twoParts = msgInBitArr.DevideByParts(2);
  305.             var L = twoParts[0];
  306.             var R = twoParts[1];
  307.  
  308.  
  309.             for (int i = 0; i < 16;i++)
  310.             {
  311.                 var tempL = L.Clone() as BitArray;
  312.                 L = R.Clone() as BitArray;
  313.                 R = tempL ^ F(R, keys[i]);
  314.             }
  315.  
  316.             var res = R.JoinArr(L);
  317.  
  318.             res.applyPermutations(ip1);
  319.  
  320.             return res;
  321.         }
  322.  
  323.         public static BitArray EnCrypt(BitArray msgInBitArr, BitArray[] keys)
  324.         {
  325.             msgInBitArr.applyPermutations(ip);
  326.  
  327.             var twoParts = msgInBitArr.DevideByParts(2);
  328.             var L = twoParts[0];
  329.             var R = twoParts[1];
  330.  
  331.             for (int i=0; i<16;++i)
  332.             {
  333.                 var tempL = L.Clone() as BitArray;
  334.                 L = R.Clone() as BitArray;
  335.                 R = tempL ^ F(R, keys[i]);
  336.             }
  337.  
  338.             var res = R.JoinArr(L);
  339.  
  340.             res.applyPermutations(ip1);
  341.  
  342.             return res;
  343.         }
  344.  
  345.         public static BitArray F(BitArray right, BitArray key)
  346.         {
  347.             var extendedRight = new BitArray(48);
  348.  
  349.             for (int i = 0; i < 48; ++i) extendedRight[i] = right[exp[i]-1];
  350.  
  351.             var rightXorArr = extendedRight.Clone() as BitArray ^ key;
  352.  
  353.             var B = rightXorArr.DevideByParts(8);
  354.  
  355.  
  356.             for(int k =0; k < 8;++k)
  357.             {
  358.                 int i = ((B[k][0] ? 1 : 0) << 1) | (B[k][5] ? 1 : 0);
  359.                 int j = ((B[k][4] ? 1 : 0)) | ((B[k][3] ? 1 : 0) << 1) | ((B[k][2] ? 1 : 0) << 2) | ((B[k][1] ? 1 : 0) << 3);
  360.                 B[k] = new BitArray(Convert.ToString(sbox[k][i][j], 2), 4);
  361.             }
  362.  
  363.             var S = BitArray.ConcatArr(B);
  364.  
  365.             S.applyPermutations(p);
  366.  
  367.             return S;
  368.         }
  369.         public static BitArray[] Key(BitArray keyInBitArr)
  370.         {
  371.             if (keyInBitArr.Count < 64) keyInBitArr.IncreaseLength(64-keyInBitArr.Count);
  372.  
  373.             keyInBitArr.applyPermutations(pc1);
  374.             var twoParts = keyInBitArr.DevideByParts(2);
  375.  
  376.             var C = new BitArray[16];
  377.             var D = new BitArray[16];
  378.  
  379.             for(int i =0; i <16;++i)
  380.             {
  381.                 C[i] = twoParts[0] << shifts[i];
  382.                 D[i] = twoParts[1] << shifts[i];
  383.             }
  384.  
  385.             var CD = new List<BitArray>();
  386.  
  387.             for (int i = 0; i < 16; ++i) CD.Add(C[i].JoinArr(D[i]));
  388.  
  389.             var keys = CD;
  390.  
  391.             foreach (var k in keys) k.applyPermutations(pc2);
  392.  
  393.             return keys.ToArray();
  394.         }
  395.     }
  396.  class Program
  397.     {
  398.  
  399.         static void Main(string[] args)
  400.         {
  401.  
  402.             var msg = "hello wonderful world world hey you ";
  403.  
  404.             var key = Encoding.ASCII.GetString(BitConverter.GetBytes(0x0123456789ABCDEF));
  405.  
  406.             var IV = new byte[8];
  407.  
  408.             new Random().NextBytes(IV);
  409.  
  410.             var encrypted = DES.EnCryptECB(msg, key);
  411.             Console.WriteLine( DES.DeCryptECB(encrypted, key));
  412.  
  413.              encrypted = DES.EnCryptCBC(msg, key, IV);
  414.             Console.WriteLine(DES.DeCryptCBC(encrypted, key,IV));
  415.         }
  416.     }
  417. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement