# $Revision: 12415 $ # $Author: saulius $ # $Date: 2025-11-10 09:29:01 +0000 (Mon, 10 Nov 2025) $ Bloknoto šifro programa ======================= Saulius Gražulis Vilnius, 2025 m. SUSITARIMAI =========== Raktiniai žodžiai "TURI" (angl. "MUST"), "NEGALI" (angl. "MUST NOT"), "NETURI" (angl. "SHALL NOT"), "PRIVALO" (angl. "REQUIRED", "SHALL"), "TURĖTŲ" (angl. "SHOULD"), "NETURĖTŲ" (angl. "SHOULD NOT"), "REKOMENDUOJAMA" (angl. "RECOMMENDED"), "GALI" (angl. "MAY"), ir "NEPRIVALOMA(S)" (angl. "OPTIONAL") šiame tekste interpretuojami pagal atitinkamus apibrėžimus dokumente RFC 2119 [1]. PROGRAMA ======== Parašykite Perl arba Ada programavimo kalba programą, kuri realizuoja bloknoto šifro algoritmą (angl. "one-time-pad (OTP) cipher") Programa turi veikti šiuo metu palaikomose Debian, Ubuntu ir suderinamose sistemose. Programos vardas: otp-encrypt otp-decrypt Programos iškvietimas: otp-encrypt raktas.txt pranešimas.txt > šifrograma.txt otp-decrypt raktas.txt šifrograma.txt > pranešimas.txt PROGRAMOS FUNKCIJA ================== Programa turi pirmą argumentą – failą vardą; šiame faile turi būti atsitiktinis raktas, kurio kiekviena radė parodo, koks postūmis raidės kodui turi būri pritaikytas: "A" reiškia, kad postūmis bus 0, "B" reikškia, kad postūmis bus 1 ir t.t. Šifruojant, postūmis pridedamas prie kiekvinos atviro teksto raidės kodo abėcėlėje, abėcėlė traktuojant kaip raidžių žiedą; t.y. jei rakto simbolis yra "D", kas atitinka postūmį 3, tada pradinio teksto raidė "T" bus transformuojama į "W", o "Y" – į "B". Programa gali būti kviečiama dviem skirtingais vardais; jei ji kviešiama vardu 'otp-encrypt', tekstas turi būti užšifruojamas, jei vardu 'otp-decrypt' – tekstas turi būti dešifruojamas. Programa, panaudojusi rakto failą šifravimui, turi raktą pažymėti, pridėdama pirmą failo eilutę "# This key was already used for encryption". Toks rakto failas turi būti naudojamas tik dešifravimui, ir niekada – šifravimui. Programos palaikoma įvesties ir išvesties abėcėlė – didžiosios lotyniškos raidės. Naudojama ASCII koduotė. ĮVESTYS IR IŠVESTYS =================== Visi argumentai, kurie neprasideda brūkšneliu (defiso simboliu, '-') TURI būti interpretuojami kaip įvesties failų vardai. Programa PRIVALO skaityti ir apdoroti visus failus, kurių vardai nurodyti komandos eilutėje. Jei failo vardas yra sudarytas iš vienintelio brūkšnelio simbolio ('-'), programa, apdorodama šį failo vardą, PRIVALO skaityti iš STDIN (jei norime apdoroti failą failų sistemoje, kurio vardas iš tiesų yra vienas brūkšnelis, prie jo vardo galime pridėti darbinės direktorijos nuorodą, t.y. naudoti vardą „./-“). Jei nei vienas failo vardas komandinėje eilutėje nenurodytas, programa TURI skaityti savo įvestį iš STDIN. Savo rezultatus programa TURI rašyti į STDOUT. ĮVESTIS ======= Programa turi skaityti tekstą, parašytą didžiosiomis lotyniškos abėcėlės raidėmis. Įvesties tekstas (tiek pranešimo tekstas, tiek šifrograma) GALI būti suskirstytas simbolių grupėmis patogesniam skaitymui; Grupių atskyrimui GALI būti naudojami tarpo ir naujos eilutės simboliai. Šie tarpų simboliai ir naujos eilutės simboliai TURI būti ignoruojami. Pavyzdys: --------- YDNDU DVUBW DVODE DGLHQ MRBRI RJIPK RJCRS RUZVE IŠVESTIS ======== Programa turi išvesti užšifruotą tekstą didžiosiomis lotyniškos abėcėlės raidėmis. Išvesties tekstas TURĖTŲ būti suskirstytas grupėmis po 5 simbolius, ne daugiau kaip po 80 sumbolių eilutėje. Grupių atskyrimui REIKĖTŲ naudoti po vieną tarpo simbolį. Programa TURI gebėti skaityti savo sugeneruotus failus. Pavyzdys: --------- Toks pats, kaip ir įvesties failas. NEPRIVALOMI ARGUMENTAI (angl. Options) ====================================== Nėra. KLAIDŲ DIAGNOSTIKA ================== Programa GALI naudoti naudojamos programavimo sistemos diagnostikos galimybes. Galima naudoti Perl kalbos 'warn()' ir 'die()' paprogrames ten, kur jos tinka. Klaidų pranešimai TURĖTŲ pateikti mažų mažiausiai šią informaciją: -- programos, kuri nustatė klaidą, pavadinimą; -- failo, kuris buvo apdorojamas klaidos metu, vardą. Naudokite vardą "-" (kabutėse), arba vardą „STDIN“ (be kabučių), jei klaidos metu buvo apdorojamas STDIN (jei tinka); -- apdorojamo failo eilutės numerį ir apdorojamo simbolio poziciją eilutėje klaidos vietoje (jei tinka); -- trumpą (20–40 simbolių) įvesties teksto citatą, parodančią aptiktos klaidos vietą (jei tinka); -- trumpą bet informatyvų pranešimą apie tai, kokia yra klaidos priežastis ir kaip galima klaidą pataisyti. Šauktukų klaidų pranešimuose naudoti NEREIKIA. Aptinkamų klaidų klasės: -- Per trumas raktas duotam tekstui (ERROR); -- Bandoma raktą naudoti šifravimui antrą kartą (ERROR); -- Įvesties tekste sutinkami nepalaikomi simboliai (ERROR arba WARNING); PABAIGOS KODAS (angl. Exit Status) ================================== Programos pabaigos statusas turi būti toks: -- 0 – prgrama baigė davo darbą sėkmingai; -- 1 – įvestyje buvo nepalaikomi simboliai; -- 2 – per trumpas šifravimo ar dešifravimo raktas; -- 3 – bandoma raktą šifravimui panaudoti antrą kartą; APLINKOS KINTAMIEJI (angl. Environment Variables) ================================================= Nenaudojami. Nuorodos ======== 1. S. Bradner "Key words for use in RFCs to Indicate Requirement Levels", RFC 2119, URI: https://tools.ietf.org/html/rfc2119 Kolofonas ========= $Id: otp-šifravimo-programa.txt 12415 2025-11-10 09:29:01Z saulius $ $URL: file:///home/saulius/svn-repositories/paskaitos/VU/programavimo-metodologijos-pagrindai/u%C5%BEduotys-praktikai/otp-%C5%A1ifravimo-algoritmas/otp-%C5%A1ifravimo-programa.txt $