Шифрование текста по ключевому слову - C#
Формулировка задачи:
Привет всем! Копался в поисках алгоритмов шифрования на C# и наткнулся на данный код (ниже). Не могу разобраться в том, как зависит зашифрованный текст от ключевого слова. Мог бы кто-нибудь из добродушных помочь понять алгоритм шифровки (как кол-во буковок и сами буковки влияют на конечный результат??) в коде немного путаюсь, когда начинаю сам разбирать.
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ConsoleApplication1
- {
- class Program
- {
- static void Main(string[] args)
- {
- CryptWord crypt = new CryptWord("WORLD");
- string crypted = crypt.Encrypt("MY BIG IDEA IS WRITE THIS");
- // получаем: IY OEB ELDW EQ VPESD SCEQ
- string decrypted = crypt.Decrypt(crypted);
- // получаем: MY BIG IDEA IS WRITE THIS
- try
- {
- crypt.Encrypt("My big idea is write this");
- }
- catch (CryptException ex)
- {
- /*
- * Требуется расширение алфавита, так как C# рассматривает 'Y' != 'y'
- *
- * ex.Message = "Строка переданная для шифрования/дешифрования содержит символ 'y' отсутствующий в алфавите"
- */
- }
- crypt = new CryptWord("WORMS"); // было WORLD
- crypted = crypt.Encrypt("MY BIG IDEA IS WRITE THIS");
- // получаем: HY ODB DMSW DP VNDQS QCDP
- decrypted = crypt.Decrypt(crypted);
- // получаем: MY BIG IDEA IS WRITE THIS
- }
- }
- class CryptWord
- {
- public CryptWord(string word)
- {
- cryptAlph = new char[alph.Length];
- int len = word.Length; int alphLen = alph.Length;
- if (len > alphLen) throw new CryptException("Кодовое слово не может быть длинее алфавита");
- for (int i = 0; i < len; i++)
- {
- char w = word[i];
- for (int j = 0; j < i; j++)
- {
- if (cryptAlph[j] == w) throw new CryptException("Кодовое слово не может содержать повторяющиеся буквы");
- }
- cryptAlph[i] = w;
- }
- int idx=len;
- for (int i = 0; i < alphLen; i++)
- {
- bool skip = false;
- for (int j = 0; j < len; j++)
- {
- if (alph[i] == word[j])
- {
- skip = true; break;
- }
- }
- if (!skip) cryptAlph[idx++] = alph[i];
- }
- }
- /// <summary>
- /// Алфавит
- /// </summary>
- static readonly char[] alph = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ".ToCharArray();
- /// <summary>
- /// Шифрованный алфавит
- /// </summary>
- char[] cryptAlph;
- /// <summary>
- /// Зашифровать строку
- /// </summary>
- /// <param name="input">Строка для шифрования</param>
- /// <returns>Шифр</returns>
- public string Encrypt(string input)
- {
- return transfer(input, alph, cryptAlph);
- }
- /// <summary>
- /// Расшифровать строку
- /// </summary>
- /// <param name="cryptedStr">Шифр</param>
- /// <returns>Дешифрованная строка</returns>
- public string Decrypt(string cryptedStr)
- {
- return transfer(cryptedStr, cryptAlph, alph);
- }
- string transfer(string input, char[] from, char[] to)
- {
- StringBuilder ret = new StringBuilder(input.Length);
- int len = input.Length; int fromLen = from.Length;
- for (int i = 0; i < len; i++)
- {
- int idx = -1; char w = input[i];
- for (int j = 0; j < fromLen; j++)
- {
- if (from[j] == w) { idx = j; break; }
- }
- if (idx == -1) throw new CryptException("Строка переданная для шифрования/дешифрования содержит символ '" + w + "' отсутствующий в алфавите");
- ret.Append(to[idx]);
- }
- return ret.ToString();
- }
- }
- class CryptException : Exception
- {
- public CryptException(string message)
- : base(message)
- {
- }
- }
- }
Решение задачи: «Шифрование текста по ключевому слову»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- namespace RC4Test
- {
- public partial class Form1 : Form
- {
- byte[] S = new byte[256];
- int x = 0;
- int y = 0;
- public Form1(byte[] key)
- {
- init(key);
- }
- public Form1()
- {
- InitializeComponent();
- }
- private void init(byte[] key)
- {
- int keyLength = key.Length;
- for (int i = 0; i < 256; i++)
- {
- S[i] = (byte)i;
- }
- int j = 0;
- for (int i = 0; i < 256; i++)
- {
- j = (j + S[i] + key[i % keyLength]) % 256;
- S.Swap(i, j);
- }
- }
- public byte[] Encode(byte[] dataB, int size)
- {
- byte[] data = dataB.Take(size).ToArray();
- byte[] cipher = new byte[data.Length];
- for (int m = 0; m < data.Length; m++)
- {
- cipher[m] = (byte)(data[m] ^ keyItem());
- }
- return cipher;
- }
- public byte[] Decode(byte[] dataB, int size)
- {
- return Encode(dataB, size);
- }
- private byte keyItem()
- {
- x = (x + 1) % 256;
- y = (y + S[x]) % 256;
- S.Swap(x, y);
- return S[(S[x] + S[y]) % 256];
- }
- private void button1_Click(object sender, EventArgs e)
- {
- byte[] key = ASCIIEncoding.ASCII.GetBytes(textBox1.Text);
- Form1 encoder = new Form1(key);
- string testString = textBox3.Text;
- byte[] testBytes = ASCIIEncoding.ASCII.GetBytes(testString);
- byte[] result = encoder.Encode(testBytes, testBytes.Length);
- string vix = System.Text.Encoding.UTF8.GetString(result);//в RC4
- textBox2.Text = vix;
- var sb = new StringBuilder();
- foreach (var bt in Encoding.Unicode.GetBytes(vix))
- }
- }
- static class SwapExt
- {
- public static void Swap<T>(this T[] array, int index1, int index2)
- {
- T temp = array[index1];
- array[index1] = array[index2];
- array[index2] = temp;
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д