Program breakEnigma; (* (c) 2022 Diana K. *) Var subCrypts: array[1..3,1..5] of string = (('T-?-??-???--X-T'), ('A-?-??-???-P-A'), ('C-?-??-???-Z-C'), ('Q-?-??-???-B-Q'), ('G-?-??-???-Q-G'); (* second set for state 2, third set for state 3 *) msg: string; i, j, k: integer; settings: array[0..3] of integer = (0, 0, 0, 0); maxWheel: array[0..3] = (32, 32, 32, 32); state: integer; completed: Boolean; function decrypt1(cryptMsg): Boolean; var i, j, k: integer; Tmp: string; Solved: Boolean; Begin Tmp := ''; Solved := true; For i := 1 to length(cryptMsg) Do begin j := (i mod 4); (* Plugboard *) Tmp[1] := chr(((ord(cryptMsg[i]) + setting[j]) mod maxWheel[j]); (* Wheel 3 *) Tmp[2] := chr(((ord(tmp[1]) + setting[(j + 1) mod 4]) mod maxWheel[(j + 1) mod 4]); (* Wheel 2 *) Tmp[3] := chr(((ord(tmp[2]) + setting[(j + 2) mod 4]) mod maxWheel[(j + 2) mod 4]); (* Wheel 1 *) Tmp[4] := chr(((ord(tmp[4]) + setting[(j + 3) mod 4]) mod maxWheel[(j + 3) mod 4]); Solved := solved and (cryptMsg[i] = tmp[4]); End; Decrypt1 := solved; End; Procedure solvePartialSubCrypt(state:integer; i:integer; settings:integer; subCrypts: string[][]); Var i, j, k: integer; Begin (* convert pseudocode lit to pascal like pseudocode *) (* a challenge to the reader, easy to do *) End; begin writeln('Program Break Enigma'); write('Enter Encrypted Message? '); readln(msg); writeln; writeln('..Starting Solving'); for state := 1 to 4 do begin for i := 4 downto 1 do solvePartialSubCrypt(state, i, settings, subCrypts); end; (* check work *) Completed := true; For state := 1 to 3 Do for j := 1 to 5 Do competed := completed and decrypt1(subCrypts[state, j]); (* show result *) If not completed Then writeln('A Solution was not found') Else writeln('A Solution was found'); Writeln; Writeln('Settings: \tPlugboard\tWheel 3\tWheel 2\tWheel 1'); Writeln('\t' + settings[0] + '\t' + settings[1] + '\t' + settings[2] + '\t' + settings[3]); Writeln Writeln('...Program Completed'); End.