using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Numerics;
using System.IO;
namespace Z_2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Random rnd = new Random((int)DateTime.Now.Millisecond);
//функция генерации М-последовательности с n элементами
private string M_seq(int n)
{
string M = "";
string c = textBox1.Text;
BigInteger registr = strToBI(c);
BigInteger bit = 0;
for (int i = 0; i < n; i++)
{
M += 1 & registr;
int count_m = M.Length;
bit = (((1 << 30) & registr) >> 30) ^ (((1 << 2) & registr) >> 2);
registr = (bit << 30) | (registr >> 1);
}
return M;
}
//функция перевода строкового типа в BigInteger
private BigInteger strToBI(string n)
{
BigInteger num = 0;
for (int i = 0; i < n.Length; i++)
{
num = ((num << 1) | ((int)n[i] - 48));
}
return num;
}
//Вычисление критерия Пирсона
private double x2(int[] freq)
{
double x = 0;
double teor_freq = freq.Sum() / (double)freq.Length;
for (int i = 0; i < freq.Length; i++)
{
x += Math.Pow(freq[i] - teor_freq, 2) / teor_freq;
}
x = Math.Round(x, 3);
return x;
}
//корреляционный тест
private void cor_test(string M)
{
double S_x = 0, S_y = 0, D_x = 0, D_y = 0, R = 0, R_mod = 0;
int offset = Convert.ToInt32(textBox2.Text);
int l = M.Length - offset;
for (int i = 0; i < M.Length - offset; i++)
S_x += M[i];
S_x = S_x / (l);
for (int i = offset; i < M.Length; i++)
S_y += M[i];
S_y = S_y / l;
for (int i = 0; i < M.Length - offset; i++)
D_x += Math.Pow((M[i] - S_x), 2);
D_x = D_x / (l - 1);
for (int i = offset; i < M.Length; i++)
D_y += Math.Pow((M[i] - S_y), 2);
D_y = D_y / (l - 1);
for (int i = 0; i < M.Length - offset; i++)
R += (M[i] - S_x) * (M[i + offset] - S_y);
R = R / (l * Math.Sqrt(D_x * D_y));
double root = Math.Sqrt(l * (double)(l - 3) / (l + 1));
double two_add = (double)2 / (l - 2);
R_mod = (double)1 / (l - 1) + two_add * root;
if (Math.Abs(R) <= R_mod)
{
textBox4.Text = Math.Abs(Math.Round(R, 3)) + " <= " + Math.Round(R_mod, 3);
label12.Text = "Тест пройден";
}
else
{
textBox4.Text = Math.Abs(Math.Round(R, 3)) + " <= " + Math.Round(R_mod, 3);
label12.Text = "Тест не пройден";
}
}
//сериальный тест
private void ser_test(string M)
{
dataGridView1.Rows.Clear();
int serial = Convert.ToInt32(comboBox1.Text);
Dictionary<string, int> freq = new Dictionary<string, int>();
for (int i = 0; i < Math.Pow(2, serial); i++)
{
string key = Convert.ToString(i, 2);
while (key.Length != serial)
key = "0" + key;
freq.Add(key, 0);
}
for (int i = 0; i < (M.Length - (M.Length % serial)) / serial; i++)
{
string substr = M.Substring(serial * i, serial);
freq[substr]++;
}
foreach (string key in freq.Keys)
{
dataGridView1.Rows.Add(key, freq[key]);
}
double xi2 = x2(freq.Values.ToArray<int>());
textBox7.Text = Convert.ToString(xi2);
double[][] level = new double[][] { new double[] { 0.352, 2.167, 7.261 },
new double[] {0.584, 2.833, 8.547 }, new double[] {6.251, 12.017,22.307 },
new double[]{7.815, 14.067, 24.996 }};
// string limit_up = comboBox2.Text;
string limit_down = comboBox3.Text;
//double high_crit_x2 = 0;
double low_crit_x2 = 0;
//if (limit_up == "0.05")
// high_crit_x2 = level[3][serial - 2];
// else high_crit_x2 = level[2][serial - 2];
if (limit_down == "0.95")
low_crit_x2 = level[0][serial - 2];
else low_crit_x2 = level[1][serial - 2];
textBox6.Text = Convert.ToString(low_crit_x2);
// textBox5.Text = Convert.ToString(high_crit_x2);
if (low_crit_x2 < xi2 && xi2< high_crit_x2)
label9.Text = "Тест пройден";
else label9.Text = "Тест не пройден";
}
//запись в файл начального состояния
private void button1_Click(object sender, EventArgs e)
{
string c = textBox1.Text;
File.WriteAllText("key.txt", c);
}
//выгрузка из файла начального состояния
private void button2_Click(object sender, EventArgs e)
{
string c = File.ReadAllText("key.txt");
textBox1.Text = c;
}
//генерация начального состояния
private void button3_Click(object sender, EventArgs e)
{
textBox1.Text = ""; string c = "";
byte[] buff = new byte[4];
BigInteger x = 0;
while (x == 0)
{
rnd.NextBytes(buff);
x = new BigInteger(buff);
}
for(int i = 0; i < 31; i++)
{
int bit = (int)((x >> i) & 1);
c = Convert.ToString(bit) + c;
}
textBox1.Text = c;
}
//генерация М-последовательности
private void button4_Click(object sender, EventArgs e)
{
int n_count = Convert.ToInt32(textBox3.Text);
string M = M_seq(n_count);
richTextBox1.Text = M;
}
//Проведение корреляционного теста М-последовательности
private void button5_Click(object sender, EventArgs e)
{
string M = richTextBox1.Text;
M = M.Substring(62);
cor_test(M);
}
//Проведение сериального теста М-последовательности
private void button6_Click(object sender, EventArgs e)
{
string M = richTextBox1.Text;
M = M.Substring(62);
ser_test(M);
}
//Шифрование файла М-последовательностью
private void button7_Click(object sender, EventArgs e)
{
byte origin_file;
BinaryReader br1 = new BinaryReader(File.OpenRead("text.txt"));
BinaryWriter bw = new BinaryWriter(File.OpenWrite("encoded.txt"));
string M = M_seq((int)br1.BaseStream.Length * 8);
byte[] key = strToBI(M).ToByteArray();
int k = 0;
while (br1.BaseStream.Position != br1.BaseStream