Ignore:
Timestamp:
May 19, 2009, 12:59:09 PM (13 years ago)
Author:
Arno Wacker
Message:
  • Small fixes for Enigma
    • Bugfix: now also rotors with more than one notches behave correctly
    • Rings can now be set from 1 to 26, instead of 0-25.
  • Updated samples for Enigma.
Location:
trunk/CrypPlugins/Enigma
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/Enigma/Enigma.cs

    r311 r317  
    561561            // get the position of each rotor
    562562            char[] key = settings.Key.ToCharArray();
    563             int keyIndex = key.Length - 1;
    564563            int rotor4Pos = 0;
    565564            if (settings.Model == 4 && key.Length == 4)
     
    568567                rotor4Pos = settings.Alphabet.IndexOf(key[0]);
    569568            }
    570             int rotor1Pos = settings.Alphabet.IndexOf(key[keyIndex--]);
    571             int rotor2Pos = settings.Alphabet.IndexOf(key[keyIndex--]);
    572             int rotor3Pos = settings.Alphabet.IndexOf(key[keyIndex]);
     569            int rotor1Pos = settings.Alphabet.IndexOf(key[key.Length - 1]);
     570            int rotor2Pos = settings.Alphabet.IndexOf(key[key.Length - 2]);
     571            int rotor3Pos = settings.Alphabet.IndexOf(key[key.Length - 3]);
    573572
    574573
    575574            //check notches and update the rotor position
    576             keyIndex = key.Length - 1;
    577575            foreach (char n in rotor1notches)
    578576            {
    579                 if (n == key[keyIndex--]) rotor2Pos = (rotor2Pos + 1) % aLength;   
     577                if (n == key[key.Length - 1]) rotor2Pos = (rotor2Pos + 1) % aLength;   
    580578            }
    581579
    582580            foreach (char n in rotor2notches)
    583581            {
    584                 if (n == key[keyIndex--]) rotor3Pos = (rotor3Pos + 1) % aLength;
     582                if (n == key[key.Length - 2]) rotor3Pos = (rotor3Pos + 1) % aLength;
    585583            }
    586584
    587585            foreach (char n in rotor3notches)
    588586            {
    589                 if (n == key[keyIndex]) rotor4Pos = (rotor4Pos + 1) % aLength;
     587                if (n == key[key.Length - 3]) rotor4Pos = (rotor4Pos + 1) % aLength;
    590588            }
    591589
    592590            rotor1Pos = (rotor1Pos + 1) % aLength;
    593             keyIndex = key.Length - 1;
    594            
    595             key[keyIndex--] = A[rotor1Pos];
    596             key[keyIndex--] = A[rotor2Pos];
    597             key[keyIndex--] = A[rotor3Pos];
    598             if (settings.Model == 4 && key.Length == 4) key[keyIndex] = A[rotor4Pos];
     591
     592            key[key.Length - 1] = A[rotor1Pos];
     593            key[key.Length - 2] = A[rotor2Pos];
     594            key[key.Length - 3] = A[rotor3Pos];
     595            if (settings.Model == 4 && key.Length == 4) key[0] = A[rotor4Pos];
    599596
    600597            // write back the updated rotor settings
     
    602599
    603600            //add the ring-offset
    604             rotor1Pos = (aLength + rotor1Pos - settings.Ring1) % 26;
    605             rotor2Pos = (aLength + rotor2Pos - settings.Ring2) % 26;
    606             rotor3Pos = (aLength + rotor3Pos - settings.Ring3) % 26;
     601            rotor1Pos = (aLength + rotor1Pos - (settings.Ring1 - 1)) % aLength;
     602            rotor2Pos = (aLength + rotor2Pos - (settings.Ring2 - 1)) % aLength;
     603            rotor3Pos = (aLength + rotor3Pos - (settings.Ring3 - 1)) % aLength;
    607604
    608605            // now do the substitution
  • trunk/CrypPlugins/Enigma/EnigmaSettings.cs

    r311 r317  
    242242        private int rotor4 = 0;
    243243
    244         private int ring1 = 0;
    245         private int ring2 = 0;
    246         private int ring3 = 0;
    247         private int ring4 = 0;
     244        private int ring1 = 1; // 01 = A, 02 = B ...
     245        private int ring2 = 1;
     246        private int ring3 = 1;
     247        private int ring4 = 1;
    248248
    249249        private int reflector = 1;
     
    629629        #region Used ring settings
    630630
    631         [TaskPane("Ring 1 (right)", "Select the the offset for ring 1", "Ring settings", 20, false, DisplayLevel.Beginner, ControlType.NumericUpDown, ValidationType.RangeInteger,0,26)]
     631        [TaskPane("Ring 1 (right)", "Select the the offset for ring 1", "Ring settings", 20, false, DisplayLevel.Beginner, ControlType.NumericUpDown, ValidationType.RangeInteger,1,26)]
    632632        public int Ring1
    633633        {
    634             get { return this.ring1; }
    635             set
    636             {
    637                 if (((int)value) != ring1) hasChanges = true;
    638                 this.ring1 = (int)value;
    639                 OnPropertyChanged("Ring1");
    640             }
    641         }
    642 
    643         [TaskPane("Ring 2", "Select the the offset for ring 2", "Ring settings", 21, false, DisplayLevel.Beginner, ControlType.NumericUpDown, ValidationType.RangeInteger, 0, 26)]
     634            get { return ring1; }
     635            set
     636            {
     637                if (value != ring1)
     638                {
     639                    hasChanges = true;
     640                    ring1 = value;
     641                    OnPropertyChanged("Ring1");
     642                }
     643            }
     644        }
     645
     646        [TaskPane("Ring 2", "Select the the offset for ring 2", "Ring settings", 21, false, DisplayLevel.Beginner, ControlType.NumericUpDown, ValidationType.RangeInteger, 1, 26)]
    644647        public int Ring2
    645648        {
    646             get { return this.ring2; }
    647             set
    648             {
    649                 if (((int)value) != ring2) hasChanges = true;
    650                 this.ring2 = (int)value;
    651                 OnPropertyChanged("Ring2");
    652             }
    653         }
    654 
    655         [TaskPane("Ring 3", "Select the the offset for ring 3", "Ring settings", 22, false, DisplayLevel.Beginner, ControlType.NumericUpDown, ValidationType.RangeInteger, 0, 26)]
     649            get { return ring2; }
     650            set
     651            {
     652                if (value != ring2)
     653                {
     654                    hasChanges = true;
     655                    ring2 = value;
     656                    OnPropertyChanged("Ring2");
     657                }
     658            }
     659        }
     660
     661        [TaskPane("Ring 3", "Select the the offset for ring 3", "Ring settings", 22, false, DisplayLevel.Beginner, ControlType.NumericUpDown, ValidationType.RangeInteger, 1, 26)]
    656662        public int Ring3
    657663        {
    658             get { return this.ring3; }
    659             set
    660             {
    661                 if (((int)value) != ring3) hasChanges = true;
    662                 this.ring3 = (int)value;
    663                 OnPropertyChanged("Ring3");
    664             }
    665         }
    666 
    667         [TaskPane("Ring 4 (left)", "Select the the offset for ring 4", "Ring settings", 23, false, DisplayLevel.Beginner, ControlType.NumericUpDown, ValidationType.RangeInteger, 0, 26)]
     664            get { return ring3; }
     665            set
     666            {
     667                if (value != ring3)
     668                {
     669                    hasChanges = true;
     670                    ring3 = value;
     671                    OnPropertyChanged("Ring3");
     672                }
     673            }
     674        }
     675
     676        [TaskPane("Ring 4 (left)", "Select the the offset for ring 4", "Ring settings", 23, false, DisplayLevel.Beginner, ControlType.NumericUpDown, ValidationType.RangeInteger, 1, 26)]
    668677        public int Ring4
    669678        {
    670             get { return this.ring4; }
    671             set
    672             {
    673                 if (((int)value) != ring4) hasChanges = true;
    674                 this.ring4 = (int)value;
    675                 OnPropertyChanged("Ring4");
     679            get { return ring4; }
     680            set
     681            {
     682                if (value != ring4)
     683                {
     684                    hasChanges = true;
     685                    ring4 = value;
     686                    OnPropertyChanged("Ring4");
     687                }
    676688            }
    677689        }
Note: See TracChangeset for help on using the changeset viewer.