УДК 681.323
М.Д. Скубилин, О.Б. Спиридонов
О ПРОГРАММНОЙ ДИВЕРСИФИКАЦИИ/РЕПЛИКАЦИИ
ИНФОРМАЦИИ
Защите информации от несанкционированного доступа человечество уделяет значительное внимание с незапамятных времен [1]. Для изложения конфиденциальных сведений (дипломатических, военных и др.) применяют шифры. Шифрование (кодирование) производится путем замены целых фраз, слов, слогов или отдельных букв цифрами или буквами в различных комбинациях на основе заранее принятой системы, являющейся соответственно ключом для расшифровки текста. Шифрование не всегда гарантирует полную недоступность содержимого переписки, т.к. даже к очень сложным шифрам может быть подобран ключ путем расчетов, вычислений повторяемости отдельных знаков и т.п.
Известные способы защиты информации от доступа неопределенному кругу лиц отличаются значительными временными затратами на шифрование текста [2], а еще большими - на его расшифровку [3], потерей части информации [4] и не идентичностью технических средств кодирования и декодирования информации [5, 6].
Не заботясь о помехозащищенности информации в канале связи, упростить процесс ее шифрования и дешифрования представляется возможным программными средствами [7].
Если информационное сообщение (текст, файл) распылить (рассредоточить -диверсифицировать) беспорядочно, то возврат к исходному тексту (его репликация) тем более затруднен, чем больше объем исходного информационного сообщения. Исходя из этого, допустимо, не усложняя процесса восстановления (репликации), осуществлять преобразования, при которых исходный файл информации разбивается на блоки переменной длины и в каждом блоке осуществляется варьируемый сдвиг по кольцу ЛБСП-кода каждого символа блока. Закодированный
(зашифрованный) таким образом файл можно оперативно декодировать
(расшифровать) путем обратного сдвига символов блоков файла.
Программная реализация диверсификации и/или репликации информации на языке программирования Borland C [7] предполагает наличие конфиденциальной информации, например в файле “proba.txt”, и запускающего модуля, - в файле “kod.exe”, при этом осуществляется ввод с командной строки KOD proba.txt KiRi, KiLi, ... “Enter” или KOD proba.txt UiRj, UiLj, ... “Enter” (для кодирования и декодирования соответственно), где К - кодировать, U - декодировать, i (i=1,m) -
число символов в данном блоке, R - сдвиг вправо, L - сдвиг влево, j (j=1,n) число позиций сдвига символов в данном блоке.
Программа диверсификации/репликации информации:
#include <stdio.h>
#include <io.h>
#include <dos.h>
#include <sys\stat.h>
#include <errno.h>
#include <fcntl.h>
main(argc, argv) int argc; char *argv[];
{FILE *ff; int ch; int ij; unsigned char *ptrsymb; unsigned char symb[1024]; unsigned char strl, str2; unsigned long int size; int sizeblock=0; int hk; int handle; int smesh=0; ptrsymb=&symb[0]; if(argc!=4) {printf("Использование программы :\n" "C:>KOD <имя файла> <операция> <направление>\ "\t Операции :\n\t\tK : кодировать"\n\t\tU :
раскодировать\n""\t Направление :" "\n\t\tR : вправо""\n\t\tL : влево."); exit(0); } if(*argv[2]=='K')goto zk; if(*argv[2]=='U')goto uk; else exit(0);
zk: if((ff=fopen(argv[1],"r+"))==NULL) {printf("\nНе найден файл %s",argv[1]); exit(l);} printf("\nКодируется файл :%s", argv[1]); handle=open(argv[1], O_CREAT); size=filelength(handle); close(handle); povtor: printf("\nМаксимальный размер блока в байтах :"); printf("%d", size); printf("\nВведите размер блока в байтах :"); scanf("%d",&sizeblock);
if(size<sizeblock) {printf("\nРазмер блока введен не корректно!"); goto povtor;} printf("\nВведите ключ :"); scanf("%d",&hk);
fseek(ff,smesh,0); fread(ptrsymb,1,sizeblock,ff); if(*argv[3]=='L')goto zkl; for(j=0;j<hk;j++)
{str1=symb[0]&1; symb[0]=symb[0]>>1; for(i=1;i<sizeblock;i++) {str2=symb[i]&1; symb[i]=symb[i]>>1; symb[i]=symb[i]|(str1<<7); str1=str2; } symb[0]=symb[0]|(str1<<7); } fseek(ff,smesh,0); fwrite(ptrsymb,1,sizeblock,ff);
smesh=smesh+sizeblock; size=size-sizeblock; if (size!=0) goto povtor; fclose(ff); printf("\nФайл %s закодирован.", argv[1]); exit(0); zkl: for(j=0;j<hk;j++)
{ str1=symb[0]&0x80; symb[0]=symb[0]<<1; for(i=1;i<sizeblock;i++)
{ str2=symb[i]&0x80; symb[i]=symb[i]<<1; symb[i-1]=symb[i-1]|(str2>>7); } symb[sizeblock-1]=symb [sizeblock-1]|(str1>>7); } fseek(ff,smesh,0); fwrite(ptrsymb,1,sizeblock,ff);
smesh=smesh+sizeblock; size=size-sizeblock; if (size!=0) goto povtor; fclose(ff); printf("\nФайл %s закодирован.", argv[1]); exit(0); uk:if((ff=fopen(argv[1],"r+"))==NULL)
{ printf("\nНе найден файл %s",argv[1]); exit(1); } handle=open(argv[1], O_CREAT); size=filelength(handle); close(handle); printf("\nРаскодировка файла :%s", argv[1]); povtor2: printf("\nВведите размер блока в байтах :"); scanf("%d",&sizeblock); printf("\nВведите ключ :"); scanf("%d",&hk); fseek(ff,smesh,0); fread(ptrsymb,1,sizeblock,ff); if(*argv[3]=='L') goto ukr; for(j=0;j<hk;j++)
{ str1=symb[0]&0x80; symb[0]=symb[0]<<1; for(i=1;i<sizeblock;i++)
{ str2=symb[i]&0x80; symb[i]=symb[i]<<1; symb[i-1]=symb[i-1]|(str2>>7);} symb[sizeblock-1 ]=symb[sizeblock-1]|(str1>>7); }
ГБеек^БтеБ^О); Г-мт11е(р1;г8утЬ,1,812еЬ1оск,Г1);
вшевЬ=втевЬ+в12еЬ1оск; в12е=в12е-в12еЬ1оск; if (81ге1=0) goto роУ;ог2; Гс1оБе(Г1); рпП£("\пФайл %б раскодирован.", argу[1]); ехй(0); икг: &г(|=0;|<Ьк;|++)
{ Б1г1=вутЬ[0]&1; вутЬ[0]=вутЬ[0]>>1;
Гог(1=1;1<в1геЬ1оск;1++)
{ Б1г2=вутЬ[1]&1; вутЬ[1]=вутЬ[1]>>1; вутЬ[1]=вутЬ[1]|(в1г1<<7); б1г1=в1г2;} вутЬ[0]=вутЬ[0]|(в1г1<<7); } Гвеек(ГГ,втевЬ,0); fwrite(ptrsymЬ,1,sizeЬ1ock,ff); втевЬ=втевЬ+в12еЬ1оск; size=size-sizeЬ1ock; if (size!=0) goto роУ;ог2; fc1ose(ff); printf("\nФайл %s раскодирован.", а^у[1]); exit(0);}
Пример реализации диверсификации и репликации информации:
Файл на передающей стороне (исходное информационное сообщение): СПОСОБ ЗАЩИТЫ ИНФОРМАЦИИ ОТ
НЕСАНКЦИОНИРОВАННОГО ДОСТУПА
Файл на принимающей стороне (в канале связи) для несанкционированного пользователя, при различных вариантах кодирования:
1)2Р>:Р:ПА-ПЬЛА»6К:ВН@КВБПС1ПРТЬЬР+КБСР-П;РП--;д-
□ ЙТ2Кд";
2)2Га;1П<п;в6-ПВ6К:В2Пг»А:НА;ВЬЬР+КБСР-НСА
.......................................?
^□^^□“□1^8а^ □ЙТ^В^Т^ □ □ТЁ#аа'#Ьаа#ааЁ^ в(^++вд-
□ ^Т2Яд"^;
Файл на принимающей стороне для санкционированного пользователя:
СПОСОБ ЗАЩИТЫ ИНФОРМАЦИИ ОТ
НЕСАНКЦИОНИРОВАННОГО ДОСТУПА
хёпё1 аабёают ааШа! оаёёа аёу 1апа1ёбёйёбташа1 йёи5таоаёу 1баай0аао 12000
л х ' ^ ' о л ' л л /\ а а о л л /к у г .. у у /у ..х о .. ^ л л /V .. .. о л ^ .. у >С г .. г/к >с у >с о л л/V г у .. у о г у >с у г у г/к о
ё бапоао п бтоп 1аиа1а оаёёа, ^01 юаапоааёуаопу обоан ба?ба0ёиё ?ааа^аё ?а ба50ша
Использование приведенной выше программы обеспечивает идентичность технических средств на передающей и принимающей сторонах канала связи и оперативную репликацию информации санкционированным пользователем.
1. Конан Дойл А. Пляшущие человечки. Кн. Приключения Шерлока Холмса. -М.: Сов. Россия, 1991. с. 179-203.
2. Эйдельмант И.Б. Кодированный издательский оригинал для
автоматического набора. - М.: Машиностроение, 1965. с. -210с.
3. Берлин А. С. Системы программирования набора. - М.: Сов. радио, 1971. -
186с.
4. Сяо Д., Керр Д., Мэдник С. Защита ЭВМ. - М.: Мир, 1982. с. 137 - 162.
5. Скрипко В.А., Шувариков В.М. Устройство защиты информации. Пат. ЯИ №2022346, м. кл. 006Б 13/00, 009С 1/00, б.20. 1994.
6. Березин Б.В. Способ шифрования двоичной информации и устройство для осуществления способа “Албер”. Пат. ЯИ №2099890, м. кл. И04Ь 9/00, б. 35, 1997.
7. Трой Д. Программирование на языке Си для персонального компьютера 1ВМ РС. -М.: Радио и связь, 1991. - 432с.