Поделитесь пожалуйста прогой на бейсике, если есть таковая.
Кодер и декодер шифра методом перестановки с использованием слова-ключа.
Поделитесь пожалуйста прогой на бейсике, если есть таковая.
Кодер и декодер шифра методом перестановки с использованием слова-ключа.
Последний раз редактировалось ALKO; 09.02.2013 в 22:54.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
нужно просто примитивное шифрование или криптографически стойкое? примитивное можно самому придумать, но рассчитывать на него нельзя вообще. стойкое - брать только готовое, придумывание ни к чему хорошему не приводит.
и почему именно перестановки?
Предложу примитивный XOR RND(), хоть это и не перестановка.
Есть исходник на си шарпе... Но, мне кажется, там сложновато будет переделать под синклер-бейсик.
Код: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 Shifr1 { public partial class Form1 : Form { char FirstLetter; int strok; int stolb; char [,]arrR = new char[12,12]; string sR; // Копируем строку без пробелов для передачи в функцию расшифровки int click = 0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { click = 0; if (textBox2.Text.Length < 1) { richTextBox1.Text = richTextBox2.Text = "мг...давай, до свидания...введи кодовое слово\n"; return; } //--------------------------------------------------------- string soob = textBox1.Text; string kodslovo = textBox2.Text; soob = BezProbelov(soob); kodslovo = BezProbelov(kodslovo); sR = kodslovo; int stolb = kodslovo.Length; double strok_double = Convert.ToDouble(soob.Length) / Convert.ToDouble(stolb); int strok = Convert.ToInt16(Math.Ceiling(strok_double)) + 1; char[,] arr = new char[12, 12]; arr = TWOmermassiv(arr, strok, stolb, kodslovo); int ind = 0; int maxind = soob.Length; //--------------------------------------------------------- for (int i = 1; i < strok; i++) //// Записываем шифруемое слово в двухмерный массив { for (int j = 0; j < stolb; j++) { arr[i,j] = soob[ind]; ind = ind + 1; if (ind>=maxind) break; } if (ind >= maxind) break; } /// Шифруем сообщение Shifruet(arr); //------------------------------------------------------------ for (int i = 0; i < stolb; i++) //// Читаем из массива зашифрованное сообщение { for (int j = 1; j < strok; j++) { richTextBox1.Text+=arr[j, i]; } } richTextBox1.Text += "\n"; //-------------------------------------------------------------- for (int i = 0; i < strok; i++) //// для расшифровки копируем зашифрованное сообщение { for (int j = 0; j < stolb; j++) { arrR[i, j] = arr[i, j]; } } // этосообщениеследуетотправить } private char[,] TWOmermassiv(char[,] arr,int Lstrok,int Lstolb, string s) // Создаётся массив шириной длины кодового слова { arr = new char[Lstrok, Lstolb]; for (int i = 0; i < Lstolb; i++) { arr[0, i] = s[i]; } strok = Lstrok; stolb = Lstolb; return arr; } private void Shifruet(char[,] arr) // Шифруем сообщение перемещая все столбы { for (int j = 0; j < stolb; j++) { for (int i = 0; i < stolb; i++) { if (arr[0, i] > arr[0, j]) { for (int k = 0; k < strok; k++) { FirstLetter = arr[k, i]; arr[k, i] = arr[k, j]; arr[k, j] = FirstLetter; } i = 0; } } } } private void Rashifr() { char[,] arr2 = new char[2, stolb]; //// Создаём 2мерный массив. 0-ая строка хранит кодовое слово, 1-ая индексы букв for (int z = 0; z < sR.Length; z++) { arr2[0, z] = sR[z]; //// заполняем 0ую кодовым словом } for (int z = 0; z < sR.Length; z++) { arr2[1, z] = Convert.ToChar(z); //// заполняем 1ую индексами } //--------------------------------------------------------------- for (int j = 0; j < stolb; j++) //// сортируем по 0ой строке, то есть по буквам { for (int i = 0; i < stolb; i++) { if (arr2[0, i] > arr2[0, j]) { for (int k = 0; k < 2; k++) { FirstLetter = arr2[k, i]; arr2[k, i] = arr2[k, j]; arr2[k, j] = FirstLetter; } i = 0; } } } if(click==0) { for (int i = 0; i < stolb; i++) ///// заменяем 0ую строку закодированного сообщения на отсортированные индексы { arrR[0, i] = arr2[1, i]; } Shifruet(arrR); ///// сортируем по новой, нулевой строке, по индексам закодированное сообщение click++; } for (int i = 1; i < strok; i++) //// выводим во втрой ричьбокс { for (int j = 0; j < stolb; j++) { richTextBox2.Text += arrR[i, j]; } } richTextBox2.Text += "\n"; } private string BezProbelov(string bezS) { string R; for (int f = 0; f < bezS.Length; f++) { if (bezS[f] == ' ') { R = bezS.Substring(0, f); R += bezS.Substring(f + 1, bezS.Length - f - 1); bezS = R; f = 0; } } return bezS; } private void button2_Click(object sender, EventArgs e) { Rashifr(); } } }
самый простой алгоритм тогда, который в голову пришел, типа того:
берем код 1 буквы пароля, находим остаток от деления на длину шифруемой строки, получаем число Х от 0 до длина-1. берем из шифруемой строки букву номер Х и добавляем к выходной строке. из входной строки эту букву выкусываем, ее длина уменьшается на 1. берем след. букву пароля и т.д. когда пароль кончился, начинаем с его начала.
можно еще проще:
менять местами буквы в строке, индексы букв высчитывать из пароля (например, тоже нахождением остатка от деления). но тут надо смотреть, чтобы число перестановок букв было велико, и буквы затрагивались разные, даже если в пароле всего 1-2 буквы (например, подмешивать счетчик цикла).
Так-с... Шифратор намутил.
Теперь дешифровать это надо.
(прога конечно мозговыносная получилась)
Для надежного шифрования - рекомендую свою реализацию AES.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)