Het Unix-command pwgen genereert wachtwoorden die specifiek ontworpen zijn om makkelijk door mensen te kunnen onthouden worden, terwijl ze toch zo veilig mogelijk zijn. Wachtwoorden die mensen kunnen onthouden, zullen nooit zo veilig zijn als volledig willekeurige wachtwoorden. Met name de wachtwoorden die door pwgen gegenereerd worden zonder de -s optie kunnen best niet gebruikt worden op plaatsen waar wachtwoorden via een offline brute-force aanval1 kunnen gekraakt worden. Aan de andere kant hebben mensen al snel de neiging om volledig willekeurig gegenereerde wachtwoorden op te schrijven, waardoor ze op die manier kunnen gecompromiteerd worden.

$ pwgen -y
sie%Qu7s Kuux"oh9 ohc9ahG% hoe8Toh: Eix*ohd1 doh:bo2U Cu0doo|t zo`L9xaW
fie5Du[h Phe8aid# Opu&fai5 ieZ<aek6 hu4ga&Di Oose}p1o aiD@oos2 nu-a1Fub
ahqu5To/ ahtie[H3 ioK&u5Ai nei1Za#d poo_Th9r gu|aGh7h uZ%io2ah IeNah&v7
eif\e8Ah Ieb,ing4 reph1oW* eeSh'ee8 Ah+ei4ai Oi0Ca,vu Esh1xe?e Wei&k4ic
ue5OhQu. aaf-i8uP eedae%T5 sei?M9Pu ieH[oh2l ieh~ah8A aev"oo9A Ohf"i8de
Foh:x2zi aLoo'qu2 Ia6aig-e La{vie1E IeFoh{c8 Au_h7Hee Se)f4ebi Cah$yu7m
Rae"Z2ot Loh%Cha2 gooP"ie2 ieY3sei* iepo>o5K Eiz1Thu: aeb$eX4e ae'Ch9ie
Yo1aiy:o ai3eX_on Dai>h5ah pak'uL4u bom`ae8D uP<eK9sh En+ee9ii sei<ph2C
ogahP.i5 eKae?f5e geph#i5I eiK2ied| Ais!ac2e Yoch1do\ hie6Ein. dee_n7Th
oe+Quie2 Ahd9xoh! xe2Cail- iF2Fa,Zi ahk1AhS^ loo0Aet@ moo6Yo`l jie6yeM}
chei2Bi" fai5Iqu[ Zie3oj/a ooYe_uy9 Fae8aib: ahB.ie1f veuC2er^ Vi\Qua2n
cahn9Ka- ieB*a4pu UXu0Be$d Ohx$o1oi Eech-iz7 ueM2zi[u Iu1awoo] chi9Az;u
Eis9aih` equ2iiF> ae]Z_uh7 ieS1oow$ sho{i6Re Eigai-Z5 Noom?i5a Vae$gai3
aib0ieT; do&oXah5 chu6uHu[ ieSh&ee5 Oo2yeem` Ixu8Ku.Y Xoh&h8ix di5Eich>
fu"a4Ale vu'h0Aem hah2Lo}s oH8johz? iaX2aeh% eec9Nei` Aa0thai~ oow2Shi[
OaXoo,x4 eeRi2aj< ohs=u9Ge Aez5tea& ce`f4aaV EiL5ong" Fo6ahy+o oogu$G9i
Hua7cah< Eh3oo/b% Tie%r0go Orae6ip| fe$F7euh euc>oh1O aeGua<y0 im|ol7eR
vu0Ohxa? ohCh8ne" coo.L5Oo ahJ^a%u5 oe9Chem] Loh=ch5a eeyai(W2 Ui.d0eeZ
iceZ^ai8 Uu[koa6z phaM"oo8 se=aCh7p yuS9xo+a ou(th9uG uko,ch7A aim8oa`K
oShu.m0i ko)e4Ea2 Giech#i0 Vae"dai3 eo2Yie[W tooT%o1o AiM3joh* Ne3thie[

Het pwgen-commando is ontworpen om zowel interactief als in shell scripts gebruikt te worden. Daarom verschilt het standaardgedrag naargelang standaarduitvoer een tty-apparaat2 of een pipeline3 is. Bij interactief gebruik zal pwgen een scherm met wachtwoorden weergeven, zodat de gebruiker een wachtwoord kan kiezen en vervolgens snel het scherm kan wissen. Dit voorkomt dat iemand kan schoudersurfen om het door de gebruiker gekozen wachtwoord te weten te komen.

Opgave

Elke regel van het tekstbestand passwords.txt4 is een patroon $$p \in \mathcal{P}$$. De verzameling $$\mathcal{P}$$ bestaat uit alle reeksen van één of meer wachtwoorden die telkens door één spatie van elkaar gescheiden zijn. Een wachtwoord is een opeenvolging van letters (zowel hoofdletters als kleine letters), cijfers en leestekens. Gevraagd wordt:

  1. Bepaal zo kort mogelijke reguliere expressies voor de volgende deelverzamelingen van $$\mathcal{P}$$:

    • $$\mathcal{P}_1 = \{\,p \in \mathcal{P}\,|\,$$als je enkel de kleine letters c, e, r, s en t overhoudt$$^{(*)}$$ dan spelt $$p$$ het woord secret$$\,\}$$

      (*) je schrapt met andere woorden in $$p$$ alle karakters die geen c, e, r, s of t zijn (dus ook de hoofdletters C, E, R, S en T)

      voorbeeld: 6W{Zsk0e ;fdS08KJ zMf2[6c1 CXy1HxEr 2pKuIyx= .5PeKak0 XgNK1M\V RtV-56zN $$\in \mathcal{P}_1$$
        P97VsiBl JOElD8Ii 7fmeJ<Gl JSl'6f2Z DdT932A. 17wYDGv( o9ceC8/3 K9tUn&7V
    • $$\mathcal{P}_2 = \{\,p \in \mathcal{P}\,|\,$$elk wachtwoord in $$p$$ bevat minstens één dubbelzinnig karakter$$\ ^{(*)}\,\}$$

      (*) de dubbelzinnige karakters zijn het cijfer 0, de hoofdletter O, het cijfer 1 en de hoofdletter L

      voorbeeld: 6hgtn9@L j}z4F1pd OBg1HL]w micszFR0 AubV16Bj nA0apk&g nX%Lebh8 ?1eWLJgn $$\in \mathcal{P}_2$$
        Ig2(kbYC 3K4p/w5G uvDUFeg9 vMZ1gbfx uETG6^87 5tjA96%y bDh-540H |uEQOf6v $$\not \in \mathcal{P}_2$$
    • $$\mathcal{P}_3 = \{\,p \in \mathcal{P}\,|\,$$er is een wachtwoord in $$p$$ dat begint en eindigt met dezelfde letter$$\ ^{(*)}\,\}$$

      (*) hierbij maken we geen onderscheid tussen hoofdletters en kleine letters

      voorbeeld: m38JZDLq HCgm7Btx KJhm%X6k KkO5AL(4 +yOkc1UI 2URGS)LN ch%yk6Ng IQe05]cr $$\in \mathcal{P}_3$$
        U0zQgjiP TlC5}PbN qY1L]epi AJmCO3(v 7I9GN^r4 KM:vL79h 5<ir9kcR xve:2d63 $$\not \in \mathcal{P}_3$$
    • $$\mathcal{P}_4 = \{\,p \in \mathcal{P}\,|\,$$twee opeenvolgende wachtwoorden in $$p$$ delen nooit eenzelfde karakter$$\,\}$$

      voorbeeld: 5ciw3GRd 2sYpKD:T x0OU7Irq #V5ueAF6 7aH;cJOo 1n8(tQwI ivopx2y0 ,69tGqR4 $$\in \mathcal{P}_4$$
        3tkYBP}T d7pzHbRA 7vJy}Bpw vNdzk1$y Curz6WKy %J6tAUW1 w3P21Md> qe0Cx:Yn $$\not \in \mathcal{P}_4$$

    Geef telkens een Unix commando waarin de reguliere expressie gebruikt wordt door een commando uit de grep familie om enkel de regels van het tekstbestand naar stdout te schrijven waarvan het patroon $$p$$ behoort tot $$\mathcal{P}_i\ (i = 1, 2, 3, 4)$$.

  2. Bepaal als volgt de woorden $$w_1\ w_2\ w_3\ w_4$$ van een geheime boodschap:

    • het woord $$w_1$$ is het eerste wachtwoord op de unieke regel waarvan $$p$$ behoort tot $$\mathcal{P}_1 \cap \mathcal{P}_2$$

    • het woord $$w_2$$ is het tweede wachtwoord op de unieke regel waarvan $$p$$ behoort tot $$ \mathcal{P}_2 \cap \mathcal{P}_3$$

    • het woord $$w_3$$ is het derde wachtwoord op de unieke regel waarvan $$p$$ behoort tot $$\mathcal{P}_3  \cap \mathcal{P}_4$$

    • het woord $$w_4$$ is het vierde wachtwoord op de unieke regel waarvan $$p$$ behoort tot $$\mathcal{P}_4 \cap \mathcal{P}_1$$

    Geef telkens een Unix commando waarin de reguliere expressies voor de verzamelingen $$\mathcal{P}_i\ (i = 1, 2, 3, 4)$$ gebruikt worden door commando's uit de grep familie om het woord $$w_j\ (j = 1, 2, 3, 4)$$ op te zoeken in het tekstbestand en uit te schrijven naar stdout. Hierbij is het niet toegelaten om het woord $$w_j$$ letterlijk uit te schrijven (bv. echo $$w_j$$).