- •Содержание
- •Глава 1. Обзорная часть стеганографических систем 4
- •Глава 2. Разработка программы стеганографических систем 30
- •Глава 3. Экономическое обоснование системы стеганография 60
- •Глава 1. Обзорная часть стеганографических систем
- •1.1. Проблема устойчивости стеганографических систем
- •1.2. Классификация методов сокрытия данных
- •Р ис.3. Классификация методов компьютерной стеганографии
- •Анализ методов сокрытия информации
- •Описание сегмента format chunk
- •1.3. Обзор аналогичных программных продуктов
- •Глава 2. Разработка программы стеганографических систем
- •2.1. Выбор средств разработки
- •Свойства класса wRiff
- •Свойства и методы класса WorkWav
- •Р ис.8. Алгоритм сокрытия информации в звуковых фалах
- •2.3. Разработка пользовательского интерфейса
- •2.4. Тестирование программы
- •Глава 3. Экономическое обоснование системы стеганография
- •3.1. Производственные затраты на разработку
- •3.2. Учет амортизации
- •Капитальные вложения на разработку
- •Релевантные затраты на разработку
- •Заключение
- •Список используемых источников
Заключение
Дипломной работе была поставлена цель, разработать пространственно распределенный метод сокрытия информации в звуковых файлах - контейнерах по секретному ключу. Для реализации поставленной задачи был изучен большой объем информации по стеганографии, существенно расширен диапазон знаний по программированию, изучена платформа FrameWork 3.0.
В ходе работы над программой была изучена предметная область, в результате чего составлена информационная модель. На основании информационной модели были сформулированы требования к программе и разработана структура программы.
Для разработки программы была выбрана среда разработки Microsoft Visual Studio 2016 и язык программирования C#, на котором достаточно просто и легко создавать подобного рода приложения с использованием встроенных компонентов.
Испытания программы показали, что она мобильна, имеет удобный и привлекательный интерфейс, не предъявляет высоких требований к аппаратным средствам.
В ходе изучения рынка аналогичных программных продуктов было выявлено, что все подобные программы способны скрывать информацию только в один звуковой файл, в отличие от разработанной программы. В программу был встроен алгоритм симметричного шифрования Rijndael, который в совокупности со стеганографическими методами существенно усиливает криптостойкость программного продукта.
Программный продукт полностью соответствует требованиям, которые были предъявлены на дипломное проектирование.
Существует возможность дальнейшее доработки и модификации программы:
внедрение нескольких алгоритмов шифрования;
внедрение алгоритма хеширования;
добавление проигрывателя;
модернизация интерфейса.
Цель достигнута - разработана программа пространственно - временного сокрытия информации в звуковых файлах методом LSB:
Исследована предметная область метода сокрытия информации (16 источников литературы)
Проведен сравнительный анализ программного средства с наиболее популярными программами сокрытия информации (SecureEngine Professional, S - Tools)
Разработано программное средство пространственно - временного сокрытия информации методом LSB
Список используемых источников
Анин, Б.Ю. Защита компьютерной информации. /Б.Ю. Анин - Учебник. - М.: BHV Санкт - Петербург, 2010. - 284 с.
Артёхиц, Б.В. Стеганография II Журнал «Защита информации. Конфидент» /Б.В. Артёхиц. - М.: 2010. - 47 - 50 c.
Барсуков B.C. Стеганографические технологии защиты документов, авторских прав и информации /В.С. Барсуков - Обзор специальной техники. - М.: 2010. №2. 31 - 40 с.
Барсуков, B.C., Романцов А.П. Компьютерная стеганография: вчера, сегодня, завтра. Технологии информагщонной безопасности XXI века. /В.С. Барсуков - материалы Internet - ресурса «Специальная техника» - М.: (http://st.ess.rii/).
Быков, С.Ф. Алгоритм сжатия JPEG с позиции компьютерной стеганографии /С.Ф. Быков - "Защита информации. Конфидент", №3. - М.: 2009, 26 с.
Грибунин, В.Г., Оков И.Н., Туринцев И.В. Цифровая стеганография./В.Г. Грибунин. - М.: Солон - Пресс, 2009. — 272 с.
Генне, О.В. Основные положения стеганографии /О.В. Генне - Журнал "Защита информации. Конфидент". - М.: №З, 2009.
Зинченко, В. Основы эргономики. /В. Зинченко. -М.: МГУ. 2009. 179 с.
Информационный ресурс исследовательской группы "CNews Analytics" (http://www.cnews.ru/).
Кустов, В.Н., Федчук А.А. Методы встраивания скрытых сообщений /В.Н. Кустов - Журнал "Защита информации. Конфидент", №3. – М.: 2009, 34 с.
Конахович, Г.Ф., Пузыренко А.Ю., Компьютерная стеганография. Теория и практика. - М.: МК - Пресс, 2009 - 286с.
Лабор, В.В. Си Шарп: Создание приложений для Windows. /В.В. Лабор. - М.: Мн.Харвест, 2009. - 384 с.
Прозис Дж. Программирование для Microsoft .NET. /Дж. Прозис. - М.: Издательско - торговый дом Русская Редакция, 2009 - 704 стр.: ил.
Петцольд Ч. Программирование для Microsoft Windows на C#. /Ч.Петцольд. - М.: Издательско - торговый дом Русская Редакция, 2009 - 576 с.
Соколов А.В., Шаньгин В.Ф. Защита информации в распределённых корпоративных сетях и системах. /А.В. Соколов. - М.: ДМК Пресс, 2012. — 656 с.
Хорошко В.О., Азаров О.Д., Шелест О.А. Основы компьютерной стеганографии. Начальное пособие для студентов и аспирантов. /В.О. Хорошко. - М.: Венеция: ВДТУ, 2010. - 143 с.
ПРИЛОЖЕНИЕ А
Исходный код программы
Код процедуры открытия файла - контейнера:
public bool OpenWavFile(string wNameFile,int nF)
{
int i, sizechunk;
bool ff = false;
byte[] karet;
if (nF == - 1)
{
Riff.Add(new wRiff());
NameFiles.Add(wNameFile);
nF = Riff.Count - 1;
}
else
{
NameFiles.RemoveAt(nF);
NameFiles.Insert(nF, wNameFile);
ff = true;
}
//считываем первые четыре байта идентификатора Riff;
karet = new byte[4];
FileStream wFile = new FileStream(wNameFile, FileMode.Open, FileAccess.Read);
wFile.Read(karet,0,4);
if ((karet[0] == 'R') & (karet[1] == 'I') & (karet[2] == 'F') & (karet[3] == 'F'))
{
Riff[nF].headerRIFF = new char[4];
for (i = 0; i <= 3; i++)
Riff[nF].headerRIFF[i] = (char)karet[i];
}
else
{
MessageBox.Show("Открываемый файл, не формата *.wav", "Информация", MessageBoxButtons.OK);
Riff.RemoveAt(nF);
wFile.Close();
wFile.Dispose();
wFile = null;
return(false);
}
//считываем следующие 4 байта, длина чанка Riff;
wFile.Read(karet, 0, 4);
Riff[nF].sizeRIFF = BitConverter.ToInt32(karet, 0);
//считываем следующие четыре байта идентификатора WAVE;
wFile.Read(karet, 0, 4);
if ((karet[0] == 'W') & (karet[1] == 'A') & (karet[2] == 'V') & (karet[3] == 'E'))
{
Riff[nF].headerWAVE = new char[4];
for (i = 0; i <= 3; i++)
Riff[nF].headerWAVE[i] = (char)karet[i];
}
else
{
Riff.RemoveAt(nF);
MessageBox.Show("Не верный файл!", "Информация", MessageBoxButtons.OK);
return (false);
}
while (!(wFile.Length == wFile.Position))
{
//считываем следующие четыре байта идентификатора fmt;
wFile.Read(karet, 0, 4);
if ((karet[0] == 'f') & (karet[1] == 'm') & (karet[2] == 't') & (karet[3] == ' '))
{
Riff[nF].headerFMT = new char[4];
for (i = 0; i <= 3; i++)
Riff[nF].headerFMT[i] = (char)karet[i];
//считываем следующие 4 байта, длина чанка fmt;
wFile.Read(karet, 0, 4);
Riff[nF].sizeFMT = BitConverter.ToInt32(karet, 0);
karet = new byte[2];
//считывание категории формата
wFile.Read(karet, 0, 2);
Riff[nF].FormatTag = BitConverter.ToInt16(karet, 0);
//считывание количества каналов
wFile.Read(karet, 0, 2);
Riff[nF].Channels = BitConverter.ToInt16(karet, 0);
karet = new byte[4];
//считывание количества сэмплов в секунду
wFile.Read(karet, 0, 4);
Riff[nF].SamplesPerSec = BitConverter.ToInt32(karet, 0);
//считывание среднее число байт в сек
wFile.Read(karet, 0, 4);
Riff[nF].AvgBytesPerSec = BitConverter.ToInt32(karet, 0);
karet = new byte[2];
//считывание выравнивание данных в дата - чанке
wFile.Read(karet, 0, 2);
Riff[nF].BlockAlign = BitConverter.ToInt16(karet, 0);
//считывание бит в сэмпле
wFile.Read(karet, 0, 2);
Riff[nF].BitPerSample = BitConverter.ToInt16(karet, 0);
wFile.Seek(Riff[nF].sizeFMT - 16, SeekOrigin.Current);
karet = new byte[4];
}
else
if ((karet[0] == 'd') & (karet[1] == 'a') & (karet[2] == 't') & (karet[3] == 'a'))
{
wFile.Read(karet, 0, 4);
Riff[nF].sizeDATA = BitConverter.ToInt32(karet, 0);
//если бит в семпле 16
if (Riff[nF].BitPerSample == 16)
{
Riff[nF].DataChunk16 = new UInt16[Riff[nF].sizeDATA / 2];
karet = new byte[2];
for (i = 0; i < Riff[nF].sizeDATA / 2; i++)
{
wFile.Read(karet, 0, 2);
Riff[nF].DataChunk16[i] = BitConverter.ToUInt16(karet, 0);
}
}
//если бит в семпле 8
if (Riff[nF].BitPerSample == 8)
{
Riff[nF].DataChunk8 = new byte[Riff[nF].sizeDATA];
karet = new byte[1];
for (i = 0; i < Riff[nF].sizeDATA; i++)
{
wFile.Read(karet, 0, 1);
Riff[nF].DataChunk8[i] = karet[0];
}
}
break;
}
else
{
//если встречается необязательная чанка, то размер чанки рифф уменьшается на размер необязательной чанки
wFile.Read(karet, 0, 4);
//Riff.sizeRIFF = Riff.sizeRIFF - 4;
sizechunk = BitConverter.ToInt32(karet, 0);
//Riff.sizeRIFF = Riff.sizeRIFF - sizechunk;
wFile.Seek(sizechunk, SeekOrigin.Current);
}
}
if (Riff[nF].BitPerSample >16)
{
if (ff==false)
Riff.RemoveAt(nF);
MessageBox.Show("Программа работает только с wav - файлами, число бит семпле которых равно либо 8, либо 16!", "Информация", MessageBoxButtons.OK);
wFile.Close();
wFile.Dispose();
wFile = null;
return (false);
}
wFile.Close();
wFile.Dispose();
wFile = null;
return (true);
}
Код процедуры сокрытия файла:
public void OpenAnyFile(string aNameFile, LoadingDelegate deleg, int bt, int saveitem, int uShif, byte[] key, byte[] IV)
{
long i, k,j,check;
int l;
byte[] karet;
chbit = bt;
if (uShif == 1)
{
FileStream sFile = new FileStream(aNameFile, FileMode.Open, FileAccess.ReadWrite);
byte[] charkar = new byte[1];
sizeFile = sFile.Length;
l = 0;
check = 0;
for (l = 0; l <= Riff.Count - 1; l++)
{
if (Riff[l].BitPerSample == 16)
check = check + Riff[l].sizeDATA / 16;
if (Riff[l].BitPerSample == 8)
check = check + Riff[l].sizeDATA / 8;
}
if (check < sizeFile * 8)
{
MessageBox.Show("Размер открываемого файла больше чем размер файлов контейнеров!", "Информация", MessageBoxButtons.OK);
sFile.Close();
sFile = null;
return;
}
byte[] sByteFile = new byte[sizeFile];
for (i = 0; i < sizeFile; i++)
{
sFile.Read(charkar, 0, 1);
sByteFile[i] = charkar[0];
}
sFile.Close();
sFile = null;
bufmem = new MemoryStream();
Rijndael RijndaelAlg = Rijndael.Create();
CryptoStream cStream = new CryptoStream(bufmem, RijndaelAlg.CreateEncryptor(key, IV), CryptoStreamMode.Write);
try
{
cStream.Write(sByteFile, 0, sByteFile.Length);
cStream.FlushFinalBlock();
}
catch (Exception er)
{
Console.WriteLine("An error occurred: {0}", er.Message);
return;
}
finally
{
FileStream aaa = File.Open("../Shifer", FileMode.OpenOrCreate);
bufmem.WriteTo(aaa);
bufmem.Flush();
cStream.Close();
cStream = null;
bufmem.Close();
bufmem = null;
aaa.Close();
aaa = null;
aFile = new FileStream("../Shifer", FileMode.Open, FileAccess.ReadWrite);
}
}
else if (uShif== 0)
{
aFile = new FileStream(aNameFile, FileMode.Open, FileAccess.Read);
}
sizeFile = aFile.Length+56;
check = 0;
razriad = 1;
//проверка на вместимость фала в контейнер
for (l = 0; l <= Riff.Count - 1; l++)
{
if (Riff[l].BitPerSample == 16)
check = check + Riff[l].sizeDATA / 16;
if (Riff[l].BitPerSample == 8)
check = check + Riff[l].sizeDATA / 8;
}
if (check < sizeFile*8)
{
MessageBox.Show("Размер открываемого файла больше чем размер файлов контейнеров!", "Информация", MessageBoxButtons.OK);
aFile.Close();
aFile = null;
File.Delete("../Shifer");
return;
}
k = 0;
i = 0;
deleg(1, sizeFile*8);
numlet = 0;
ind = 0;
while (i <= sizeFile*8)
{
for (l = 0; l<= Riff.Count - 1; l++)
{
if (k < Riff[l].sizeDATA)
{
//если размер бит в семпле 16
if (Riff[l].BitPerSample == 16)
{
checkbits(Riff[l].BitPerSample);
if (i <= 47)
{
karet = BitConverter.GetBytes(loadKaretkaSlovo());
Stego16(karet[0], k, l);
if (i == 47)
{
numlet = 0;
ind = 0;
razriad = 1;
}
}
if ((i > 47) && (i <= 111))
{
karet = BitConverter.GetBytes(loadKaretKey());
Stego16(karet[0], k, l);
}
else
if (i > 111)
{
karet = BitConverter.GetBytes(loadKaretFile());
Stego16(karet[0], k, l);
}
}
//если размер бит в семпле 8
if (Riff[l].BitPerSample == 8)
{
checkbits(Riff[l].BitPerSample);
if (i <= 47)
{
karet = BitConverter.GetBytes(loadKaretkaSlovo());
Stego8(karet[0], k, l);
if (i == 47)
{
numlet = 0;
ind = 0;
razriad = 1;
}
}
if ((i > 47) && (i <= 111))
{
karet = BitConverter.GetBytes(loadKaretKey());
Stego8(karet[0], k, l);
}
else
if (i > 111)
{
karet = BitConverter.GetBytes(loadKaretFile());
Stego8(karet[0], k, l);
}
}
i = i + 1;
deleg(2, i);
}
}
k = k + 1;
}
for (l = 0; l <= Riff.Count - 1; l++)
{
if (Riff[l].BitPerSample == 8)
{
if (saveitem == 1)
{
SaveFileDialog Dialog = new SaveFileDialog();
if (Dialog.ShowDialog() == DialogResult.OK)
{
Dialog.Filter = "wav file|*.wav";
FileStream newFile = new FileStream(Dialog.FileName, FileMode.Create);
newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerRIFF), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].sizeRIFF), 0, 4);
newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerWAVE), 0, 4);
newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerFMT), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].sizeFMT), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].FormatTag), 0, 2);
newFile.Write(BitConverter.GetBytes(Riff[l].Channels), 0, 2);
newFile.Write(BitConverter.GetBytes(Riff[l].SamplesPerSec), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].AvgBytesPerSec), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].BlockAlign), 0, 2);
newFile.Write(BitConverter.GetBytes(Riff[l].BitPerSample), 0, 2);
newFile.Write(Encoding.ASCII.GetBytes("data"), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].sizeDATA), 0, 4);
for (j = 0; j < Riff[l].sizeDATA; j++)
{
newFile.Write(BitConverter.GetBytes(Riff[l].DataChunk8[j]), 0, 1);
}
newFile.Close();
}
else
{
aFile.Close();
aFile = null;
File.Delete("../Shifer");
return;
}
}
if (saveitem == 0)
{
FileStream newFile = new FileStream(NameFiles[l], FileMode.Open);
newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerRIFF), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].sizeRIFF), 0, 4);
newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerWAVE), 0, 4);
newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerFMT), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].sizeFMT), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].FormatTag), 0, 2);
newFile.Write(BitConverter.GetBytes(Riff[l].Channels), 0, 2);
newFile.Write(BitConverter.GetBytes(Riff[l].SamplesPerSec), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].AvgBytesPerSec), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].BlockAlign), 0, 2);
newFile.Write(BitConverter.GetBytes(Riff[l].BitPerSample), 0, 2);
newFile.Write(Encoding.ASCII.GetBytes("data"), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].sizeDATA), 0, 4);
for (j = 0; j < Riff[l].sizeDATA; j++)
{
newFile.Write(BitConverter.GetBytes(Riff[l].DataChunk8[j]), 0, 1);
}
newFile.Close();
}
}
if (Riff[l].BitPerSample == 16)
{
if (saveitem == 1)
{
SaveFileDialog Dialog = new SaveFileDialog();
if (Dialog.ShowDialog() == DialogResult.OK)
{
Dialog.Filter = "wav file|*.wav";
FileStream newFile = new FileStream(Dialog.FileName, FileMode.Create);
newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerRIFF), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].sizeRIFF), 0, 4);
newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerWAVE), 0, 4);
newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerFMT), 0, 4);
newFile.Write(BitConverter.GetBytes((Int32)16), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].FormatTag), 0, 2);
newFile.Write(BitConverter.GetBytes(Riff[l].Channels), 0, 2);
newFile.Write(BitConverter.GetBytes(Riff[l].SamplesPerSec), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].AvgBytesPerSec), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].BlockAlign), 0, 2);
newFile.Write(BitConverter.GetBytes(Riff[l].BitPerSample), 0, 2);
newFile.Write(Encoding.ASCII.GetBytes("data"), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].sizeDATA), 0, 4);
for (j = 0; j < Riff[l].sizeDATA / 2; j++)
{
newFile.Write(BitConverter.GetBytes(Riff[l].DataChunk16[j]), 0, 2);
}
newFile.Close();
}
else
{
aFile.Close();
aFile = null;
File.Delete("../Shifer");
return;
}
}
if (saveitem == 0)
{
FileStream newFile = new FileStream(NameFiles[l], FileMode.Open);
newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerRIFF), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].sizeRIFF), 0, 4);
newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerWAVE), 0, 4);
newFile.Write(Encoding.ASCII.GetBytes(Riff[l].headerFMT), 0, 4);
newFile.Write(BitConverter.GetBytes((Int32)16), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].FormatTag), 0, 2);
newFile.Write(BitConverter.GetBytes(Riff[l].Channels), 0, 2);
newFile.Write(BitConverter.GetBytes(Riff[l].SamplesPerSec), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].AvgBytesPerSec), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].BlockAlign), 0, 2);
newFile.Write(BitConverter.GetBytes(Riff[l].BitPerSample), 0, 2);
newFile.Write(Encoding.ASCII.GetBytes("data"), 0, 4);
newFile.Write(BitConverter.GetBytes(Riff[l].sizeDATA), 0, 4);
for (j = 0; j < Riff[l].sizeDATA / 2; j++)
{
newFile.Write(BitConverter.GetBytes(Riff[l].DataChunk16[j]), 0, 2);
}
newFile.Close();
newFile.Dispose();
newFile = null;
}
}
}
aFile.Close();
aFile = null;
File.Delete("../Shifer");
}
Код процедуры извлечения фала:
public bool OpenStegoFile(int bt)
{
long i,k;
bool flag, tiptop;
sizeFile = 0;
chbit = bt;
int l;
l = 0;
numlet = 0;
ind = 0;
flag = false;
razriad = 1;
i = 0;
k = 0;
candrew = "";
tiptop = true;
//"манчестерский код"
while (i <= 47)
{
l = 0;
while (l <= Riff.Count - 1)
{
if (k < Riff[l].sizeDATA)
{
checkbits(Riff[l].BitPerSample);
if (Riff[l].BitPerSample == 16)
{
if (decodeslovo16(Riff[l].DataChunk16[k]) == true)
{
flag = true;
}
}
if (Riff[l].BitPerSample == 8)
{
if (decodeslovo8(Riff[l].DataChunk8[k]) == true)
{
flag = true;
}
}
i = i + 1;
}
l = l + 1;
if (i == 48)
{
break;
}
}
if (l == Riff.Count)
{
k = k + 1;
}
}
if (flag == false)
{
MessageBox.Show("Не верные файлы, либо неверно заданы настройки!", "Информация", MessageBoxButtons.OK);
tiptop = false;
return(tiptop);
}
//извлечение ключа
while (i <= 111)
{
if (l == Riff.Count)
l = 0;
while (l<=Riff.Count - 1)
{
checkbits(Riff[l].BitPerSample);
if (k < Riff[l].sizeDATA)
{
if (Riff[l].BitPerSample == 16)
{
decodekey16(Riff[l].DataChunk16[k]);
}
if (Riff[l].BitPerSample == 8)
{
decodekey8(Riff[l].DataChunk8[k]);
}
i = i + 1;
}
l = l + 1;
if (i == 112)
{
break;
}
}
if (l == Riff.Count)
{
k = k + 1;
}
}
razriad = 1;
ind = 0;
numlet = 0;
i = 0;
byteFile = new byte[sizeFile];
while (i<sizeFile*8)
{
if (l == Riff.Count)
l = 0;
while (l <= Riff.Count - 1)
{
if (k < Riff[l].sizeDATA)
{
checkbits(Riff[l].BitPerSample);
if (Riff[l].BitPerSample == 16)
{
decode16(Riff[l].DataChunk16[k]);
}
if (Riff[l].BitPerSample == 8)
{
decode8(Riff[l].DataChunk8[k]);
}
i = i + 1;
}
l = l + 1;
if (i == sizeFile*8)
{
break;
}
}
if (l == Riff.Count)
{
k = k + 1;
}
}
return (tiptop);
}
ПРИЛОЖЕНИЕ Б
Исходный код программы расчета освещения
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons;
type
TForm4 = class(TForm)
Label27: TLabel;
Label28: TLabel;
Label29: TLabel;
Label33: TLabel;
Label30: TLabel;
Label32: TLabel;
Label31: TLabel;
Label22: TLabel;
Label23: TLabel;
Label24: TLabel;
Label25: TLabel;
Label26: TLabel;
Label34: TLabel;
Label35: TLabel;
Label37: TLabel;
Label38: TLabel;
SpeedButton1: TSpeedButton;
Label2: TLabel;
Label3: TLabel;
Edit21: TEdit;
Edit22: TEdit;
Edit23: TEdit;
ComboBox5: TComboBox;
ComboBox4: TComboBox;
Edit24: TEdit;
Edit25: TEdit;
Edit26: TEdit;
Edit17: TEdit;
Edit18: TEdit;
Edit19: TEdit;
Edit20: TEdit;
StaticText4: TStaticText;
StaticText3: TStaticText;
Button2: TButton;
Label1: TLabel;
Label4: TLabel;
procedure Button2Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form4: TForm4;
mf: array[1..15] of integer = (2600, 3000, 3570, 3820, 4550, 4070, 4440, 5220, 8000, 100, 100, 2250, 2080, 4160, 3460);
mw: array[1..15] of integer = (40, 40, 65, 65, 65, 80, 80, 80, 150, 4, 4, 40, 40, 80, 80);
implementation
{$R *.dfm}
procedure TForm4.Button2Click(Sender: TObject);
var
s: double;
i: double;
h: double;
C: double;
n: double;
f: double;
w: double;
k: integer;
begin
s := StrToFloat(Edit17.Text) * StrToFloat(Edit18.Text);
h := StrToFloat(Edit19.Text) - StrToFloat(Edit20.Text);
i := s / (StrToFloat(Edit17.Text) + StrToFloat(Edit18.Text)) / h;
C := 0;
if(ComboBox5.ItemIndex = 0) then
while(1=1) do
begin
if(i <= 0.5) then begin C := 0.17; break; end;
if(i <= 0.7) then begin C := 0.25; break; end;
if(i <= 0.9) then begin C := 0.29; break; end;
if(i <= 1.1) then begin C := 0.31; break; end;
if(i <= 1.25) then begin C := 0.33; break; end;
if(i <= 1.5) then begin C := 0.34; break; end;
if(i <= 1.75) then begin C := 0.36; break; end;
if(i <= 2.0) then begin C := 0.37; break; end;
if(i <= 2.25) then begin C := 0.39; break; end;
if(i <= 2.5) then begin C := 0.39; break; end;
if(i <= 3.0) then begin C := 0.41; break; end;
if(i <= 4.0) then begin C := 0.42; break; end;
if(i <= 5.0) then begin C := 0.43; break; end;
end;
if(ComboBox5.ItemIndex = 1) then
while(1=1) do
begin
if(i <= 0.5) then begin C := 0.15; break; end;
if(i <= 0.7) then begin C := 0.21; break; end;
if(i <= 0.9) then begin C := 0.24; break; end;
if(i <= 1.1) then begin C := 0.27; break; end;
if(i <= 1.25) then begin C := 0.28; break; end;
if(i <= 1.5) then begin C := 0.30; break; end;
if(i <= 1.75) then begin C := 0.32; break; end;
if(i <= 2.5) then begin C := 0.36; break; end;
if(i <= 3.0) then begin C := 0.37; break; end;
if(i <= 4.0) then begin C := 0.39; break; end;
if(i <= 5.0) then begin C := 0.41; break; end;
end;
if(ComboBox5.ItemIndex = 2) then
while(1=1) do
begin
if(i <= 0.5) then begin C := 0.23; break; end;
if(i <= 0.7) then begin C := 0.30; break; end;
if(i <= 0.9) then begin C := 0.33; break; end;
if(i <= 1.1) then begin C := 0.36; break; end;
if(i <= 1.25) then begin C := 0.38; break; end;
if(i <= 1.5) then begin C := 0.40; break; end;
if(i <= 1.75) then begin C := 0.41; break; end;
if(i <= 2.0) then begin C := 0.43; break; end;
if(i <= 3.0) then begin C := 0.47; break; end;
if(i <= 4.0) then begin C := 0.50; break; end;
if(i <= 5.0) then begin C := 0.52; break; end;
end;
if(ComboBox4.ItemIndex = 0) then
begin
f:=StrToFloat(Edit25.Text);
w:=StrToFloat(Edit24.Text);
end;
if(ComboBox4.ItemIndex <> 0) then
begin
f:=mf[ComboBox4.ItemIndex];
w:=mw[ComboBox4.ItemIndex];
end;
n := (s * StrToFloat(Edit21.Text) * StrToFloat(Edit22.Text) * StrToFloat(Edit23.Text))/(C*f);
k := round(n);
if(k < n) then inc(k);
StaticText3.Caption := IntToStr(k);
if(StrToFloat(Edit26.Text) < 0) then Edit26.Text :='1';
Label38.Caption := FloatToStr(k / StrToFloat(Edit26.Text));
StaticText4.Caption := FloatToStr(k * w);
end;
procedure TForm4.SpeedButton1Click(Sender: TObject);
begin
close;
end;
end.
