Wątek przeniesiony 2014-11-08 17:08 z Nietuzinkowe tematy przez Rev.

symulator enigmy w C#

0

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;
        }

    
    
    
    }
}
 
0

Uzyj debuggera, do tego on służy, a nie sądzę, żeby komuś się chciało analizować ten kod samodzielnie.

0

Używam i teoretycznie wszystko działa jak powinno. Jak liczę na piechotę to wychodzi mi tak samo. Jednak inne symulatory pokazują zupełnie różny szyfr wynikowy. Myślałem że ktoś robił coś podobnego i podrzuci cenne rady.

3

Inicjalizacja tablic w C#: http://msdn.microsoft.com/en-us/library/aa287601%28v=vs.71%29.aspx
Potem ten kod może się będzie dało analizować.

1 użytkowników online, w tym zalogowanych: 0, gości: 1