
- •Пояснительная Записка
- •1 Введение 6
- •5.3 Расчет 117
- •Введение
- •Исследовательская часть
- •Структура подсистемы защиты информации в системе глобальной спутниковой связи и методы обеспечения средств мониторинга и управления объектами защиты информации
- •Описание среды комплекса спутниковой глобальной радиосвязи и выявление целей защиты информации
- •Состав и структура подсистемы защиты информации в комплексе спутниковой глобальной радиосвязи.
- •Прослушивание второго рода, как метод построения эффективных атак на систему связи.
- •Алгоритм массирования – как метод защиты от прослушивания второго рода.
- •Линейные кодовые последовательности.
- •Нелинейные кодовые последовательности.
- •Однократное гаммирование.
- •Требования к алгоритму маскирования.
- •Специальная часть
- •Основные требования.
- •Соответствие предъявляемому уровню безопастности.
- •Построение на основе использования криптографии симметричных ключей.
- •Описание.
- •Математическое описание.
- •Описание параметров.
- •Формирование ключа.
- •Разворачивание ключа.
- •Определение времени жизни сеансовых ключей
- •Программная и аппаратная гибкость реализации
- •Оценка сложности программной и аппаратной реализации
- •Вычислительная сложность (скорость) зашифрования/расшифрования
- •Оценочное время выполнения зашифрования/расшифрования блока данных
- •Оценочная скорость алгоритма в виде числа тактов работы процессора
- •Скорость выполнения зашифрования/расшифрования блока данных
- •Пакет тестов Национального института стандартов и технологий (nist)
- •Частотный тест.
- •Тест на самую длинную серию единиц в блоке.
- •Тест ранга двоичных матриц.
- •Тест с дискретным преобразованием Фурье (спектральный тест).
- •Универсальный статистический тест Маурэра.
- •Сжатие при помощи алгоритма Лемпела-Зива.
- •Тест линейной сложности.
- •Результаты тестирования
- •Результаты проведения тестов
- •Спектральный тест
- •Тест линейной сложности
- •Технологический раздел
- •Введение
- •Общие принципы тестирования
- •Общие методики оценки качества алгоритма маскирования данных
- •Графические тесты
- •Гистограмма распределения элементов
- •Распределение на плоскости
- •Проверка серий
- •Проверка на монотонность
- •Оценочные тесты
- •Методы тестирования алгоритма маскирования данных
- •Система оценки статистических свойств
- •Оценка результатов тестирования
- •Генерация последовательностей для тестирования
- •Исполнение набора статистических тестов
- •Анализ прохождения статистических тестов
- •Организационно-экономический раздел
- •Введение
- •Теоретическая часть
- •Оценка затрат на разработку по
- •Составляющие затрат на программный продукт
- •Составляющие затрат на разработку программ Ср.
- •Затраты на непосредственную разработку кп
- •Сложность комплекса программ
- •Применение современных методов разработки кп.
- •Факторы организации процесса разработки кп, влияющие на непосредственные затраты при создании сложных программ.
- •Затраты на изготовление опытного образца как продукции производственно-технического назначения.
- •Затраты на технологию и программные средства автоматизации разработки комплекса программ.
- •Составляющие затрат на эксплуатацию программ, влияющие на процесс их разработки.
- •Исходные данные
- •Расчёт затрат
- •1)Составляющие затрат на разработку программ:
- •2) Затраты на эксплуатацию программ:
- •3) Накладные расходы
- •Производственно-экологическая безопасность
- •Введение
- •Машинный зал и рабочее место программиста
- •Вредные факторы, присутствующие на рабочем месте и их классификация
- •Вредные производственные воздействия
- •Электрическая опасность
- •Нерациональность освещения
- •Расчет искусственного освещения методом коэффициента использования светового потока
- •Психофизические факторы
- •Микроклимат
- •Посторонние шумы
- •Постороннее электромагнитное излучение
- •Химические факторы
- •Эргономические требования
- •Эргономика окружающей среды
- •Экологическая безопасность
- •Заключение
- •Литература
- •Приложение 1
- •Приложение 2
- •Приложение 3
Литература
Модели технических разведок и угроз безопасности информации. Коллективная монография / Под ред. Е.М. Сухарева. Кн. 3. – М.:Радиотехника, 2003 г.;
Лидл Р., Пильц Г. Прикладная абстрактная алгебра: Учебное пособие/пер. с англ. – Екатеринбург: Изд-во Урал. Ун-та, 1996 г.;
Шеннон К. Теория связи в цифровых системах // Шеннон К., Работы по теории информации и кибернетике, М.: ИИЛ, 1963 – с.333-402;
Молдовян А.А., Молдовян Н.А., Гуц Н.Д., Изотов Б.В. «Криптография: скоростные шифры.» – СПб.: БХВ-Петербург, 2002;
Иванов М.А., Чугунков И.В. Теория, применение и оценка качества генераторов псевдослучайных последовательностей. – М.:КУДРИЦ-ОБРАЗ, 2003;
Б. Шнаер «Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си.» – М.: Издательство ТРИУМФ, 2003;
А.Л. Чмора, “Современная прикладная криптография”. Москва “Гелиос АРВ” 2001;
G. Marsaglia, Пакет статистических тестов DIEHARD, 1997, geo@stat.fsu.edu;
Материалы сайта http://cs-www.ncsl.nist.gov/rng/rng2.html;
Моисеева Н.К., Павлова А.М., Проскуряков А.В., Методика выполнения организационно-экономической части дипломного проекта. – М.: МИЭТ, 1987;
Каракеян В.И., Константинова Л.А., Писеев В.М., Лабораторный практикум по курсу “Производственная и экологическая безопасность в микроэлектронике”.-М.: МИЭТ,1990;
S. Mister and C. Adams, “Practical s-box Design", Workshop Record of the Work-shop on Selected Areas in Cryptography (SAC '96), Queen's University, Kingston, Ontario, 1996;
Biham E., Shamir A. “Differential cryptanalysis of DES-like cryptosystems //
Advances in Cryptology” — CRYPTO ′90. LNCS, v. 537, Springer-Verlag, 1991;
Дж. Диксон, “Проектирование систем: изобретательство, анализ и принятие решений”, Москва, “Мир”, 1969г..
Приложение 1
Комплекс программ, реализующий алгоритмы маскирования (операция Xor) и (операция Mult) , и набор тестов для частотного анализа выходных последовательностей алгоритмов маскирования в вычислительной среде MatLab 6.0 и Borland С++ Builder 6 состоит из 20 модулей. Ниже я приведу листинг некоторых функций и процедур.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <sys\stat.h>
#include <fcntl.h>
#include <fstream>
typedef unsigned long u4;
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
randomize();
StatusBar1->Panels->Items[0]->Text = "Произведите действие:";
}
//---------------------------------------------------------------------------
//функция индикации выбора алгорима маскирования (операция Xor)
void __fastcall TForm1::Xor1Click(TObject *Sender)
{
Mult->Checked = 0;
Xor1->Checked = !Xor1->Checked;
if (Xor1->Checked)
{
StatusBar1->Panels->Items[0]->Text = "Маскирование данных будет производиться используя алгорим (операция Xor)";
}else
{
StatusBar1->Panels->Items[0]->Text = "Выберете алгоритм маскирования";
}
}
//---------------------------------------------------------------------------
//функция индикации выбора алгорима маскирования (операция Mult)
void __fastcall TForm1::MultClick(TObject *Sender)
{
Xor1->Checked = 0;
Mult->Checked = !Mult->Checked;
if (Mult->Checked)
{
StatusBar1->Panels->Items[0]->Text = "Маскирование данных будет производиться используя алгорим (операция Mult)";
}else
{
StatusBar1->Panels->Items[0]->Text = "Выберете алгоритм маскирования";
}
}
//---------------------------------------------------------------------------
//функция реализующая загрузку данных для маскирования/демаскирования
void __fastcall TForm1::N5Click(TObject *Sender)
{
MyFName = "";
OpenDialog1->Title = "Загрузить файл";
if (OpenDialog1->Execute()){
MyFName = OpenDialog1->Files->Text;
StatusBar1->Panels->Items[0]->Text = "Данные для маскирования успешно загружены:";
}else{
StatusBar1->Panels->Items[0]->Text = "Загрузите данные для маскирования:";
}
}
//---------------------------------------------------------------------------
//функция реализации выхода из программы
void __fastcall TForm1::N6Click(TObject *Sender)
{
Free();
exit(1);
Form1->Close();
}
//---------------------------------------------------------------------------
//функция проверки ввода всех параметров алгоритма и данных
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Xor1->Checked == 1){
if (MyFName != ""){
algoritm = 1;
if (StrToInt(Form2->Edit1->Text) != 0){
read_file(StrToInt(Form2->Edit1->Text),algoritm);
n = StrToInt(Form2->Edit1->Text);
StatusBar1->Panels->Items[0]->Text = "маскирование (демаскирование) данных прошло успешно:";
}
else ShowMessage("Задайте параметры алгоритма:");
}else{
ShowMessage("Данные для маскирования/демаскирования не загружены:");
StatusBar1->Panels->Items[0]->Text = "Загрузите данные";
}
}else {
if (Mult->Checked == 1){
if (MyFName != ""){
algoritm = 2;
if (StrToInt(Form2->Edit1->Text) != 0){
read_file(StrToInt(Form2->Edit1->Text),algoritm);
n = StrToInt(Form2->Edit1->Text);
StatusBar1->Panels->Items[0]->Text = "Маскирование/Демаскирование данных прошло успешно:";
}
else ShowMessage("Задайте параметры алгоритма:");
}else{
ShowMessage("Данные для маскирования/демаскирования не загружены:");
StatusBar1->Panels->Items[0]->Text = "Загрузите данные";
}
}
else{
ShowMessage("Не выбран алгоритм маскирования/демаскирования");
StatusBar1->Panels->Items[0]->Text = "Выберете алгоритм маскирования/демаскирования";
}
}
}
//---------------------------------------------------------------------------
//Функция считывания входных данных и записи резельтируещих данных
unsigned long TForm1::read_file(int n,int algoritm)
{
get_rand_matr(n); //заполняем ключевую матрицу A и ключевой вектор B
get_c(n);
unsigned long *x;
x = new unsigned long[n];
//Создаем поток и загружаем в него файл
MyFName = MyFName.SubString(1,MyFName.Length()-2);
TFileStream *tfile=new TFileStream(MyFName,fmOpenReadWrite);
//Можно не применять - при открытии указатель и так на нуле
tfile->Seek(0,0);
//Буфер для информации
unsigned long *virgBuf;
//Выделяем память для буфера информации
virgBuf=(unsigned long *)malloc(tfile->Size);
int len =tfile->Size;
len = len/sizeof(unsigned long);
int k = len/n;
//нужно реализовать создание и открытие с последущей записью У
//реализация вывода в файл
int handle;
FILE *in;
handle = creat("result.txt", S_IREAD |S_IWRITE);
if ((in = fopen("result.txt", "r+")) == NULL)
{
ShowMessage("Error opening file.");
return 0;
}
u4 *res;
int file;
res = new u4[n];
for (int j=0;j<k;j++){
for (int i=0;i<n;i++){
//Читаем информацию в буфер
tfile->Read(virgBuf,sizeof(unsigned long));
x[i] = *virgBuf;
tfile->Seek(soFromCurrent,4);
}
if (algoritm == 1){
res = form_shifrX(&x[0],n);
}
if (algoritm == 2){
res = form_shifrM(&x[0],n);
}
for (int m=0;m<n;m++){
file = write(handle, &res[m], 4);
}
}
close(handle);
fclose(in);
delete x;
//Освобождаем память
free(virgBuf);
//Освобождают поток и переносим в память
tfile->Free();
return 0;
}
//---------------------------------------------------------------------------
//Функции реализующие алгоритм маскирования/демаскирования данных
u4* TForm1::form_shifrM(unsigned long* x,int n)
{
__int64 temp_x;
unsigned long temp_sum_mod2,temp_32;
unsigned long *y;
y = new unsigned long[n];
for(int j=0;j<n;j++){
temp_x = shifr_raund_modM(&x[0],&y[0],j,n);
temp_32 = To(&temp_x);
temp_sum_mod2 = sum_mod2(&temp_32,j);
y[j] = sum(&temp_sum_mod2,&x[0],j);
}
return y;
}
//---------------------------------------------------------------------------
u4* TForm1::form_shifrX(unsigned long* x,int n)
{
__int64 temp_x;
unsigned long temp_sum_mod2,temp_32;
unsigned long *y;
y = new unsigned long[n];
for(int j=0;j<n;j++){
temp_x = shifr_raund_modX(&x[0],&y[0],j,n);
temp_32 = To(&temp_x);
temp_sum_mod2 = sum_mod2(&temp_32,j);
y[j] = sum(&temp_sum_mod2,&x[0],j);
}
return y;
}
//---------------------------------------------------------------------------
__int64 TForm1::shifr_raund_modM(unsigned long* temp,unsigned long* y, int j,int n)
{
__int64 temp_x;
if (j==0){
temp_x = shifr_raund_sum0M(&temp[0],j,n);
}else{
if (j==(n-1)){
temp_x = shifr_raund_sumnM(&y[0],j,n);
}else{
temp_x = shifr_raund_sumM(&temp[0],&y[0],j,n);
}
}
return temp_x;
}
//---------------------------------------------------------------------------
__int64 TForm1::shifr_raund_modX(unsigned long* temp,unsigned long* y, int j,int n)
{
__int64 temp_x;
if (j==0){
temp_x = shifr_raund_sum0X(&temp[0],j,n);
}else{
if (j==(n-1)){
temp_x = shifr_raund_sumnX(&y[0],j,n);
}else{
temp_x = shifr_raund_sumX(&temp[0],&y[0],j,n);
}
}
return temp_x;
}
//---------------------------------------------------------------------------
//функция выборки из 2*N (где N =32 бита ) N бит
unsigned long TForm1::To(__int64* temp)
{
unsigned long peremX = *temp;
peremX = peremX >>16;
unsigned long per;
__int64 perem = *temp;
perem = perem >>8;
per = perem;
per = per^peremX;
return per;
}
//---------------------------------------------------------------------------
unsigned long TForm1::sum_mod2(unsigned long* temp,int j)
{
//нужно реализоваьт сумму по модулю 2
unsigned long perem;
perem = (*temp)^c[j][n-1];
return perem;
}
//---------------------------------------------------------------------------
unsigned long TForm1::sum(unsigned long* temp,unsigned long* x,int j)
{
//
unsigned long res;
res = x[j] ^ *temp;
return res;
}
//---------------------------------------------------------------------------
__int64 TForm1::shifr_raund_sum0M(unsigned long *x,int j,int n)
{
//реализация первого такта шифрования
__int64 temp_x=0;
for(int i=0;i<n-j-1;i++){
temp_x += x[i+j+1]*c[j][i];
}
return temp_x;
}
//---------------------------------------------------------------------------
__int64 TForm1::shifr_raund_sumnM(unsigned long* y,int j,int n)
{
//реализация последнего такта шифрования
__int64 temp_x2=0;
int cin = 0;
for(int i = n-1-j;i<n-1;i++){
temp_x2 += y[cin]*c[j][i];
cin++;
}
return temp_x2;
}
//---------------------------------------------------------------------------
__int64 TForm1::shifr_raund_sumM(unsigned long *x,unsigned long *y,int j,int n)
{
__int64 temp_x,temp_x1=0,temp_x2=0;
for (int i=0;i<n-j-1;i++){
temp_x1 += x[i+j+1]*c[j][i];
}
int cin = 0;
for(int i = n-1-j;i<n-1;i++){
temp_x2 += y[cin]*c[j][i];
cin++;
}
//нужна функция выборки 32 бит
temp_x = temp_x1 + temp_x2;
return temp_x;
}
//---------------------------------------------------------------------------
__int64 TForm1::shifr_raund_sum0X(unsigned long *x,int j,int n)
{
//реализация первого такта шифрования
__int64 temp_x=0;
for(int i=0;i<n-j-1;i++){
temp_x += x[i+j+1]^c[j][i];
}
return temp_x;
}
//---------------------------------------------------------------------------
__int64 TForm1::shifr_raund_sumnX(unsigned long* y,int j,int n)
{
//реализация последнего такта шифрования
__int64 temp_x2=0;
int cin = 0;
for(int i = n-1-j;i<n-1;i++){
temp_x2 += y[cin]^c[j][i];
cin++;
}
return temp_x2;
}
//---------------------------------------------------------------------------
__int64 TForm1::shifr_raund_sumX(unsigned long *x,unsigned long *y,int j,int n)
{
__int64 temp_x,temp_x1=0,temp_x2=0;
for (int i=0;i<n-j-1;i++){
temp_x1 += x[i+j+1]*c[j][i];
}
int cin = 0;
for(int i = n-1-j;i<n-1;i++){
temp_x2 += y[cin]^c[j][i];
cin++;
}
//нужна функция выборки 32 бит
temp_x = temp_x1 + temp_x2;
return temp_x;
}
//---------------------------------------------------------------------------
//Функция генерации секретного ключа
void TForm1::get_rand_matr(int n)
{
//реализация простого рандома
for (int i=0;i<n;i++){
for(int j=0;j<(n-1);j++){
a[i][j] = random(429496729);
}
b[i] = random(429496729);
}
}
//---------------------------------------------------------------------------
void TForm1::get_c(int n)
{
//реализация расширенной матрицы
for (int i=0;i<n;i++){
for(int j=0;j<(n-1);j++){
c[i][j] = a[i][j];
}
c[i][n-1] = b[i];
}
}
//---------------------------------------------------------------------------
//функция реализующая загрузку данных для маскирования/демаскирования
void __fastcall TForm1::N4Click(TObject *Sender)
{
MyFName = "";
OpenDialog1->Title = "Загрузить файл";
if (OpenDialog1->Execute()){
MyFName = OpenDialog1->Files->Text;
StatusBar1->Panels->Items[0]->Text = "Данные для маскирования успешно загружены:";
}else{
StatusBar1->Panels->Items[0]->Text = "Загрузите данные для маскирования:";
}
}
//---------------------------------------------------------------------------
% Проверка ключа на случайность по критерию k-распределенности (Кнут).
X=[1 0 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 0 1 1 1 0 0 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 0 0 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1];
%--------1-распределение ---------
num_zero=0;
num_ones=0;
for i=1:256,
if X(i)==0,
num_zero=num_zero+1;
else
num_ones=num_ones+1;
end
end
if abs(num_zero/256-0.5)<=0.0625 & abs(num_ones/256-0.5)<=0.0625,
'1-raspredelenie=yes'
else
'1-raspredelenie=no'
end
%--------2-распределение ---------
num(1:4)=0;
for i=1:256,
num(polyval([X(i),X(mod(i,256)+1)],2)+1)=num(polyval([X(i),X(mod(i,256)+1)],2)+1)+1;
end
if abs(num(1)/256-0.25)<=0.0625 & abs(num(2)/256-0.25)<=0.0625 & abs(num(3)/256-0.25)<=0.0625 & abs(num(4)/256-0.25)<=0.0625,
'2-raspredelenie=yes'
else
'2-raspredelenie=no'
end
%--------3-распределение ---------
num(1:8)=0;
for i=1:256,
num(polyval([X(i) X(mod(i,256)+1) X(mod(i+1,256)+1)],2)+1)=num(polyval([X(i) X(mod(i,256)+1) X(mod(i,255)+1)],2)+1)+1;
end
if abs(num(1)/256-0.125)<=0.0625 & abs(num(2)/256-0.125)<=0.0625 & abs(num(3)/256-0.125)<=0.0625 & abs(num(4)/256-0.125)<=0.0625 & abs(num(5)/256-0.125)<=0.0625 & abs(num(6)/256-0.125)<=0.0625 & abs(num(7)/256-0.125)<=0.0625 & abs(num(8)/256-0.125)<=0.0625,
'3-raspredelenie=yes'
else
'3-raspredelenie=no'
end
%--------4-распределение ---------
num(1:16)=0;
for i=1:256,
num(polyval([X(i) X(mod(i,256)+1) X(mod(i+1,256)+1) X(mod(i+2,256)+1)],2)+1)=num(polyval([X(i) X(mod(i,256)+1) X(mod(i+1,256)+1) X(mod(i+2,256)+1)],2)+1)+1;
end
if abs(num(1)/256-0.0625)<=0.0625 & abs(num(2)/256-0.0625)<=0.0625 & abs(num(3)/256-0.0625)<=0.0625 & abs(num(4)/256-0.0625)<=0.0625 & abs(num(5)/256-0.0625)<=0.0625 & abs(num(6)/256-0.0625)<=0.0625 & abs(num(7)/256-0.0625)<=0.0625 & abs(num(8)/256-0.0625)<=0.0625 & abs(num(9)/256-0.0625)<=0.0625 & abs(num(10)/256-0.0625)<=0.0625 & abs(num(11)/256-0.0625)<=0.0625 & abs(num(12)/256-0.0625)<=0.0625 & abs(num(13)/256-0.0625)<=0.0625 & abs(num(14)/256-0.0625)<=0.0625 & abs(num(15)/256-0.0625)<=0.0625 & abs(num(16)/256-0.0625)<=0.0625,
'4-raspredelenie=yes'
else
'4-raspredelenie=no'
end
%--------------------------------
% Частотный тест.
fid=fopen('inputseq.txt');
S = fscanf(fid,'%d ',inf);
fclose(fid);
siz=size(S);
n=siz(1);
X=2*S-1;
Sn=sum(X);
Sobs=abs(Sn)/sqrt(n);
Pvalue=erfc(Sobs/sqrt(2));
if Pvalue>0.01,
result='test +'
else
result='test -'
end
% Тест на самую длинную серию единиц в блоке
fid=fopen('inputseq.txt');
S = fscanf(fid,'%d ',inf);
fclose(fid);
n=6272;
K=5;
M=128;
N=49;
for i=1:N,
for j=1:M,
B(i,j)=S(j+M*(i-1));
end
end
for i=1:N,
count=0;
run=0;
for j=1:M,
if B(i,j)==0,
count=0;
else
count=count+1;
end
if count>run,
run=count;
end
end
runs(i)=run;
end
for i=1:6,
v(i)=0;
end
for i=1:N,
if runs(i)<=4,
v(1)=v(1)+1;
end
if runs(i)==5,
v(2)=v(2)+1;
end
if runs(i)==6,
v(3)=v(3)+1;
end
if runs(i)==7,
v(4)==v(4)+1;
end
if runs(i)==8,
v(5)=v(5)+1;
end
if runs(i)>=9,
v(6)=v(6)+1;
end
end
p(1)=0.1174;
p(2)=0.2430;
p(3)=0.2493;
p(4)=0.1752;
p(5)=0.1027;
p(6)=0.1124;
XiSquare=0;
for i=1:(K+1),
XiSquare=XiSquare+((v(i)-N*p(i))^2)/(N*p(i));
end
Pvalue=1-gammainc(XiSquare/2,K/2)
if Pvalue>0.01,
result='test +'
else
result='test -'
end
% Тест ранга двоичных матриц
fid=fopen('inputseq.txt');
S = fscanf(fid,'%d ',inf);
fclose(fid);
n=99328;
M=32;
Q=32;
N=97;
for i=1:N*M,
for j=1:Q,
B(i,j)=S(j+Q*(i-1));
end
end
for i=1:N,
r(i)=rank(B((1+(i-1)*M):(M+(i-1)*M),1:Q));
end
MAXR=M;
for i=1:3,
F(i)=0;
end
for i=1:N,
if r(i)==MAXR,
F(1)=F(1)+1;
elseif r(i)==MAXR-1,
F(2)=F(2)+1;
else
F(3)=F(3)+1;
end
end
p(1)=0.2888;
p(2)=0.5776;
p(3)=0.1336;
XiSquare=0;
for i=1:3,
XiSquare=XiSquare+((F(i)-N*p(i))^2)/(N*p(i));
end
%Pvalue=1-gammainc(XiSquare/2,1)
Pvalue=exp(-XiSquare/2);
if Pvalue>0.01,
result='test +'
else
result='test -'
end
% Спектральный тест
fid=fopen('inputseq.txt');
e = fscanf(fid,'%u ',inf);
fclose(fid);
num=size(e); n=num(1);
for i=1:n,
x(i)=2*e(i)-1;
end
s=fft(x);
M=abs(s(1:n/2));
plot(M);grid
T=sqrt(3*n);
N0=0.95*n/2
N1=0;
for i=1:n/2,
if M(i)<T,
N1=N1+1;
end
end
N1
d=(N1-N0)/(sqrt(n*0.95*0.05/2))
Pvalue=erfc(abs(d)/sqrt(2))
if Pvalue>0.01,
result='test +'
else
result='test -'
end
% Универсальный статистический тест Маурэра.
fid=fopen('inputseq.txt');
S = fscanf(fid,'%d ',inf);
fclose(fid);
n=470016;
L=6;
Q=640;
K=77696;
for i=1:(Q+K),
for j=1:L,
QK(i,j)=S(j+L*(i-1));
end
end
for i=1:2^L,
T(i)=0;
end
for i=1:Q,
j=polyval(QK(i,:),2);
T(j+1)=i;
end
sum=0;
for i=(Q+1):(Q+K),
j=polyval(QK(i,:),2);
sum=sum+log2(i-T(j+1));
T(j+1)=i;
end
fn=sum/K;
c=0.7-(0.8/L)+((4+32/L)*(K^(-3/L))/15);
sigma=c*sqrt(2.954/K);
Pvalue=erfc(abs(fn-5.2177052)/(sqrt(2)*sigma));
if Pvalue>0.01,
result='test +'
else
result='test -'
end
% Сжатие при помощи алгоритма Лемпела-Зива.
fid=fopen('inputseq.txt');
s = fscanf(fid,'%d ',inf);
fclose(fid);
sizeofS=size(s);
%n=sizeofS(1);
n=100000;
slovar=num2str(s(1));
i=2;
while i<=n,
str=num2str(s(i));
r=1;
k=0;
while r==1,
r=0;
siz=size(slovar);
sizeofstr=size(str);
for j=1:siz(1),
if sizeofstr==size(deblank(slovar(j,:))),
if str==deblank(slovar(j,:)),
r=1;
end
end
end
if r==1,
str=strcat(str,num2str(s(i+k+1)));
k=k+1;
else
slovar=strvcat(slovar,str);
end
end
i=i+k+1;
end
W=size(slovar);
Wobs=W(1);
Pvalue=0.5*erfc(abs(69586.25-Wobs)/sqrt(2*70.448718))
if Pvalue>0.01,
result='test +'
else
result='test -'
end
% Тест линейной сложности.
fid=fopen('output.txt');
L = fscanf(fid,'%u ',inf);
fclose(fid);
n=1000000;
M=1000;
N=1000;
K=6;
miuTeor=M/2+(9+(-1)^(M+1))/36-(M/3+2/9)/2^M;
for i=1:N,
T(i)=((-1)^M)*(L(i)-miuTeor)+2/9;
end
for i=1:7,
v(i)=0;
end
for i=1:N,
if (T(i)<=-2.5),
v(1)=v(1)+1;
end
if (T(i)>-2.5)&(T(i)<=-1.5),
v(2)=v(2)+1;
end
if (T(i)>-1.5)&(T(i)<=-0.5),
v(3)=v(3)+1;
end
if (T(i)>-0.5)&(T(i)<=0.5),
v(4)=v(4)+1;
end
if (T(i)>0.5)&(T(i)<=1.5),
v(5)=v(5)+1;
end
if (T(i)>1.5)&(T(i)<=2.5),
v(6)=v(6)+1;
end
if (T(i)>2.5),
v(7)=v(7)+1;
end
end
p(1)=0.01047;
p(2)=0.03125;
p(3)=0.12500;
p(4)=0.50000;
p(5)=0.25000;
p(6)=0.06250;
p(7)=0.020833;
XiSquare=0;
for i=1:(K+1),
XiSquare=XiSquare+((v(i)-N*p(i))^2)/(N*p(i));
end
Pvalue=1-gammainc(XiSquare/2,K/2)
if Pvalue>0.01,
result='test +'
else
result='test -'
end
% Вычисление линейной сложности с помощью алгоритма “Берлекампа-Месси”.
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
long BerlekampMassey(char *s, long n, long *C)
{
long L = 0, N = 0, d, e, i, m = - 1, n1 = n + 1, sum;
long dB = 0, dC = 0, dT;
long *B = malloc(n1 * sizeof(long));
long *D = malloc(n1 * sizeof(long));
long *T = malloc(n1 * sizeof(long));
for (i = 1; i < n1; i++) B[i] = C[i] = T[i] = 0;
T[0] = 0;
C[0] = B[0] = 1;
while (N < n) {
sum = 0;
for (i = 1; i <= L; i++) sum += C[i] * s[N - i];
d = (s[N] + sum) & 1l;
if (d == 1) {
dT = dC;
for (i = 0; i <= dT; i++) T[i] = C[i];
e = N - m;
for (i = 0; i < e; i++) D[i] = 0;
for (i = 0; i <= dB; i++) D[i + e] = B[i];
D[e] = 1;
for (i = 0; i <= dB + e; i++)
C[i] = (C[i] + D[i]) & 1l;
if (dB + e > dC) dC = dB + e;
if (L <= N / 2) {
dB = dT;
for (i = 0; i <= dB; i++) B[i] = T[i];
L = N + 1 - L, m = N;
}
}
N++;
}
free(B);
free(D);
free(T);
return L;
}
void main(void)
{
char sb[1000], s[1000000];
long i, j, n = 1000000, M = 1000, N = 1000, C[1000], L[1000];
FILE *stream1;
stream1 = fopen("inputseq.txt", "r");
for (i = 0; i < n; i++) fscanf(stream1, "%d", &s[i]);
fclose(stream1);
FILE *stream2;
stream2 = fopen("output.txt", "w+");
for (i = 0; i < N; i++)
{
for (j = 0; j < M; j++) sb[j] = s[j+M*i];
L[i] = BerlekampMassey(sb, M, C);
}
for (i = 0; i < N; i++) fprintf(stream2, "%d ", L[i]);
fclose(stream2);
}
% Построение профиля линейной сложности.
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
long BerlekampMassey(char *s, long n, long *C)
{
long L = 0, N = 0, d, e, i, m = - 1, n1 = n + 1, sum;
long dB = 0, dC = 0, dT;
long *B = malloc(n1 * sizeof(long));
long *D = malloc(n1 * sizeof(long));
long *T = malloc(n1 * sizeof(long));
for (i = 1; i < n1; i++) B[i] = C[i] = T[i] = 0;
T[0] = 0;
C[0] = B[0] = 1;
while (N < n) {
sum = 0;
for (i = 1; i <= L; i++) sum += C[i] * s[N - i];
d = (s[N] + sum) & 1l;
if (d == 1) {
dT = dC;
for (i = 0; i <= dT; i++) T[i] = C[i];
e = N - m;
for (i = 0; i < e; i++) D[i] = 0;
for (i = 0; i <= dB; i++) D[i + e] = B[i];
D[e] = 1;
for (i = 0; i <= dB + e; i++)
C[i] = (C[i] + D[i]) & 1l;
if (dB + e > dC) dC = dB + e;
if (L <= N / 2) {
dB = dT;
for (i = 0; i <= dB; i++) B[i] = T[i];
L = N + 1 - L, m = N;
}
}
N++;
}
free(B);
free(D);
free(T);
return L;
}
void main(void)
{
char s[10000];
long i, j, n = 10000, L[10000], n1=n+1;
long *sb = malloc(n1 * sizeof(long));
long *C = malloc(n1 * sizeof(long));
FILE *stream1;
stream1 = fopen("inputseq.txt", "r");
for (i = 0; i < n; i++) fscanf(stream1, "%d", &s[i]);
fclose(stream1);
FILE *stream2;
stream2 = fopen("outputprofil.txt", "w+");
for (i = 0; i < n; i++)
{
for (j = 0; j < i+1; j++) sb[j] = s[j];
L[i] = BerlekampMassey(sb, (i+1), C);
}
for (i = 0; i < n; i++) fprintf(stream2, "%d ", L[i]);
fclose(stream2);
}