Witajcie! To mój pierwszy post na forum i proszę o wyrozumiałość.
Muszę stworzyć emulator Enigmy w C#. Mój program działa zgodnie z symulatorami, do czasu aż włączę "obracanie się" wirników. Wtedy nagle zaczyna przekłamywać. Dziwne jest to że patrząc np na stronę: http://edu.i-lo.tarnow.pl/inf/hist/006_col/0001.php podstawienia mojego programu wydają się słuszne. Jednak nie pokrywa się to z żadnym symulatorem np http://enigmaco.de/enigma/enigma_pl.html .
Na razie program nie wygląda ciekawie, ani nie jest odporny na wpisywanie cyfr itd - takie sprawy kosmetyczne zostawiam na koniec.
Nie oczekuję że ktoś zrobi to za mnie, jednak mam nadzieję że ktoś wytknie mi błąd mojego myślenia lub inny szczegół który przeoczyłem.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace Enigma
{
public partial class Form1 : Form
{
public int[] wirnik3 = new int[27];
public int[] wirnik2 = new int[27];
public int[] wirnik1 = new int[27];
public int[] beben_odwr = new int[27];
public void wirnik3_pocz()
{
wirnik3[0] = 0; //dodatkowy
wirnik3[1] = 2; //B
wirnik3[2] = 4; //D
wirnik3[3] = 6; //F
wirnik3[4] = 8; //H
wirnik3[5] = 10; //J
wirnik3[6] = 12; //L
wirnik3[7] = 3; //C
wirnik3[8] = 16; //P
wirnik3[9] = 18; //R
wirnik3[10] = 20; //T
wirnik3[11] = 24; //X
wirnik3[12] = 22; //V
wirnik3[13] = 26; //Z
wirnik3[14] = 14; //N
wirnik3[15] = 25; //Y
wirnik3[16] = 5; //E
wirnik3[17] = 9; //I
wirnik3[18] = 23; //W
wirnik3[19] = 7; //G
wirnik3[20] = 1; //A
wirnik3[21] = 11; //K
wirnik3[22] = 13; //M
wirnik3[23] = 21; //U
wirnik3[24] = 19; //S
wirnik3[25] = 17; //Q
wirnik3[26] = 15; //O
}
public void wirnik2_pocz()
{
wirnik2[0] = 0; //dodatkowy
wirnik2[1] = 1; //A
wirnik2[2] = 10; //J
wirnik2[3] = 4; //D
wirnik2[4] = 11; //K
wirnik2[5] = 19; //S
wirnik2[6] = 9; //I
wirnik2[7] = 18; //R
wirnik2[8] = 21; //U
wirnik2[9] = 24; //X
wirnik2[10] = 2; //B
wirnik2[11] = 12; //L
wirnik2[12] = 8; //H
wirnik2[13] = 23; //W
wirnik2[14] = 20; //T
wirnik2[15] = 13; //M
wirnik2[16] = 3; //C
wirnik2[17] = 17; //Q
wirnik2[18] = 7; //G
wirnik2[19] = 26; //Z
wirnik2[20] = 14; //N
wirnik2[21] = 16; //P
wirnik2[22] = 25; //Y
wirnik2[23] = 6; //F
wirnik2[24] = 22; //V
wirnik2[25] = 15; //O
wirnik2[26] = 5; //E
}
public void wirnik1_pocz()
{
wirnik1[0] = 0; //dodatkowy
wirnik1[1] = 5; //E
wirnik1[2] = 11; //K
wirnik1[3] = 13; //M
wirnik1[4] = 6; //F
wirnik1[5] = 12; //L BDFHJLCPRTXVZNYEIWGAKMUSQO
wirnik1[6] = 7; //G
wirnik1[7] = 4; //D
wirnik1[8] = 17; //Q
wirnik1[9] = 22; //V
wirnik1[10] = 26; //Z
wirnik1[11] = 14; //N
wirnik1[12] = 20; //T
wirnik1[13] = 15; //O
wirnik1[14] = 23; //W
wirnik1[15] = 25; //Y
wirnik1[16] = 8; //H
wirnik1[17] = 24; //X
wirnik1[18] = 21; //U
wirnik1[19] = 19; //S
wirnik1[20] = 16; //P
wirnik1[21] = 1; //A
wirnik1[22] = 9; //I
wirnik1[23] = 2; //B
wirnik1[24] = 18; //R
wirnik1[25] = 3; //C
wirnik1[26] = 10; //J
}
public void beben_odwr_pocz()
{
beben_odwr[0] = 0; //dodatkowy
beben_odwr[1] = 25; //Y
beben_odwr[2] = 18; //R
beben_odwr[3] = 21; //U
beben_odwr[4] = 8; //H
beben_odwr[5] = 17; //Q
beben_odwr[6] = 19; //S
beben_odwr[7] = 12; //L
beben_odwr[8] = 4; //D
beben_odwr[9] = 16; //P
beben_odwr[10] = 24; //X
beben_odwr[11] = 14; //N
beben_odwr[12] = 7; //G
beben_odwr[13] = 15; //O
beben_odwr[14] = 11; //K
beben_odwr[15] = 13; //M
beben_odwr[16] = 9; //I
beben_odwr[17] = 5; //E
beben_odwr[18] = 2; //B
beben_odwr[19] = 6; //F
beben_odwr[20] = 26; //Z
beben_odwr[21] = 3; //C
beben_odwr[22] = 23; //W
beben_odwr[23] = 22; //V
beben_odwr[24] = 10; //J
beben_odwr[25] = 1; //A
beben_odwr[26] = 20; //T
}
public Form1()
{
InitializeComponent();
wirnik3_pocz();
wirnik2_pocz();
wirnik1_pocz();
beben_odwr_pocz();
textBox1.Text = ("");
//dekodowanie("a");
//pozycja_wirnika(0, 0, 25, 0);
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string tekst_wejsciowy = textBox1.Text;
string na_textbox = dekodowanie(tekst_wejsciowy);
textBox2.Text = ("" + na_textbox);
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
wirnik1_pocz();
wirnik2_pocz();
wirnik3_pocz();
}
public string dekodowanie(string surowy_tekst)
{
int kod_litery;
string zaszyfrowane = "";
surowy_tekst = surowy_tekst.ToUpper();
textBox1.Text = surowy_tekst;
byte[] wyrazy_ascii = Encoding.ASCII.GetBytes(surowy_tekst);
int dlugosc_tablicy = wyrazy_ascii.Length;
for (int i = 0; i < dlugosc_tablicy; i++)
{
pozycja_wirnika(0, 0, 1, 0);
kod_litery = wyrazy_ascii[i] - 64;
kod_litery = szyfrowanie(kod_litery) + 64;
zaszyfrowane = zaszyfrowane + Char.ConvertFromUtf32(kod_litery);
}
return zaszyfrowane;
}
public void pozycja_wirnika(int wir1, int wir2, int wir3, int poz_pocz) //jeśli start na 1 to przesuwamy od poz pocz, jesli nie to od biezacej
{
if (poz_pocz == 1)
{
wirnik1_pocz();
wirnik2_pocz();
wirnik3_pocz();
}
if (wir3 > 0)
{
for (int i = 0; i < wir3; i++)
{
for (int z = 0; z < 26; z++)
{
wirnik3[z] = wirnik3[z + 1];
}
wirnik3[26] = wirnik3[0];
wirnik3[0] = 0;
if (wirnik3[1] == 2) wir2++;
}
}
/* if (wir2 > 0)
{
for (int i = 0; i < wir2; i++)
{
for (int z = 0; z < 26; z++)
{
wirnik2[z] = wirnik2[z + 1];
}
wirnik2[26] = wirnik2[0];
if (wirnik2[1] == 2) wir1++;
}
}
if (wir1 > 0)
{
for (int i = 0; i < wir1; i++)
{
for (int z = 0; z < 26; z++)
{
wirnik1[z] = wirnik1[z + 1];
}
wirnik1[26] = wirnik1[0];
}
}
*/
}
public int szyfrowanie(int cyfra)
{
cyfra = wirnik3[cyfra];
textBox3.Text = (Char.ConvertFromUtf32(cyfra + 64));
cyfra = wirnik2[cyfra];
textBox4.Text = (Char.ConvertFromUtf32(cyfra + 64));
cyfra = wirnik1[cyfra];
textBox5.Text = (Char.ConvertFromUtf32(cyfra + 64));
cyfra = beben_odwr[cyfra];
textBox6.Text = (Char.ConvertFromUtf32(cyfra + 64));
for (int i = 1; i <= 26; i++)
{
if (wirnik1[i] == cyfra)
{
cyfra = i;
break;
}
}
textBox7.Text = (Char.ConvertFromUtf32(cyfra + 64));
for (int i = 1; i <= 26; i++)
{
if (wirnik2[i] == cyfra)
{
cyfra = i;
break;
}
}
textBox8.Text = (Char.ConvertFromUtf32(cyfra + 64));
for (int i = 1; i <= 26; i++)
{
if (wirnik3[i] == cyfra)
{
cyfra = i;
break;
}
}
textBox9.Text = (Char.ConvertFromUtf32(cyfra + 64));
return cyfra;
}
}
}