Mikroenigma

Napisać w asemblerze NASM program symulujący działanie maszyny szyfrującej mikroenigma. Tekst otwarty i szyfrogram zawierają tylko małe litery alfabetu angielskiego:

abcdefghijklmnopqrstuvwxyz

Maszyna składa się z trzech bębenków szyfrujących: lewego L, prawego R i odwracającego T. Bębenki L i R mogą się obracać i każdy z nich może znajdować się w jednej z 26 pozycji oznaczanych małymi literami alfabetu angielskiego. Bębenek T jest nieruchomy. Procesy szyfrowania i deszyfrowania są ze sobą zamienne. Maszyna zamienia tekst wejściowy na wyjściowy, wykonując ciąg permutacji. Jeśli bębenek L jest w pozycji l a bębenek R w pozycji r, to maszyna wykonuje permutację

Qr-1R-1Qr Ql-1L-1Ql T Ql-1LQl Qr-1RQr

gdzie L, R i T są wewnętrznymi permutacjami bębenków zdefiniowanymi następująco:

L = ajdksiruxblhwtmcqgznpyfvoe,
R = bdfhjlcprtxvznyeiwgakmusqo,
T = imetcgfraysqbzxwlhkdvupojn.

Permutacje Q dokonują cyklicznego przesunięcia liter. Przykładowo Qx zamienia a na x, b na y, c na z, d na a, itd. Qa jest permutacją identycznościową. Złożenie permutacji wykonuje się od prawej do lewej. P-1 oznacza permutację odwrotną do permutacji P.

Po zaszyfrowaniu każdej litery bębenek R obraca się o jedną literę, czyli jego pozycja zmienia się odpowiednio z a na b, z b na c, ..., z y na z, z z na a. Jeśli bębenek R osiągnie tzw. pozycję obrotową, to również bębenek L obraca się o jedną literę. Pozycje obrotowe to k, r, t. Przykładowy ciąg kolejnych pozycji bębenków:

yp, yq, zr, zs, at, au.

Kluczem szyfrowania jest para liter oznaczająca odpowiednio początkowe pozycje bębenków L i R.

Program powinien pobierać z linii poleceń jeden dwuliterowy argument, który jest kluczem szyfrowania. Program powinien czytać szyfrowany/deszyfrowany tekst ze standardowego wejścia, a wynik zapisywać na standardowe wyjście. Program powinien sprawdzać, czy podano poprawny klucz szyfrowania. Oprócz poprawności rozwiązania oceniana będzie jego optymalność. Czytanie i zapis powinno odbywać się w blokach, a nie znak po znaku. Oceniany będzie też styl. Tradycyjny styl polega na rozpoczynaniu etykiet od pierwszej kolumny, mnemoników od 9 kolumny, a listy argumentów od 17 kolumny. Program powinien być sensownie podzielony na procedury. Każda procedura powinna być opatrzona komanterzem, który powinien zawierać m.in. sposób przekazywania argumentów i wyników oraz opis modyfikowanych rejestrów.

Przykładowe trójki klucz, tekst jawny, tekst zaszyfrowany:

zjalamakotamapvkmbgy
cmarchitekturakomputerabaqlfpgbznygrzkbxfytb
xzprogramowanieniskopoziomowevqvosngjtzhgfpomnxgtszgofzl