=)CS's|swat-gres
Мастер
(1608)
15 лет назад
Суть метода заключается в том, что данные шифруются при помощи некоторого ключа, в нашем случае это массив из десяти случайных чисел из диапазона 1-20. Т. е все данные разбиваются на группы по десять символов и, каждый символ шифруется методом Цезаря, но сдвиг осуществляется не на два, а на число с соответствующим индексом из массива ключа. (1-й на key[1], 2-й на key[2],...10-й на key[10], 1-й на key[1] и так далее до конца) . Для большей надежности шифрации будем использовать всю таблицу ASCII.
ПРИМЕР:
Ключ:
Индекс: 1 2 3 4 5 6 7 8 9 10
Число: 5 7 8 15 6 13 9 17 7 3
Шифруемый текст:
Он сел на скамью.
Зашифрованный текст:
У+(Ёл¬)-з#ц-и¬Єv7
Так как ключ при каждой шифрации меняется, то его нужно сохранять, но просто записывать его в файл было бы неразумно, потому что такой файл можно быстро расшифровать, зная метод шифрации. Поэтому для решения данной задачи я рекомендую вам делать следующее:
1) Использовать постоянный, известный только вам, ключ не сохраняя его в файле.
ДОСТОИНСТВА:
Расшифровать файл будет достаточно сложно, даже зная метод шифрации.
НЕДОСТАТКИ:
Злоумышленник, узнав ключ и зная метод щифрации, получит доступ ко всем вашим зашифрованным данным.
2) Сохранять ключ в файле специальным образом.
ДОСТОИНСТВА:
Все зашифрованные файлы будут зашифрованы по разному, что увеличивает надежность.
НЕДОСТАТКИ:
В зашифрованном файле будет храниться ключ к дешифрации, поэтому разгадав каким образом он там храниться злоумышленник получит доступ к ключу, а следовательно, зная метод шифрации, к зашифрованным данным. В нашем примере ключ записывается в конец файла следующим образом:
1-е число заменяется на символ с номером 1+это число из таблицы ASCII. Затем 10-е число заменяется на символ с номером 1+данное число, и так далее. Чтобы числа не слились в единое число между ними ставится #.
Ключ из примера будет выгледеть так:
#########
Программа на BASIC
CLS
COLOR 15, 1 PRINT "Шифрация Автор: Якунин Максим Сергеевич"
COLOR 15, 0
PRINT
INPUT "Введите имя шифруемого файла: "; inpF$
INPUT "Введите имя зашифрованного файла: "; OutF$
OPEN inpF$ FOR INPUT AS #1
OPEN OutF$ FOR OUTPUT AS #2
PRINT "Шифрую... "
WHILE NOT EOF(1)
INPUT #1, mstr$
FOR k = 1 TO LEN(mstr$)
sim$ = MID$(mstr$, k, 1)
GOSUB 10
MID$(mstr$, k, 1) = shif$
NEXT k
PRINT #2, mstr$
WEND
CLOSE #1
CLOSE #2
PRINT "Шифрация закончена! "
END
10 SELECT CASE sim$
CASE "а" TO "н"
shif$ = CHR$(ASC(sim$) + 2)
CASE "о"
shif$ = "р"
CASE "п"
shif$ = "с"
CASE "р" TO "э"
shif$ = CHR$(ASC(sim$) + 2)
CASE "ю"
shif$ = "а"
CASE "я"
shif$ = "б"
CASE "А" TO "Я"
shif$ = CHR$((ASC(sim$) - ASC("А") + 2) MOD 32 + ASC("А"))
CASE "a" TO "z"
shif$ = CHR$((ASC(sim$) - ASC("a") + 2) MOD 26 + ASC("a"))
CASE "A" TO "Z"
shif$ = CHR$((ASC(sim$) - ASC("A") + 2) MOD 26 + ASC("A"))
CASE ELSE
shif$ = sim$
END SELECT
RETURN
Программа на PASCAL
Program shifr_lk;
uses crt;
const l=10; {Размер ключа}
var M_key: array[1..l] of byte; {Массив хранящий числа ключа}
k,c,t: byte;{Служебные переменные}
i_name,o_name: string[12];{Имена файлов}
m_str: string[80];{Читаемая строка}
i_f,o_f: text;{Файловые переменные}
{------Возвращает зашифрованный символ---------------}
function sh(sim: char; n: word): char;
begin sh:=chr((ord(sim)-1+n) mod 254+1) end;
{----------------------------------------------------}
begin
clrscr;
randomize;{Включение генератора случайных чисел}
for c:=1 to l do m_key[c]:=1+random (20); {Формирование ключа}
textcolor (15);
textbackground(1);
insline;
writeln(' Шифратор Автор: Якунин Максим Сергеевич');
textbackground(0);
writeln;
write ('Введите имя шифруемого файла: ');
readln(i_name); {Ввод имени шифруемого файла}
write ('Введите имя зашифрованного файла: ');
readln (o_name);{Ввод имени зашифрованного файла}
assign (i_f,i_name);
assign (o_f,o_name);
reset (i_f); {Открываем файл с именем i_name для чтения}
rewrite (o_f);{Открываем файл с именем o_name для записи}
Writeln ('Шифрую ...');