Advertisement
Guest User

Untitled

a guest
Oct 18th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.16 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace crypto_galua
  8. {
  9.     class Program
  10.     {
  11.         static int mod = 0x11b;
  12.         static byte[,] key = { { 1, 2, 3, 4 }, { 1, 2, 3, 4 }, { 1, 2, 3, 4 }, { 1, 2, 3, 4 } };
  13.         static int BitsCount(int b)
  14.         {
  15.             int count = 0;
  16.             while (b != 0)
  17.             {
  18.                 b = b >> 1;
  19.                 count++;
  20.             }
  21.             return count;
  22.         }
  23.         static byte Sum(byte a, byte b)
  24.         {
  25.             return (byte)(a ^ b);
  26.         }
  27.         static byte Mult(byte a, byte b, int m)
  28.         {
  29.             int res = ((b & 0x1) == 1) ? a : 0x0;
  30.             int k = 1;
  31.             b >>= 1;
  32.             while (b != 0)
  33.             {
  34.                 if ((b & 0x1) == 1)
  35.                 {
  36.                     res = res ^ (a << k);
  37.                     b >>= 1;
  38.                     k++;
  39.                 }
  40.                 else
  41.                 {
  42.                     b >>= 1;
  43.                     k++;
  44.                 }
  45.             }
  46.             while (res >= 0xff)
  47.                 res ^= m << (BitsCount(res) - BitsCount(m));
  48.             return (byte)res;
  49.         }
  50.         static byte obr(byte a, int m)
  51.         {
  52.             for (int i = 0; i < 256; i++)
  53.             {
  54.                 if (Mult(a, (byte)i, 0x11b) % m == 1)
  55.                     return (byte)i;
  56.             }
  57.             return 0;
  58.         }
  59.  
  60.         static byte[,] GetToMatrix(string s)
  61.         {
  62.             byte[,] bytes = new byte[4, 4];
  63.             for (int i = 0; i < 4; i++)
  64.             {
  65.                 for (int j = 0; j < 4; j++)
  66.                 {
  67.                     bytes[i, j] = (byte)s[4 * i + j];
  68.                 }
  69.             }
  70.             return bytes;
  71.         }
  72.  
  73.         static byte[,] Tetta(byte[,] bytes)
  74.         {
  75.             byte[,] newbytes = new byte[4, 4];
  76.             byte[,] c = new byte[,] { { 2, 3, 1, 1 }, { 1, 2, 3, 1 }, { 1, 1, 2, 3 }, { 3, 1, 1, 2 } };
  77.  
  78.             for (int i = 0; i < bytes.GetLength(0); i++)
  79.             {
  80.                 for (int j = 0; j < c.GetLength(1); j++)
  81.                 {
  82.                     for (int k = 0; k < c.GetLength(0); k++)
  83.                     {
  84.                         newbytes[i, j] ^= Mult(bytes[i, k], c[k, j], mod);
  85.                     }
  86.                 }
  87.             }
  88.             return newbytes;
  89.         }
  90.  
  91.         static byte[,] Gamma(byte[,] bytes)
  92.         {
  93.  
  94.             byte[] a = new byte[] {
  95.                                     0xB1,0xCE,0xC3,0x95,0x5A,0xAD,0xE7,0x02,0x4D,0x44,0xFB,0x91,0x0C,0x87,0xA1,0x50,
  96.                                     0xCB,0x67,0x54,0xDD,0x46,0x8F,0xE1,0x4E,0xF0,0xFD,0xFC,0xEB,0xF9,0xC4,0x1A,0x6E,
  97.                                     0x5E,0xF5,0xCC,0x8D,0x1C,0x56,0x43,0xFE,0x07,0x61,0xF8,0x75,0x59,0xFF,0x03,0x22,
  98.                                     0x8A,0xD1,0x13,0xEE,0x88,0x00,0x0E,0x34,0x15,0x80,0x94,0xE3,0xED,0xB5,0x53,0x23,
  99.                                     0x4B,0x47,0x17,0xA7,0x90,0x35,0xAB,0xD8,0xB8,0xDF,0x4F,0x57,0x9A,0x92,0xDB,0x1B,
  100.                                     0x3C,0xC8,0x99,0x04,0x8E,0xE0,0xD7,0x7D,0x85,0xBB,0x40,0x2C,0x3A,0x45,0xF1,0x42,
  101.                                     0x65,0x20,0x41,0x18,0x72,0x25,0x93,0x70,0x36,0x05,0xF2,0x0B,0xA3,0x79,0xEC,0x08,
  102.                                     0x27,0x31,0x32,0xB6,0x7C,0xB0,0x0A,0x73,0x5B,0x7B,0xB7,0x81,0xD2,0x0D,0x6A,0x26,
  103.                                     0x9E,0x58,0x9C,0x83,0x74,0xB3,0xAC,0x30,0x7A,0x69,0x77,0x0F,0xAE,0x21,0xDE,0xD0,
  104.                                     0x2E,0x97,0x10,0xA4,0x98,0xA8,0xD4,0x68,0x2D,0x62,0x29,0x6D,0x16,0x49,0x76,0xC7,
  105.                                     0xE8,0xC1,0x96,0x37,0xE5,0xCA,0xF4,0xE9,0x63,0x12,0xC2,0xA6,0x14,0xBC,0xD3,0x28,
  106.                                     0xAF,0x2F,0xE6,0x24,0x52,0xC6,0xA0,0x09,0xBD,0x8C,0xCF,0x5D,0x11,0x5F,0x01,0xC5,
  107.                                     0x9F,0x3D,0xA2,0x9B,0xC9,0x3B,0xBE,0x51,0x19,0x1F,0x3F,0x5C,0xB2,0xEF,0x4A,0xCD,
  108.                                     0xBF,0xBA,0x6F,0x64,0xD9,0xF3,0x3E,0xB4,0xAA,0xDC,0xD5,0x06,0xC0,0x7E,0xF6,0x66,
  109.                                     0x6C,0x84,0x71,0x38,0xB9,0x1D,0x7F,0x9D,0x48,0x8B,0x2A,0xDA,0xA5,0x33,0x82,0x39,
  110.                                     0xD6,0x78,0x86,0xFA,0xE4,0x2B,0xA9,0x1E,0x89,0x60,0x6B,0xEA,0x55,0x4C,0xF7,0xE2
  111.             };
  112.             for (int i = 0; i < 4; i++)
  113.             {
  114.                 for (int j = 0; j < 4; j++)
  115.                     bytes[i, j] = a[bytes[i, j]];
  116.             }
  117.             return bytes;
  118.         }
  119.  
  120.         static byte[,] Pi(byte[,] bytes)
  121.         {
  122.             for (int i = 0; i < 4; i++)
  123.             {
  124.                 for (int j = 0; j < 4; j++)
  125.                     bytes[i, j] = bytes[j, i];
  126.             }
  127.             return bytes;
  128.         }
  129.  
  130.         static byte[,] XorWIthKey(byte[,] bytes, byte[,] key)
  131.         {
  132.             for (int i = 0; i < 4; i++)
  133.             {
  134.                 for (int j = 0; j < 4; j++)
  135.                     bytes[i, j] ^= key[i, j];
  136.             }
  137.             return bytes;
  138.         }
  139.  
  140.         static byte[,] ReverseGamma(byte[,] bytes)
  141.         {
  142.             byte[] a = new byte[] {
  143.                                     0xB1,0xCE,0xC3,0x95,0x5A,0xAD,0xE7,0x02,0x4D,0x44,0xFB,0x91,0x0C,0x87,0xA1,0x50,
  144.                                     0xCB,0x67,0x54,0xDD,0x46,0x8F,0xE1,0x4E,0xF0,0xFD,0xFC,0xEB,0xF9,0xC4,0x1A,0x6E,
  145.                                     0x5E,0xF5,0xCC,0x8D,0x1C,0x56,0x43,0xFE,0x07,0x61,0xF8,0x75,0x59,0xFF,0x03,0x22,
  146.                                     0x8A,0xD1,0x13,0xEE,0x88,0x00,0x0E,0x34,0x15,0x80,0x94,0xE3,0xED,0xB5,0x53,0x23,
  147.                                     0x4B,0x47,0x17,0xA7,0x90,0x35,0xAB,0xD8,0xB8,0xDF,0x4F,0x57,0x9A,0x92,0xDB,0x1B,
  148.                                     0x3C,0xC8,0x99,0x04,0x8E,0xE0,0xD7,0x7D,0x85,0xBB,0x40,0x2C,0x3A,0x45,0xF1,0x42,
  149.                                     0x65,0x20,0x41,0x18,0x72,0x25,0x93,0x70,0x36,0x05,0xF2,0x0B,0xA3,0x79,0xEC,0x08,
  150.                                     0x27,0x31,0x32,0xB6,0x7C,0xB0,0x0A,0x73,0x5B,0x7B,0xB7,0x81,0xD2,0x0D,0x6A,0x26,
  151.                                     0x9E,0x58,0x9C,0x83,0x74,0xB3,0xAC,0x30,0x7A,0x69,0x77,0x0F,0xAE,0x21,0xDE,0xD0,
  152.                                     0x2E,0x97,0x10,0xA4,0x98,0xA8,0xD4,0x68,0x2D,0x62,0x29,0x6D,0x16,0x49,0x76,0xC7,
  153.                                     0xE8,0xC1,0x96,0x37,0xE5,0xCA,0xF4,0xE9,0x63,0x12,0xC2,0xA6,0x14,0xBC,0xD3,0x28,
  154.                                     0xAF,0x2F,0xE6,0x24,0x52,0xC6,0xA0,0x09,0xBD,0x8C,0xCF,0x5D,0x11,0x5F,0x01,0xC5,
  155.                                     0x9F,0x3D,0xA2,0x9B,0xC9,0x3B,0xBE,0x51,0x19,0x1F,0x3F,0x5C,0xB2,0xEF,0x4A,0xCD,
  156.                                     0xBF,0xBA,0x6F,0x64,0xD9,0xF3,0x3E,0xB4,0xAA,0xDC,0xD5,0x06,0xC0,0x7E,0xF6,0x66,
  157.                                     0x6C,0x84,0x71,0x38,0xB9,0x1D,0x7F,0x9D,0x48,0x8B,0x2A,0xDA,0xA5,0x33,0x82,0x39,
  158.                                     0xD6,0x78,0x86,0xFA,0xE4,0x2B,0xA9,0x1E,0x89,0x60,0x6B,0xEA,0x55,0x4C,0xF7,0xE2
  159.             };
  160.             for (int i = 0; i < 4; i++)
  161.             {
  162.                 for (int j = 0; j < 4; j++)
  163.                     bytes[i, j] = a[bytes[i, j]];
  164.             }
  165.             return bytes;
  166.         }
  167.  
  168.  
  169.         static void Main(string[] args)
  170.         {
  171.             //Console.WriteLine("Умножение: " + Convert.ToString((Mult(0xbb, 0xfb, 0x11b)), 16));
  172.             //Console.WriteLine("Обратный элемент: " + Convert.ToString(obr(0xbb, 0x11b), 16));
  173.             //Console.WriteLine("Типо 1 должно быть: " + Mult(obr(0xbb, 0x11b), 0xbb, 0x11b) % 0x11b);
  174.             //Console.WriteLine(Convert.ToString(obr(0xba, 0x11b), 16));
  175.  
  176.  
  177.             //пример кодирования
  178.             byte[,] m = GetToMatrix("abcdefgtabcdefgt");
  179.             m = XorWIthKey(Pi(Gamma(Tetta(m))), key);
  180.             for (int i = 0; i < 4; i++)
  181.             {
  182.                 for (int j = 0; j < 4; j++)
  183.                 {
  184.                     Console.Write(m[i, j] + " ");
  185.                 }
  186.                 Console.WriteLine("");
  187.             }
  188.  
  189.  
  190.         }
  191.     }
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement