Поделитесь пожалуйста прогой на бейсике, если есть таковая.
Кодер и декодер шифра методом перестановки с использованием слова-ключа.
Вид для печати
Поделитесь пожалуйста прогой на бейсике, если есть таковая.
Кодер и декодер шифра методом перестановки с использованием слова-ключа.
нужно просто примитивное шифрование или криптографически стойкое? примитивное можно самому придумать, но рассчитывать на него нельзя вообще. стойкое - брать только готовое, придумывание ни к чему хорошему не приводит.
и почему именно перестановки?
Предложу примитивный 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 буквы (например, подмешивать счетчик цикла).
Так-с... Шифратор намутил.
Теперь дешифровать это надо.
(прога конечно мозговыносная получилась):v2_dizzy_vodka:
Для надежного шифрования - рекомендую свою реализацию AES.