Шифрование текста по ключевому слову - 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;
        }
    }
}

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


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

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

15   голосов , оценка 3.733 из 5
Похожие ответы