С учетом того, что в среднем предполагается продавать в год 30 копий программы, то себестоимость одной копии программы будет вычисляться по следующей формуле:
C2 = Собщ/n, (6.4)
где: C2 - стоимость разработки программного средства из 30 копий;
Собщ - общая стоимость разработки данного программного средства;
n - число копий.
C2 = 2484/10 = 248,4.
Прибавим к полученной себестоимости 30% и получим стоимость одной разработки, равной 323 рубля.
В ходе исследования рынка аналогичных программных продуктов было выявлено, что самый дешевый найденный аналог стоит 2500 рублей.
Расчет годового экономического эффекта производится по формуле:
, (6.5)
где , стоимость аналогичного программного продукта и разработанного, руб.;
- нормативный коэффициент экономической эффективности ( =0,33);
- капитальные вложения на проектирование и внедрение проектируемой системы, руб.;
Согласно формулы (6.5), годовой экономический эффект равен:
=(2500-323) - 0,33 * 2484 = 1358 руб.
Расчетный коэффициент экономической эффективности показывает величину экономии на текущих эксплуатационных затратах, образующихся за счет внедрения новой системы, на один рубль единовременны капитальных вложений и рассчитывается по формуле (6.6):
Е = Э / К (6.6)
E=1358/ 2484= 0,54
Так как Е>0,33, то проектирование и внедрение проектируемой системы эффективно.
Расчетный условный срок окупаемости капитальных вложений определяется как величина, обратная расчетному коэффициенту экономической эффективности (6.7):
Ток = К / Э (6.7)
Tок = 2484/ 1358 = 1,82 или 21 месяцев.
Тк - нормальный срок окупаемости = 3 года;
Тк > Ток - условие выполняется.
Таким образом, разработка и внедрение системы является эффективной.
|
В ходе подсчета оценка производственных затрат было выявлено, что стоимость разработки данного программного средства составляет 2484 рублей с учетом заработной платы, амортизации и отчислений во внебюджетные фонды. После проведения всех необходимых расчетов был получен результат подтверждающий предполагаемый экономический эффект от внедрения программного средства в практику предприятия. Экономический эффект составил 1358 рубля за четыре года.
ЗАКЛЮЧЕНИЕ
На дипломное проектирование была поставлена задача, разработать пространственно распределенный метод сокрытия информации в звуковых файлах-контейнерах по секретному ключу. Для реализации поставленной задачи был изучен большой объем информации по стеганографии, существенно расширен диапазон знаний по программированию, изучена платформа FrameWork 3.0.
В ходе работы над программой была изучена предметная область, в результате чего составлена информационная модель. На основании информационной модели были сформулированы требования к программе и разработана структура программы.
Для разработки программы была выбрана среда разработки Microsoft Visual Studio 2008 и язык программирования C#, на котором достаточно просто и легко создавать подобного рода приложения с использованием встроенных компонентов.
Испытания программы показали, что она мобильна, имеет удобный и привлекательный интерфейс, не предъявляет высоких требований к аппаратным средствам.
В ходе изучения рынка аналогичных программных продуктов было выявлено, что все подобные программы способны скрывать информацию только в один звуковой файл, в отличие от разработанной программы. В программу был встроен алгоритм симметричного шифрования Rijndael, который в совокупности со стеганографическими методами существенно усиливает криптостойкость программного продукта.
|
Программный продукт полностью соответствует требованиям, которые были предъявлены на дипломное проектирование.
Существует возможность дальнейшее доработки и модификации программы:
− внедрение нескольких алгоритмов шифрования;
− внедрение алгоритма хеширования;
− добавление проигрывателя;
− модернизация интерфейса.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Артёхиц Б.В. Стеганография II Журнал "Защита информации. Конфидент",2010. - №4. - С.47-50.
2. D. Kahn, The Code-Breakers: The Story of Secret Writing. MacMillan Publishing Company, New York, USA, 2011.
3. Хорошко В.О., Азаров О.Д., Шелест О.А. Основы компьютерной стеганографии.Начальное пособие для студентов и аспирантов. - Венеция: ВДТУ, 2013. - 143 с.
4. Барсуков B.C., Романцов А.П. Компьютерная стеганография: вчера, сегодня, завтра. Технологии информагщонной безопасности XXI века. - материалы Internet-ресурса ≪Специальная техника≫ (https://st.ess.rii/).
5. Грибунин В.Г., Оков И.Н., Туринцев И.В. Цифровая стеганография. - М.:
Солон-Пресс, 2012. — 272 с.
6. Генне О.В. Основные положения стеганографии // Журнал "Защита информации. Конфидент", №З, 2010.
7. Кустов В.Н., Федчук А.А. Методы встраивания скрытых сообщений // Журнал "Защита информации. Конфидент", №3, 2010, с.34.
8. Быков С.Ф. Алгоритм сжатия JPEG с позиции компьютерной стеганографии //"Защита информации. Конфидент", №3,2010, с.26.
|
9. АнинБ.Ю. Защита компьютерной информации. — СПб.: BHV - Санкт-
Петербург, 2010. - 284 с.
10. Соколов А.В., Шаньгин В.Ф. Защита информации в распределённых корпоративных сетях и системах. - М.: ДМК Пресс, 2012. — 656 с.
11. Барсуков B.C. Стеганографические технологии защиты документов, авторских прав и информации // Обзор специальной техники. — 2010. — №2. — С.31-40.
12. Конахович Г.Ф., Пузыренко А.Ю., Компьютерная стеганография. Теория и практика. - М.:МК - Пресс, 2010 - 286с.
13. Информационный ресурс исследовательской группы "CNews Analytics" (https://www.cnews.ru/).
14. Лабор В.В. Си Шарп: Создание приложений для Windows. - Мн.Харвест, 2013. - 384 с.
15. Прозис Дж. Программирование для Microsoft.NET. — М.: Издательско-торговый дом Русская Редакция, 2013- 704 стр.: ил.
16. Петцольд Ч. Программирование для Microsoft Windows на C#.— М.: Издательско-торговый дом Русская Редакция, 2012- 576 стр.: ил.
17. СанПиН 2.1.2.1331-03.
18. Белов Н. Безопасность жизнедеятельности. М.: Знание. 364 с.
19. ГОСТ 12.1.004-91. Пожарная безопасность. Общие требования, М.
20. Зинченко В. Основы эргономики. М.: МГУ. 179 с.
ПРИЛОЖЕНИЯ
Приложение А
Исходный код программы
Код процедуры открытия файла - контейнера:
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.
Приложение В
Тезисы доклада на научной конференции.
Сколько существует человечество, столько существует и проблема обмена информацией. С одной стороны люди стремятся общаться и обмениваться друг с другом информацией, а с другой стороны стремятся скрыть от посторонних не только суть информации, но и факт ее передачи. Поэтому человечество интенсивно развивает как средства передачи, так и средства сокрытия информации.
Уже в древнем мире выделилось два основных направления решения этой задачи, существующие и по сегодняшний день: криптография и стеганография. Целью криптографии является скрытие содержимого сообщений за счет их шифрования. В отличие от этого, при стеганографии скрывается сам факт существования тайного сообщения.
Слово «стеганография» имеет греческие корни и буквально означает «тайнопись». Стеганография это искусство и наука о способах передачи (хранения) скрытой информации, при которых скрытый канал организуется на базе и внутри открытого канала с использованием особенностей восприятия информации, причем для этой цели могут использоваться такие приемы как:
− полное сокрытие факта существования скрытого канала связи;
− создание трудностей для обнаружения, извлечения или модификации передаваемых скрытых сообщений внутри открытых сообщений-контейнеров;
− маскировки скрытой информации в протоколе.
Стеганографическая система состоит из: сообщения, которое нужно спрятать; контейнера, в который встраивается сообщение; ключа для встраивания и стего алгоритма. При использовании стеганографии в компьютере, вы прячете сообщение в другом файле. Особенность компьютерной стеганографии в том, что надо выбрать файл, способный скрыть сообщение. Изображения, звуковые, или видео файлы идеальны по нескольким причинам:
− эти типы файлов уже сжаты алгоритмом. Например,.jpeg,.mp3,.mp4, и.wav форматы - всё это примеры алгоритмов сжатия;
− достаточно велики, что облегчает задачу, для нахождения участков, способных скрыть какой-либо текст;
− эти файлы замечательно скрывают. То есть, некоторые люди прячут текстовое сообщение, которое должно быть скрыто в изображении или аудиоклипе. Если стеганографическая утилита делает свою работу хорошо, пользователь не обратит внимания на различие в качества изображения или звука, даже если некоторые биты изменены для того, чтобы скрыть сообщение.
В настоящее время методы компьютерной стеганографии развиваются по двум основным направлениям:
− методы, основанные на использовании специальных свойств компьютерных форматов;
− методы, основанные на избыточности аудио и визуальной информации.
В рамках второго направления при сокрытии информации в аудио файлах преобладают алгоритмы использующие:
− изменение амплитуды;
− изменение фазы;
− эхо-сигнал;
− LSB (замена наименьших значащих битов).
Алгоритм LSB широко применяется для сокрытия информации в файлах с расширением.wav. Опираясь на описанную в предыдущем пункте структуры wav – файла, необходимо отметить, что само сокрытие осуществляется в data chunk. Для наглядного представления рассмотрим пример.
Предположим, что количество байт в одном семпле составляет 8 байт, тогда амплитуда, закодированная в data chunk будет представлять следующую двоичную последовательность:
10100001-10101110-11010110-11001110-11000111-11001010-11010110-11101101…
Во многих случаях последний бит может быть безболезненно изменен, и пользователь не заметит произошедшей подмены, т.е. нельзя на слух уловить изменения, происходящие в звуковом файле.
Предположим, что в приведенный выше фрагмент двоичных чисел (контейнер) необходимо «запрятать» русскую букву «А», представленную с помощью кодовой таблицы CP-1251. Десятичное представление буквы «А» имеет вид 192D, а двоичное — 11000000B.
Модифицируя имеющийся блок двоичных чисел, поместим в контейнер двоичное число 11000000В. При этом 8 бит файла-сообщения записываются в 8 чисел файла-контейнера:
10100000-10101110-11010110-11001110-11000110-11001010-11010111-11101101
Таким образом, можно скрыть в аудиофайле любой другой файл, размер которого не будет превышать data chunk. Если применить методы шифрования к файлам, которые необходимо сокрыть, то такую информацию будет тяжело распознать.