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:
zj | alamakota | mapvkmbgy |
cm | architekturakomputera | baqlfpgbznygrzkbxfytb |
xz | programowanieniskopoziomowe | vqvosngjtzhgfpomnxgtszgofzl |