Advertisement
Guest User

Untitled

a guest
May 23rd, 2012
419
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.99 KB | None | 0 0
  1. public static class KeyUtility
  2. {
  3.     static KeyUtility()
  4.     {
  5.         Alphabet = new[] {
  6.             'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
  7.             'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S',
  8.             'T', 'U', 'V', 'X', 'Y', 'Z', '0', '1',
  9.                     '2', '3', '4', '5', '6', '7', '8', '9'
  10.         };
  11.            
  12.         ReverseAlphabet = Alphabet
  13.             .Select((c, i) => new { Char = c, Value = i })
  14.             .ToDictionary(k => k.Char, v => (byte) v.Value);
  15.     }
  16.        
  17.     internal static char[] Alphabet;       
  18.     private static IDictionary<char, byte> ReverseAlphabet;
  19.        
  20.     public static string ToKey(byte[] key, int groupSize)
  21.         {
  22.             int i = 0, part = 0;
  23.  
  24.             var buffer = new KeyBuilder(key.Length, groupSize);
  25.             while(true)
  26.             {
  27.                 buffer.Append(key[i] >> 3);
  28.                                
  29.                 part = key[i++] & 7;            
  30.                 if (i == key.Length)
  31.                     break;
  32.                
  33.                 buffer.Append((part << 2) | (key[i] >> 6));
  34.                 buffer.Append((key[i] & 62) >> 1);
  35.                                
  36.                 part = key[i++] & 1;
  37.                 if (i == key.Length)
  38.                     break;
  39.                  
  40.                 buffer.Append((part << 4) | (key[i] >> 4));
  41.                                
  42.                 part = key[i++] & 15;
  43.                 if (i == key.Length)
  44.                     break;
  45.                  
  46.                 buffer.Append((part << 1) | (key[i] >> 7));
  47.                 buffer.Append((key[i] & 124) >> 2);
  48.                                
  49.                 part = key[i++] & 3;
  50.                 if (i == key.Length)
  51.                     break;
  52.  
  53.                 buffer.Append((part << 3) | (key[i] >> 5));
  54.                 buffer.Append(key[i++] & 31);
  55.             }
  56.  
  57.             buffer.Append(part);
  58.  
  59.             return buffer.ToString();
  60.         }
  61.    
  62.     public static byte[] FromKey(string key)
  63.     {
  64.         var bytes = new List<byte>();            
  65.                 foreach (var c in key)
  66.                 {
  67.                     if (!Char.IsLetterOrDigit(c))
  68.                             continue;
  69.  
  70.                     byte value;
  71.                     if (!ReverseAlphabet.TryGetValue(Char.ToUpper(c), out value))
  72.                             return null;
  73.  
  74.                     bytes.Add(value);
  75.                 }
  76.  
  77.                 int i = 0, part = 0;
  78.  
  79.                 var result = new List<byte>();
  80.                 while (true)
  81.                 {
  82.                     part = bytes[i++] << 3;
  83.                     if (i == bytes.Count)
  84.                             break;
  85.  
  86.                     result.Add((byte) (part | (bytes[i] >> 2)));
  87.  
  88.                     part = bytes[i++] << 6;
  89.                     if (i == bytes.Count)
  90.                     {
  91.                             result[result.Count - 1] = (byte)((bytes[i - 2] << 3) | bytes[i - 1]);
  92.                             break;
  93.                     }
  94.  
  95.                     part |= bytes[i++] << 1;
  96.                     if (i == bytes.Count)
  97.                             break;
  98.  
  99.                     result.Add((byte) (part | (bytes[i] >> 4)));
  100.  
  101.                     part = bytes[i++] << 4;
  102.                     if (i == bytes.Count)
  103.                             break;
  104.                
  105.                     result.Add((byte) (part | (bytes[i] >> 1)));
  106.  
  107.                     part = bytes[i++] << 7;
  108.                     if (i == bytes.Count)
  109.                     {
  110.                             result[result.Count - 1] = (byte) ((bytes[i - 2] << 4) | bytes[i - 1]);
  111.                             break;
  112.                     }
  113.  
  114.                     part |= bytes[i++] << 2;
  115.                     if (i == bytes.Count)
  116.                             break;
  117.  
  118.                     result.Add((byte) (part | (bytes[i] >> 3)));
  119.  
  120.                     part = bytes[i++] << 5;
  121.                     if (i == bytes.Count)
  122.                     {
  123.                             result[result.Count - 1] = (byte)((bytes[i - 3] << 7) | (bytes[i -2] << 2) | bytes[i - 1]);
  124.                             break;
  125.                     }
  126.  
  127.                     result.Add((byte)(part | bytes[i++]));
  128.                 }
  129.            
  130.                 return result.ToArray();
  131.     }
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement