Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник(Семенова).doc
Скачиваний:
13
Добавлен:
26.08.2019
Размер:
9.15 Mб
Скачать

Поля «Тип учреждения» таблицы «Участники конференции»

Рассмотрим другие способы задания списка для выбора одного из значений при вводе данных. Можно создать отдельную таблицу, в которой первое поле как раз и будет содержать значения необходимые для подстановки. Другие поля могут использоваться для пояснений и пр.

Создадим базу «ППС» (профессорско-преполавательский состав), состоящую из двух таблиц: ППС(Фамилия, Имя, Отчество, Должность) и Должности(Должность, Оклад, Требования к стажу). Вторую таблицу будем использовать для подстановки. Для этого опишем свойства поля «Должность» таблицы ППС так, как показано на рисунке 24.

Рис.24. Реализация ограничения целостности

для поля «Должность» таблицы «Участники конференции»

При заполнении поля «Должность» указанной базы будет появляться окно, позволяющее не только выбрать необходимое значение, но и при необходимости просмотреть содержимое и таких полей, как «оклад» и «требование к стажу (рис. 25).

Рис. 25. Заполнение поля «Должность»

таблицы «Участники конференции»

Следует заметить, что количество полей, содержимое которых можно будет просмотреть задается в опции «число столбцов (рис. 24).

6.3. Особенности реализации защиты данных при разработке ис в рамках концепции файловых систем

При разработке программ, обеспечивающих криптографическую защиту данных, следует учитывать следующие требования к алгоритму шифрования:

  • зашифрованный текст должен поддаваться чтению только при наличии ключа шифрования;

  • число операций для определения использованного ключа шифрования по фрагменту шифрованного текста и соответствующему ему открытого текста, должно быть не меньше общего числа возможных ключей;

  • знание алгоритма шифрования не должно влиять на надежность защиты;

  • незначительные изменения ключа шифрования должны приводить к существенному изменению вида зашифрованного текста;

  • незначительные изменения шифруемого текста должны приводить к существенному изменению вида зашифрованного текста даже при использовании одного и того же ключа;

  • длина шифрованного текста должна быть равна длине исходного текста;

  • любой ключ из множества возможных должен обеспечивать надежную защиту информации;

  • алгоритм должен допускать как программную, так и аппаратную реализацию [34].

При разработке ИС в рамках концепции файловых систем следует учитывать, что данные хранятся в автономных файлах. Особенности хранения данных зависят от используемых программных средств. Так, если ИС реализуется в Turbo Pascal, то для хранения структурированных данных используют типизированные файлы, для неструктурированных – текстовые. Рассмотрим фрагмент простейшей программы, реализующий идентификацию пользователя на основе одноразовых паролей, которые хранятся в текстовом файле. Условимся, что при вводе верного пароля на экран выводится фраза: «Вход в систему разрешен». В случае если пароль неверен или он уже был использован, на экране появиться сообщение: «Вход в систему запрещен».

Такая идентификация может быть реализована на основе следующей программы.

uses CRT;

var file_pass,file_tmp:text;

password, password_from_file:string[15];

flag:boolean;

begin

assign(file_pass,'D:/turbo/pass/password.txt');

reset(file_pass);

write('Введите пароль:');

readln(password);

flag:=false;

repeat

readln(file_pass, password_from_file);

if password_from_file = password then flag:=true;

until eof(file_pass) or flag;

reset(file_pass);

if flag then

begin

writeln('Вход в систему разрешен.');

assign(file_tmp,'password.tmp');

rewrite(file_tmp);

repeat

readln(file_pass, password_from_file);

if password_from_file <> password then

writeln(file_tmp, password_from_file);

until eof(file_pass);

close(file_pass);

erase(file_pass);

rename(file_tmp,'password.txt');

close(file_tmp);

end

else

begin

writeln('Доступ запрещен.');

close();

end;

end.

Следует обратить внимание на то, что в программе используется временный текстовый файл ('password.tmp'). В случае, если пользователь ввел правильный пароль (один из тех, которые хранятся в файле 'password.txt'), то все остальные пароли сначала будут переписаны во временный файл (строки программы 21 – 24), затем файл 'password.txt', а файл 'password.tmp' переименован в 'password.txt'.

Эта программа не предусматривает идентификацию пользователей в условиях коллективного доступа, при котором каждый из пользователей должен входить в систему под своим собственным логическим именем и паролем. В этом случае при разработке соответствующего фрагмента ИС на языке Pascal целесообразно использовать типизированные файлы.

Как было отмечено в предыдущей главе, при кодировании данных на основе блочных методов целесообразно длину блока определять таким образом, чтобы в последнем из них недоставало как можно меньше символов. Следует напомнить, что при использовании метода двойной транспозиции длина блока равна произведению длин ключей. Таким образом, возникает следующая задача: «В условиях разработки ИС в рамках концепции файловых систем разработать модуль, обеспечивающий выбор оптимальных длин ключей для шифрования методом двойной транспозиции и сгенерировать такие ключи. При этом учесть, что длина ключа должна находиться в интервале от 6 до 10». Ниже приведен фрагмент решения указанной задачи, выполненный на языке Pascal. При написании данного фрагмента сделано следующее допущение: «длина кодируемого текста вводится с клавиатуры».

uses CRT;

var

i,j, dlinkey1, dlinkey2, dlinblok, ostblok, ost: byte;

dlintext:integer;

key1, key2:string;

symbol: string[1];

begin

clrscr ;

randomize;

write(‘Введите длину текста, подлежащего шифрованию’);

readln(dlintext);

dlinkey1:=6;

dlinkey2:=6;

if dlintext mod 36<>0 then

begin

ost:= 36 - dlintext mod 36;

for i:=6 to 10 do

for j:=i+1 to 10 do

begin

dlinblok:=i*j;

ostblok:=I*j - dlintext mod dlinblok;

if (ostblok < ost) or (ostblok=I*j) then

begin

dlinkey1:=i;

dlinkey2:=j;

if ostblok=I*j then ost:=0 else ost:=ostblok;

end;

end;

end;

writeln(dlinkey1,' – длина первого ключа ' );

writeln(dlinkey2,' – длина второго ключа ' );

writeln(ost,' символов не хватает в последнем блоке ' );

key1:='';

key2:='';

for i:=1 to dlinkey1 do

begin

repeat

str(random(9),symbol);

until pos(symbol, key1)=0;

key1:=key1+ symbol;

end;

for i:=1 to dlinkey2 do

begin

repeat

str(random(9),symbol);

until pos(symbol, key2)=0;

key2:= key2+ symbol;

end;

writeln(key1, '- значение первого ключа’);

writeln(key2, '- значение второго ключа’);

readln;

end.

Как видно, основная идея алгоритма заключается в последовательном переборе длин ключей (для чего используются два вложенных цикла с параметром). При этом предусмотрено, что существует возможность отсечь проверку ключей для одной и той же длины блока (например, когда длина первого ключа равна шести и длина второго ключа равна 8, то не рассматриваются ключи с длинами восемь и шесть соответственно). С этой целью внутренний цикл, обеспечивающий перебор, имеет вид: for j:=i+1 to 10 do. Кроме того, определяется длинна незаполненной части последнего блока (ostblok:=I*j - dlintext mod dlinblok;) и и подбираются такие ключи, чтобы это значение было минимально возможным.

Следует заметить, что генерирование самих ключей было бы целесообразно оформить в виде процедуры, параметром которой является длина ключа.

При замене в приведенном фрагменте команды ввода длинны кодируемого текста на блок, который обеспечивает работу с текстовым файлом (его чтение, определение его длины), этот фрагмент можно использовать для подбора оптимальных длин ключей в модуле, предусматривающим шифрование текста методом двойной транспозиции.

Как было отмечено выше, в СУБД имеются некоторые встроенные средства проверки целостности сущностей и разработчику в некоторых случаях нет необходимости уделять этому особое внимание. Однако создание ИС в рамках концепции файловых систем предполагает тщательнейшую проработку вопросов целостности данных со стороны разработчика.

Прежде всего, необходимо позаботиться о целостности данных по первичному ключу. Эта задача несколько усложняется, если первичный ключ является составным.

Предположим, имеется база данных о сотрудниках (tablica1), где в качестве первичного ключа выступает сочетание двух атрибутов: серия паспорта (zapis.serij) и номер паспорта (zapis.numer).

В простейшем случае, когда данные из файла считываются по одной записи, функция проверки по составному первичному ключу может выглядеть следующим образом:

Function FerstKey(passport_s, passport_n:string): boolean;

var tablica1: file of rec;

zapis: rec;

flag: boolean;

begin

assign (tablica1,fbaza);

reset(tablica1);

flag:=true;

repeat

read(tablica1,zapis);

if (passport_s=zapis.serij) and (passport_n=zapis.numer)

then flag:=false;

until eof(tablica1) or (flag =false);

if flag =false

then writeln('Запись с такими паспортными данными существует!');

readkey;

ferstkey:= flag;

close(tablica1);

end;

Следует учитывать, что в процессе добавления записи необходимо проверить значение вновь вводимого первичного ключа на его уникальность (не был ли ранее введен ключ с таким значением). Это предопределяет необходимость размещения в оперативной памяти всего массива данных (данных того файла, где храниться значение первичного ключа). В этом случае необходимо позаботиться о том, чтобы время взаимодействия внешней и оперативной памяти было минимальным. Такое возможно, если считывание всего файла будет происходить за одно обращение. Например, если для разработки ИС используется TurboPascal, а данные хранятся в типизированном файле, то к нему в данном случае целесообразно обращаться как к нетипизированному (применяя процедуры blockread и blockwrite), а в качестве буфера для указанных процедур использовать массив соответствующих записей.

Далее рассмотрим один из примеров реализации криптографической защиты данных в ИС (в частности, метод Вижинера), разработанной в рамках концепции файловых систем, на языке TurboPascal. В приведенной программе предусмотрен ввод двух слов, одно из которых ключ, а второе – слово, подлежащее шифрованию.

Особенностью машинной реализации данного метода является то, что модно построить достаточно большой алфавит, включив в него большинство символов кода ASCII. Исключение должны составить так называемые управляющие символы (в основном они лежат в диапазоне кодов от 0 до 31), символы псевдографики (диапазон - от 173 до 223), а также символы из диапазона от 242 до 255. Таким образом, сформированный алфавит будет включать 159 символов.

uses crt;

var k1, k2, j, k, r, p, l: byte;

alphabet: string[159];

slovo, key, kod: string;

flag: boolean;

begin

clrscr;

alphabet:='';

for J:=32 to 171 do alphabet:= alphabet + chr(j);

for J:= 224 to 242 do alphabet:= alphabet + chr(j);

write(alphabet);

write('Введите слово, которое хотите зашифровать:');

readln(slovo);

while (flag =FALSE) do

begin

flag:=TRUE;

write('Введите ключ шифрования');

readln(key);

for p:=1 to length(key) do

for l:=p+1 to length(key) do

if key[p]=key[l] then

begin

write('В ключе есть повторяющиеся символы');

flag:=FALSE;

end;

end;

kod:='';

for p:=1 to length(slovo) do

begin

If ((ord(slovo[p])>=32) and (ord(slovo[p])<173))

then k1:= ord(slovo[p])-31

else k1:= ord(slovo[p])-82;

R:= p mod ( length(key)); If R=0 then R:= length(key);

If ((ord(key[r])>=32) and (ord(key[r])<=172)) then k2:= ord(key[r])-31

else k1:= ord(key[r])-82;

if((k1+k2) mod 159) <> 0

then Kod:= Kod+ alphabet[(k1+k2) mod 159]

else Kod:= Kod+ alphabet[159]

end;

write('Зашифрованное слово: ');

write(Kod);

readkey;

end.

Представленная программа реализует алгоритм, в котором учитывается, что если ASCII-код символа текста находится в диапазоне от 32 до 172, то в строке alphabet место, на котором находится такой символ, можно вычислить по формуле: (ASCII-код символа)-31 (k1= ord(slovo[p])-31). Если же код символа не попадает в этот интервал, тогда он находится в интервале от 224 до 242 (другие символы набрать с клавиатуры невозможно) и тогда место, на котором находится такой символ, можно вычислить по формуле: (ASCII-код символа)-31 (k1= ord(slovo[p])-82). Аналогично можно вычислить место в строке alphabet символа ключа.

Как показано в параграфе 5.2., ключ по кольцу (вкруговую) подписывается под исходным текстом. В программе определить, какую букву из ключа позволяет команда присваивания, обеспечивающая вычисление остатка от деления номера кодируемой буквы текста на длину ключа: R:= p mod ( length(key)).

С целью проверки корректности введенного ключа (ключ должен состоять только из букв алфавита открытого текста и символы в нем не должны повторяться) в программу включен следующий фрагмент:

begin

flag:=TRUE;

write('Введите ключ шифрования');

readln(key);

for p:=1 to length(key) do

for l:=p+1 to length(key) do

if key[p]=key[l] then

begin

write('В ключе есть повторяющиеся символы');

flag:=FALSE;

end;

end;

Дальнейшие шаги по совершенствованию этого алгоритма должны сводиться к построению программы, исходный текст для которой читается из файла.

Особое место среди информационных систем занимают системы, построенные на основе гипертекста. При их реализации в рамках концепции файловых систем возникает немало несложных задач, требующих тщательной проработки. Так, визуализация гиперссылок относится к таким задачам.

Предварительно необходимо уметь решать следующую задачу: «Вывести на экран заданный (введенный с клавиатуры) текст, выделив в нем другим цветом заданное слово (или изменив фон заданного слова). Если в тексте заданное слово не встречается, вывести на экран фразу «В тексте такого слова нет». (Визуализация гиперссылки.)»

Приведем текст программы на языке Pascal одного из возможных вариантов решения указанной задачи.

При составлении алгоритма будем учитывать следующее.

Если слово находится в самом начале текста, то необходимо проверить наличие пробела после слова (Flag1). Если слово находится в середине текста, тогда пробелы есть до и после слова (Flag2). Если же слово находится в конце текста, то перед ним есть пробел. Будем считать, что знаков препинания в тексте нет.

Program hypertext1;

uses crt,dos;

var

text, S1: string[250];

slovo: string [20];

flag1, flag2, flag3: boolean;

k:byte;

begin

clrscr;

textcolor(1);

textbackground(5); write('Введите текст');

readln(text);

write('Введите слово');

readln(slovo);

k:=pos(slovo,text);

flag1:=(k>1) and (text[k-1]=' ') and (text[k+length(slovo)]=' ');

flag2:=(k=1) and (text[k+length(slovo)]=' ');

flag3:=(k+length(slovo)-1=length(text)) and (text[k-1]=' ');

if flag1 or flag2 or flag3 then

begin

write (copy(text,1,k-1));

textcolor(9);

write (copy(text,k,length(slovo)+1));

textcolor(1);

S1:=(copy(text,k+length(slovo)+1,length(text)-k-length(slovo)));

Write (S1);

end

else writeln ('Такого слова в тексте нет!');

readkey

end.

Визуализация гиперссылки в том случае, если текст хранится в файле, предполагает, что этот текст должен несколько отличаться от обычного: слова, являющиеся в нем гиперссылками, должны быть каким-либо образом выделены. Пусть в тексте такому слову предшествует, например, символ «#» и такой же символ стоит и после слова. Тогда одним из вариантов решения задачи визуализации гиперссылок текста, хранящегося в файле, может быть следующая программа.

Program VisiblWords;

uses crt;

const FileName='hipertext.txt';

var fileText:text; bigin1,end2: integer;

StringText,HyperLink :string;

flag:boolean;

procedure FindHiperLinks;

var i:integer;

begin

HyperLink:='';

bigin1:=1;

while not eof(fileText) do

begin

readln(fileText,StringText);

i:=1;

bigin1:=1;

end2:=0;

{поиск гиперссылки}

while i<length(StringText) do

begin

if StringText[i]='#' then

begin

inc(i);

{формирование гиперссылки}

while StringText[i]<>'#' do

begin

HyperLink:=HyperLink+StringText[i];

inc(i);

end;

write(copy(stringtext,bigin1,end2-1));

textcolor(9);

write(' ',HyperLink);

textcolor(15);

bigin1:=i+1;

end2:=0;

hyperLink:='';

end;

inc(i);

inc(end2);

end;

write(copy(stringtext,bigin1,length(stringtext)));

end;

end;

begin

flag:=true;

clrscr;

assign(fileText,FileName);

{$i-}

reset(fileText);

{$i+}

if ioresult<>0 then

Begin

write('Файл не существует');

flag:=false;

end;

if flag then

Begin

clrscr;

reset(fileText);

FindHiperLinks;

close(fileText);

end;

ReadKey;

end.

Как видно из текста программы, считывание из файла происходит «порциями» (процедура FindHiperLinks): в строковую переменную StringText, длина которой в соответствии с описанием равна 255 символов. В каждой строке осуществляется поиск гиперссылке и отображение ее цветом, отличным от цвета текста (textcolor(9); write(' ',HyperLink)). В данной программе не предусмотрен анализ наличия в тексте признака конца строки, табуляции и пр. Это приводит к тому, что текст выводится не в полном соответствии с форматом исходного текста.

Далее приведем текст программы на языке Pascal одного из возможных вариантов решения следующей задачи: «Вывести на экран заданный текст, выделив в нем другим цветом два заданных слова. Обеспечить изменение фона выделенных слов в зависимости от нажатия клавиш управления курсором. Примечание: текст и оба слова вводятся с клавиатуры». Как видно из формулировки, предполагается программная реализация активизации гиперссылки.

В приведенном варианте предусмотрено, что введенные слова обязательно присутствуют в тексте (предусмотреть проверку их наличия, можно, включив в программу соответствующую процедуру, построенную на основе решения предыдущей задачи).

Program hypertext2;

Uses crt,dos;

var

text1,slovo1,slovo2: string;

pos1,pos2: integer;

flag:boolean;

Key:char;

procedure MENU1;

begin

Textcolor(blue);

Textbackground(white);

Gotoxy(1,25);

Write('-> - Первое слово <- - Второе слово Esc - Выход');

Textbackground(black);

end;

begin

Clrscr;

TextColor(lightgray);

TextBackGround(black);

Writeln('Введите текст.');

Readln(text1);

Writeln('Введите любое слово, входящее в текст.');

Readln(slovo1);

Writeln('Введите еще одно слово, входящее в текст.');

readln(slovo2);

pos1:=pos(slovo1,text1);

pos2:=pos(slovo2,text1);

gotoxy(1,4);

write(text1);

if pos1<pos2 then

flag:=true

else

flag:=false;

repeat

Clrscr;

MENU1;

TextColor(lightgray);

TextBackGround(black);

gotoxy(1,4);

write(text1);

if flag then

begin

TextColor(lightred);

TextBackGround(white);

Gotoxy(pos1,4);

Write(slovo1);

TextColor(lightred);

TextBackGround(black);

Gotoxy(pos2,4);

Write(slovo2);

end

else

begin

TextColor(lightred);

TextBackGround(black);

Gotoxy(pos1,4);

Write(slovo1);

TextColor(lightred);

TextBackGround(white);

Gotoxy(pos2,4);

Write(slovo2);

end;

TextColor(lightgray);

TextBackGround(black);

Key:=readkey;

if Key=#0 then

begin

Key:=readkey;

case Key of

#75: if pos1<pos2 then flag:=true

else flag:=false;

#77: if pos1>pos2 then flag:=true

else flag:=false;

end;

end;

until Key=#27;

end.

Как видно из текста программы, предусмотрен анализ порядка ввода слов (if pos1<pos2 …). В не зависимости от того первым или вторым вводится слово, стоящее в тексте раньше другого, переход к слову стоящему в тексте позднее осуществляется нажатием клавиши управления курсором «вправо» (ASCII код – 77). Переход к слову, стоящему в тексте ранее другого осуществляется по нажатию клавиши управления курсором «влево» (ASCII код – 75). Для улучшения структуры программы можно оформить в виде отдельной процедуры, например, задание «стандартных» цветовых параметров:

procedure StandartColor

begin

TextColor(lightgray);

TextBackGround (black)

end;

Аналогичным образом можно оформить в процедуры и выделение цветом условно «неактивного» слова, и выделение цветом и фоном условно «активного» слова.

При построении информационных систем, основанных на гипертексте необходимо предусмотреть хранение исходных текстов в файлах. Целесообразно те слова, которые будут являться гиперссылками, в тексте каким-либо образом выделить. В частности, можно поставить перед и после слова последовательность символов, которая заведомо никогда в реальном тексте встречаться не будет (например: «/*\»). В этом случае при анализе текста, считываемого из файла, необходимо проанализировать местоположение этой специальной группы символов, позаботится о том, чтобы они не подлежали визуализации, а для фрагмента текста, находящегося между этими спец группами символов, предусмотреть «визуализацию гиперссылки», «активизации гиперссылки» и «переход по гиперссылке».