Шифрование текста по ключевому слову - C#

Узнай цену своей работы

Формулировка задачи:

Привет всем! Копался в поисках алгоритмов шифрования на C# и наткнулся на данный код (ниже). Не могу разобраться в том, как зависит зашифрованный текст от ключевого слова. Мог бы кто-нибудь из добродушных помочь понять алгоритм шифровки (как кол-во буковок и сами буковки влияют на конечный результат??) в коде немного путаюсь, когда начинаю сам разбирать.
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace ConsoleApplication1
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. CryptWord crypt = new CryptWord("WORLD");
  12. string crypted = crypt.Encrypt("MY BIG IDEA IS WRITE THIS");
  13. // получаем: IY OEB ELDW EQ VPESD SCEQ
  14. string decrypted = crypt.Decrypt(crypted);
  15. // получаем: MY BIG IDEA IS WRITE THIS
  16. try
  17. {
  18. crypt.Encrypt("My big idea is write this");
  19. }
  20. catch (CryptException ex)
  21. {
  22. /*
  23. * Требуется расширение алфавита, так как C# рассматривает 'Y' != 'y'
  24. *
  25. * ex.Message = "Строка переданная для шифрования/дешифрования содержит символ 'y' отсутствующий в алфавите"
  26. */
  27. }
  28. crypt = new CryptWord("WORMS"); // было WORLD
  29. crypted = crypt.Encrypt("MY BIG IDEA IS WRITE THIS");
  30. // получаем: HY ODB DMSW DP VNDQS QCDP
  31. decrypted = crypt.Decrypt(crypted);
  32. // получаем: MY BIG IDEA IS WRITE THIS
  33.  
  34. }
  35. }
  36. class CryptWord
  37. {
  38. public CryptWord(string word)
  39. {
  40. cryptAlph = new char[alph.Length];
  41. int len = word.Length; int alphLen = alph.Length;
  42. if (len > alphLen) throw new CryptException("Кодовое слово не может быть длинее алфавита");
  43. for (int i = 0; i < len; i++)
  44. {
  45. char w = word[i];
  46. for (int j = 0; j < i; j++)
  47. {
  48. if (cryptAlph[j] == w) throw new CryptException("Кодовое слово не может содержать повторяющиеся буквы");
  49. }
  50. cryptAlph[i] = w;
  51. }
  52.  
  53. int idx=len;
  54. for (int i = 0; i < alphLen; i++)
  55. {
  56. bool skip = false;
  57. for (int j = 0; j < len; j++)
  58. {
  59. if (alph[i] == word[j])
  60. {
  61. skip = true; break;
  62. }
  63. }
  64. if (!skip) cryptAlph[idx++] = alph[i];
  65. }
  66. }
  67. /// <summary>
  68. /// Алфавит
  69. /// </summary>
  70. static readonly char[] alph = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ".ToCharArray();
  71. /// <summary>
  72. /// Шифрованный алфавит
  73. /// </summary>
  74. char[] cryptAlph;
  75. /// <summary>
  76. /// Зашифровать строку
  77. /// </summary>
  78. /// <param name="input">Строка для шифрования</param>
  79. /// <returns>Шифр</returns>
  80. public string Encrypt(string input)
  81. {
  82. return transfer(input, alph, cryptAlph);
  83. }
  84. /// <summary>
  85. /// Расшифровать строку
  86. /// </summary>
  87. /// <param name="cryptedStr">Шифр</param>
  88. /// <returns>Дешифрованная строка</returns>
  89. public string Decrypt(string cryptedStr)
  90. {
  91. return transfer(cryptedStr, cryptAlph, alph);
  92. }
  93. string transfer(string input, char[] from, char[] to)
  94. {
  95. StringBuilder ret = new StringBuilder(input.Length);
  96. int len = input.Length; int fromLen = from.Length;
  97. for (int i = 0; i < len; i++)
  98. {
  99. int idx = -1; char w = input[i];
  100. for (int j = 0; j < fromLen; j++)
  101. {
  102. if (from[j] == w) { idx = j; break; }
  103. }
  104. if (idx == -1) throw new CryptException("Строка переданная для шифрования/дешифрования содержит символ '" + w + "' отсутствующий в алфавите");
  105. ret.Append(to[idx]);
  106. }
  107. return ret.ToString();
  108. }
  109. }
  110. class CryptException : Exception
  111. {
  112. public CryptException(string message)
  113. : base(message)
  114. {
  115. }
  116. }
  117. }

Решение задачи: «Шифрование текста по ключевому слову»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace RC4Test
  11. {
  12.     public partial class Form1 : Form
  13.     {
  14.         byte[] S = new byte[256];
  15.         int x = 0;
  16.         int y = 0;
  17.         public Form1(byte[] key)
  18.         {
  19.             init(key);
  20.         }
  21.         public Form1()
  22.         {
  23.             InitializeComponent();
  24.  
  25.         }
  26.         private void init(byte[] key)
  27.         {
  28.             int keyLength = key.Length;
  29.  
  30.             for (int i = 0; i < 256; i++)
  31.             {
  32.                 S[i] = (byte)i;
  33.             }
  34.  
  35.             int j = 0;
  36.             for (int i = 0; i < 256; i++)
  37.             {
  38.                 j = (j + S[i] + key[i % keyLength]) % 256;
  39.                 S.Swap(i, j);            
  40.             }
  41.         }
  42.  
  43.         public byte[] Encode(byte[] dataB, int size)
  44.         {      
  45.             byte[] data = dataB.Take(size).ToArray();              
  46.  
  47.             byte[] cipher = new byte[data.Length];
  48.  
  49.             for (int m = 0; m < data.Length; m++)
  50.             {              
  51.                 cipher[m] = (byte)(data[m] ^ keyItem());
  52.             }
  53.  
  54.             return cipher;
  55.         }
  56.         public byte[] Decode(byte[] dataB, int size)
  57.         {
  58.             return Encode(dataB, size);
  59.         }
  60.         private byte keyItem()
  61.         {
  62.             x = (x + 1) % 256;
  63.             y = (y + S[x]) % 256;
  64.  
  65.             S.Swap(x, y);
  66.  
  67.             return S[(S[x] + S[y]) % 256];
  68.         }
  69.  
  70.         private void button1_Click(object sender, EventArgs e)
  71.         {
  72.             byte[] key = ASCIIEncoding.ASCII.GetBytes(textBox1.Text);
  73.             Form1 encoder = new Form1(key);
  74.             string testString = textBox3.Text;
  75.             byte[] testBytes = ASCIIEncoding.ASCII.GetBytes(testString);
  76.             byte[] result = encoder.Encode(testBytes, testBytes.Length);
  77.             string vix = System.Text.Encoding.UTF8.GetString(result);//в RC4
  78.             textBox2.Text = vix;
  79.             var sb = new StringBuilder();
  80.             foreach (var bt in Encoding.Unicode.GetBytes(vix))
  81.         }
  82.     }
  83.  
  84.     static class SwapExt
  85.     {
  86.         public static void Swap<T>(this T[] array, int index1, int index2)
  87.         {
  88.             T temp = array[index1];
  89.             array[index1] = array[index2];
  90.             array[index2] = temp;
  91.         }
  92.     }
  93. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.733 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы