Modelleren C Maran van Heesch (0762684) Myrte De Juncker (0773097) Biometrie Tussenverslag 4 april 2013
1
Summary
This paper will be in Dutch, but to give a global idea of what is in this paper, here is a summary. This project is about making a security program for passwords. If somebody hacked your password one will gain access to your accounts. We want to see if we can make a program that also looks at the way the password is typed. So person B would not gain access to an account that belongs to person A, if he types the password differently. There are some restrictions to this program. One has to type his own password in the same way every time. So if the user normally types with two hands, his access will probabaly be denied if he types with one hand all of a sudden. Also, the user has to use the same keyboard. In the beginning of this project we worked on receiving data. We wanted to know how long it took for a person to own a password. Therefore we choose 3 passwords: DeJuncker26011993, HKgfsft9673! and h=AvgTu)IN. We choose these passwords, because the first one is the name of one of the users. The user is used to typing this, so we hope there is a little variance in typing this password. The second password is a widely chosen password and the last password is considered strong. We typed these passwords often to see how long it took to really own the password. Therefore we saved the times between the keypresses and the times of how long it took to press one key. We also calculated the mean and variances of the times between keypresses. In paragraph 5 one can see some graphs we made for these data. One can see in these graphs that the password DeJuncker26011993 is owned after only 3 runs, probably because this is the name of the user. The password HKgfsft9673! took some time longer, but the last password h=AvgTu)IN is not yet owned by one of us. This is because this password is irregular, so it also takes a lot of time to type it constantly. We want to use the means and variances we now found to make a security program. This is something we will be working on in the next couple of weeks. We hope to achieve to making a working security program which we will test by asking other people to type the passwords too. So we can see how we have to make the restrictions in the program, so that person B does not gain access, but person A is not denied access to much.
2
Inhoudsopgave 1
Summary
2
2
Inleiding 2.1 Probleem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 4
3
Voorwaarden
4
4
Data verzamelen 4.1 Programma data verzamelen . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5 6
5
Data analyseren 5.1 Verwerken van de data . . . . . 5.2 Wachtwoorden ons eigen maken 5.2.1 DeJuncker26011993 . . 5.2.2 HKgfsft9673! . . . . . . 5.2.3 h=AvgTu)IN . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
7 7 9 9 11 13
6
Conclusie
15
7
Vooruitblik
15
A Key codes
16
B Programma om data te verzamelen
17
C Programma om data te verwerken
22
3
2 2.1
Inleiding Probleem
Tegenwoordig worden er veel wachtwoorden gebruikt. Wachtwoorden voor onder andere accounts op online webwinkels, voor webmailaccounts en voor internetbankieren heeft men bij bepaalde banken ook een wachtwoord nodig. Al deze wachtwoorden worden al door de computer zelf beveiligd. Maar wanneer iemand toch jouw wachtwoord heeft weten te achterhalen, kan deze persoon toch op al jouw accounts. Daarom is de vraag gesteld: Wat kan men nog meer doen om zijn wachtwoorden beter te beveiligen? Een wachtwoord zou extra beveiligd kunnen worden door te kijken naar de manier waarop het woord wordt ingetypt. Wanneer persoon A zijn wachtwoord altijd op een bepaald manier intypt kan een toegangsprogramma die manier van typen onthouden. Wanneer persoon B dat zelfde wachtwoord op een andere manier zou typen, dan kan dat toegangsprogramma ervoor kiezen om persoon B geen toegang te verlenen aan het desbetreffende account. Aan de andere kant wil persoon A wel altijd toegang hebben tot zijn account. Dat betekent dat het programma niet te vaak de toegang moet weigeren als de manier van intypen maar een klein beetje veranderd is. In dit paper wordt onderzocht hoe en onder welke omstandigheden deze extra beveiliging kan worden toegepast. Ook zal er gekeken worden naar het type wachtwoorden dat het beste door deze beveiligingsmethode beveiligd kunnen worden.
3
Voorwaarden
Om een werkend toegangsprogramma te schrijven moet er wel aan bepaalde voorwaarden voldaan zijn: Ten eerste moet de gebruiker van het programma zijn wachtwoord altijd op dezelfde manier intypen. Wanneer de gebruiker zijn wachtwoord intypt terwijl hij achter zijn bureau zit en beide handen vrij heeft om te typen, zal hij anders typen dan wanneer hij met een beker koffie in de hand even snel zijn wachtwoord typt. Daarom is het dus erg belangrijk om het wachtwoord altijd onder de zelfde omstandigheden wordt ingevoerd. Ten tweede is het toetsenbord wat gebruikt wordt van belang. Het toegangsprogramma werkt namelijk op toetsaanslagen. Wanneer een toetsenbord meerdere manieren heeft om bijvoorbeeld het cijfer 1 in te typen, moeten al dezen manieren ge¨ımplementeerd worden in het toegangsprogramma. Dit is het geval bij een toetsenbord met numpad en een toetsenbord zonder numpad. Om dit probleem te vermijden hebben we iedereen tijdens het verzamelen van de data op hetzelfde toetsenbord laten typen. Het toetsenbord waar wij gebruik van maken tijdens dit paper is het toetsenbord van de Lenovo ThinkPad W520. Verder hebben wij ook ons toegangsprogramma op dat toetsenbord gemaakt. Het gebruiken van hetzelfde toetsenbord is ook van belang voor het toegangsprogramma in de zin dat wanneer er niet steeds hetzelfde toetsenbord wordt gebruikt, het toegangsprogramma 4
geen regelmaat kan vinden in de manier waarop de gebruiker typt. Er kunnen dan twee dingen gebeuren. Ten eerste kan het zo zijn dat de gebruiker zijn manier van typen op een bepaald toetsenbord opslaat in het programma. Wanneer dit het geval is dan kan het zo zijn dat de gebruiker, wanneer hij een ander toetsenbord gebruikt, de toegang tot zijn eigen account geweigerd wordt. Dit is natuurlijk niet de bedoeling. Ten tweede kan het zo zijn dat de gebruiker twee of meerdere toetsenborden vaker gebruikt, en daarom het toegangsprogramma laat gelden op al zijn manieren van het wachtwoord typen. Hierdoor wordt de gebruiker niet meer geweigerd, maar daalt de veiligheid van het toegangsprogramma. Dit omdat er nu meerdere manieren zijn waarom de indringer kan typen om toch toegelaten te worden. Ten derde is de kwaliteit van het wachtwoord van belang. Het wachtwoord mag niet te eenvoudig zijn. Denk dan bijvoorbeeld aan woorden zonder hoofdletters en speciale tekens die men in het normale leven vaker gebruikt. Dit soort woorden zal iedereen redelijk vlot kunnen typen, waardoor er niet veel verschillen zullen optreden in de manier waarop men typt. Denk aan woorden als: boom, bloemetje en grasmaaier. Om te onderzoeken wat wel een goed wachtwoord is, of waar een wachtwoord aan moet voldoen, zullen we bij het verzamelen van data verschillende wachtwoorden testen. Wel zal een goed wachtwoord minstens een cijfer, een kleine letter, een hoofdletter en een speciaal teken bevatten. Dit zodat de verschillende manieren van hoofdletters maken getest kunnen worden en de tijd dat iemand Shift/Caps Lock inhoudt bepaald kan worden.
4
Data verzamelen
Om data te kunnen verzamelen zijn wij begonnen met het schrijven van een programma. Dit programma is te vinden in bijlage B en wordt beschreven in paragraaf 4.1. Vervolgens hebben we hebben wij 3 wachtwoorden gekozen om te testen. De wachtwoorden die wij gekozen hebben zijn: DeJuncker26011993, HKgfsft9673!, h=AvgTu)IN. Deze specifieke wachtwoorden hebben we om een aantal redenen gekozen. Het eerste wachtwoord: DeJuncker26011993 hebben we gekozen, omdat dit de naam is van e´ e´ n van de gebruikers. Een persoon zal zijn eigen naam namelijk veel vaker typen dan iemand anders. Daardoor zou de manier van intypen meer kunnen verschillen dan bij moeilijkere combinaties van letters. Het tweede wachtwoord is gekozen, omdat dit een redelijk standaard wachtwoord is. Veel mensen zetten cijfers in hun wachtwoord achteraan, denk bijvoorbeeld aan een geboortejaar of geboortedatum. Aangezien dit wachtwoord dus redelijk standaard is willen we kijken of ons programma dit kan beveiligen. Het derde wachtwoord hebben we van een wachtwoordgenerator. Dit zou een sterk wachtwoord zijn, dus daardoor willen we kijken of we dit goed kunnen beveiligen. In dit wachtwoord zitten veel verschillende symbolen en die staan ook door elkaar. Daardoor zou dit een sterk wachtwoord zijn.
5
De data die we tot nu toe verzameld hebben is van deze wachtwoorden die door de gebruiker ingetypt worden (wij zijn in dit verslag ook de gebruiker van het wachtwoord). Wij hebben de wachtwoorden vaak getypt, zodat we kunnen kijken of we een patroon kunnen herkennen uit de data die we verzameld hebben. De data die we verzameld hebben zijn de tussentijden tussen de verschillende karakters en de lengte van e´ e´ n toetsaanslag op zich. Daarnaast slaan we ook op welke tekens ingedrukt worden, zodat we het wachtwoord kunnen controleren. Het wachtwoord moet namelijk ten eerste goed ingetypt zijn, wil er een patroon inzitten die een programma kan herkennen.
4.1
Programma data verzamelen
Het programma is te vinden in bijlage B. In dit programma gebruiken we een JPasswordField, deze gebruiken we bijna helemaal zoals die in Java ge¨ımplementeerd zit, behalve dat we graag de focus op het PasswordField hebben staan. Dit passen we aan in de eerste klasse JPassWordFieldNew. Dit nieuwe PassWordField gebruiken we dan in de rest van het programma. In de klasse GraphicsPanel gaan we dan de daadwerkelijke data verzamelen. Ten eerste declareren we hiervoor een aantal ArrayLists, zoals IATCharactersP, CharactersP, IATCharactersR en CharactersR. Bij alle ArrayLists waar een P achter staat, kijken we naar het event Pressed. Dit dus wanneer een toets ingedrukt wordt. Bij ArrayLists met een R op het eind, kijken we naar het event Released. Bij alle ArrayLists die beginnen met IAT (InterArrivalTime) slaan we de tijd op van het event. Bij de andere ArrayLists slaan we op welke precieze toets ingedrukt wordt. Daarnaast maken we nog een scanner, printwriter en een file aan, zodat we de data ook opkunnen slaan. Dan gaan we kijken naar de void add(). In deze void slaan we de data uit de ArrayLists op in de file die we boven in het programma aangemaakt hebben. Dit doen we door met een for-loop de gehele ArrayList af te gaan en deze te printen in de file. Aan het einde van deze void, maken we de ArrayLists weer leeg, zodat er vaker dan 1 keer getypt kan worden tijdens dezelfde run van het programma. In de void paintComponent maken we de tekts aan die komt te verschijnen. Hierin staat een kleine uitleg van wat de bedoeling is en het woord dat getypt moet worden bijvoorbeeld. Dit hebben we vooral aangemaakt, zodat we dit programma ook kunnen gebruiken om data te verzamelen van andere mensen. Zo kunnen we testen hoevaak andere mensen het wachtwoord zouden kunnen hacken. Maar om dit te doen, wilden we wel dat het programma duidelijk was. De andere voids in deze klasse keyTyped, keyPresed en keyReleased zijn alledrie nodig, wanneer je een KeyListener implementeerd. Zelf gebruiken we alleen de voids keyPresed en keyReleased. In deze void maken we ook gebruik van een aantal booleans om te kijken of het wachtwoord 6
getypt wordt en of we de ArrayLists moeten opslaan bijvoorbeeld. De boolean guard gebruiken we om zeker te weten dat alleen het wachtwoord opgeslagen wordt. Als mensen per ongeluk tussendoor toetsen intypen, willen we niet dat deze opgeslagen worden. Daarvoor is de boolean guard. Als deze op true staat dan zijn mensen in het scherm van het typen van het wachtwoord. Zodra ze hier dan op enter drukken (keyCode = 10), wordt de guard terug op false gezet en worden de ArrayLists opgeslagen in de file. Als de boolean guard op false staat en mensen drukken dan op enter komen ze juist in het scherm dat ze het wachtwoord kunnen typen. Daardoor wordt hier dan guard op true gezet. En als laatste: als guard gelijk is aan true dan moeten de letters die op dat moment ingetypt worden opgeslagen worden in de ArrayLists. In de void keyReleased gebeurt grotendeels hetzelfde, alleen houden we hier geen rekening met enter. Hier kijken we dus alleen naar de boolean guard. Zodra deze op true staat moeten de tijden dat de toetsen losgelaten worden opgeslagen worden in de desbetreffende ArrayLists. In de laatste klasse van dit programma ModellerenC wordt alles bij elkaar gezet. Hier wordt bijvoorbeeld de KeyListener toegevoegd aan het frame.
5 5.1
Data analyseren Verwerken van de data
Voor het verwerken van de data die we verkregen hebben uit het testprogramma hebben wij een programma geschreven. Dit verwerkingsprogramma is te vinden in bijlage C. In dit programma beginen we met de data in te lezen. Dit doen we in de void matrix(). In deze void doen we niets anders dan de ArryaLists die we in het vorige programma in een file gezet hebben in dit programma weer in ArrayLists kopi¨eren. In de void wachtwoordControle() gaan we, zoals de naam al zegt, het wachtwoord controleren. Hiervoor staan er in het begin van dit programma drie maal een Array correctWachtwoord. Deze hebben we driemaal, omdat we drie verschillende wachtwoorden hebben. Deze Array is tweedimensionaal. In de eerste rij van deze Array staat opgeslagen wat de juiste karakters zijn die ingetypt zouden moeten worden en in de tweede rij staat aangegeven of er wel of geen Shift ingedrukt moet zijn bij dit karakter. Dit bijvoorbeeld als het een hoofdletter of een symbool is. Zodra het correcte wachtwoord opgeslagen staat, maken we een kopie van de twee ArrayLists ToetsaanslagenP en ToetsaanslagenR, dit doen we zodat de originele informatie niet verloren gaat. Daarna gaan we kijken naar het gebruik van Backspace. We laten namelijk wel toe dat iemand begint met een wachtwoord typen, daarna alles weghaalt met Backspace en opnieuw begint. Op deze manier zal het patroon namelijk niet verloren gegaan zijn. Maar aan de andere kant, zodra iemand maar e´ e´ n letter weghaalt, zal het programma geen patroon meer kunnen herkennen. 7
Dus deze wachtwoorden tellen we ook als fout. Dit bereiken we door alle karakters die voor Backspace staan weg te halen. Het programma controleert dadelijk toch alle karakters, dus als niet het hele wachtwoord is weggehaald, zal dit een fout wachtwoord opleveren. Daarna maken vullen we de Array ingetyptWachtwoord. Dit is een driedimensionale Array. In de eerste dimensie zal alleen opgeslagen worden welk wachtwoord van de 30 dit is. We vragen mensen namelijk om elk wachtwoord 30 keer in te typen. De andere twee dimensies zijn dezelfde als bij correctWachtwoord. Deze zullen dus ook overeen moeten komen wil het wachtwoord correct zijn. De tweede dimensie van ingetyptWachtwoord vullen is niet moeilijk, want we hebben opgeslagen wat er precies getypt is. Alleen de laatste dimensie opvullen (dus of er wel of geen Shift ingedrukt is) was lastiger. We hebben namelijk alleen de tijden Pressed en Released opgeslagen. We maken daarvoor de ArrayLists IntervallenShiftTijden en IntervallenShiftGebeurtenissen aan. In de eerste slaan we de Pressed en Released tijden op, waarbij een Shift of CapsLock is ingedrukt. In de tweede ArrayList slaan we op wat er vanaf dat moment gebeurt. Dus is Shift/CapsLock vanaf dit moment wel of niet ingedrukt. Om het daadwerkelijke wachtwoord te controleren hebben we de functie WachtwoordCorrect aangemaakt. Dit is gemakkelijker, want zodra er e´ e´ n karakter fout is, kun je meteen de boolean false teruggeven. In de void LengteToetsaanslagMatrices() maken we een matrix die de lengte opslaat van de tijd dat e´ e´ n toets wordt ingedrukt. Dit doen we alleen voor de correcte wachtwoorden. We doen dit tweemaal. E´en keer voor de gewone karakters en e´ e´ n keer voor de Shift of CapsLock. Daarna slaan we in de void TussentijdenMatrices() matrices op die de tussentijden bevatten tussen opeenvolgende karakters. Voor bijvoorbeeld de tussentijd tussen toets 1 en 2, kijken we naar de tijd dat toets 1 ingedrukt wordt en de tijd dat toets 2 ingedrukt wordt. In de volgende twee voids gemiddeldeTussentijden() en variatiesTussentijden() berekenen we de gemiddelden en variaties van alle tussentijden. We kijken hier dus naar alle 30 keer dat het wachtwoord ingetypt is en bereken dan het gemiddelde hiervan. Dit gemiddelde gebruiken we dan om de varianties te berekenen. In de void verhoudingen kijken we naar de verhoudingen van verschillende tussentijden. We hebben hier verder nog geen onderzoek naar gedaan, maar we hopen dat hier misschien ook een patroon inzit. Daarvoor zijn we begonnen aan de void vergelijkenVerhoudingen. Deze void is nog niet af, maar dit zullen we de komende tijd wel gaan verbeteren. In de op een na laatste void dataPrinten() zetten we de berekenden matrices en gemiddelden weer in een file. Zodat we deze later makkelijk kunnen opvragen. Daarna wordt alles na elkaar gezet in de void run(). De data verkregen uit dit programma hebben we vervolgens gebruikt om te kijken hoe we de wachtwoorden ons eigen hebben gemaakt. 8
5.2
Wachtwoorden ons eigen maken
Wij hebben ieder e´ e´ n of twee van de wachtwoorden ons eigen gemaakt. Myrte heeft de wachtwoorden DeJuncker26011993 en HKgfsft9673! haar eigen gemaakt. Maran heeft het wachtwoord h=AvgTu)IN haar eigen gemaakt. Wij hebben ieder het wachtwoord getypt in runs van 30 keer. In de onderstaande grafieken is gekeken naar het gemiddelde en de variantie van de tussentijden. Een tussentijd is gedefinieerd als het verschil tussen de tijd van het indrukken van een karakter en het indrukken van het volgende karakter. 5.2.1
DeJuncker26011993
Figuur 1: gemiddelde tussentijd per run, wachtwoord DeJuncker26011993
Zoals men kan zien in 1, is het wachtwoord DeJuncker26011993 zeer constant getypt. Een verklaring hiervoor is dat Myrte haar naam al wel vaker heeft getypt, en hierop dus niet veel meer hoefde te oefenen. Ook zie je een piek in de gemiddelde tussentijd bij de overgang van letters naar cijfers. Dit is verklaarbaar omdat je dan op een ander deel van het toetsenbord (de 9
bovenkant) moet gaan typen. Je moet zelf dus even omschakelen, en dat kost tijd.
Figuur 2: variantie van de tussentijden per run, wachtwoord DeJuncker26011993
In figuur 2 is te zien dat er twee pieken zijn. E´en op de plek waar en eerst een kleine letter en vervolgens een hoofdletter getypt moet worden. Dit is de lettercombinatie eJ. De tweede piek is te zien bij de omschakeling van letters naar cijfers. Verder ziet men dat er tijdens het typen gewenning optreed. Dit is te zien tijdens het typen van de letters en tijdens het typen van de cijfers. De variantie is namelijk een dalende lijn. Wel is de variantie redelijk constant. Dat is erg prettig wanneer we daadwerkelijk het beveiligingsprogramma gaan schrijven, en de voorwaarden waar aan voldaan moeten worden gaan bepalen. Dit wachtwoord is door Myrte eigen gemaakt in 3 runs. Dit staat gelijk aan het wachtwoord 90 keer typen. 10
5.2.2
HKgfsft9673!
Figuur 3: gemiddelde tussentijd per run, wachtwoord HKgfsft9673!
Zoals men kan zien in figuur 3 was HKgfsft9673! moeilijker eigen te maken voor Myrte. De gemiddelde tussentijden zijn steeds een klein beetje verschillend. Wel is het zo dat Myrte niet steeds sneller is gaan typen. Een deel van de grafiek van run 8 ligt namelijk onder alle andere grafieken. Hetzelfde geld voor de grafiek van run 11. Dit terwijl run 12 de laatste run was. Verder had Myrte geen moeite met bepaalde lettercombinaties. Ook ziet men in figuur 3 weer dat er tijdens het typen weer gewenning optreed. Dit ziet men omdat de gemiddelde tussentijden dalen.
11
Figuur 4: variantie van de tussentijden per run, wachtwoord HKgfsft9673!
Figuur 4 laat zien dat Myrte wel moest wennen aan dit wachtwoord. Dit omdat de variantie in het begin niet constant was. Vanaf run 7, run 8 ziet men dat de variantie pas redelijk constant is. In de variantie kan men verder zien dat Myrte minder constant is in de lettercombinatie Kg. Dit omdat de variantie hier namelijk hoger is dan bij de rest van de combinaties. Het koste Myrte ongeveer 8 runs om het wachtwoord eigen te maken. Dit staat gelijk aan het wachtwoord 240 keer typen.
12
5.2.3
h=AvgTu)IN
Figuur 5: gemiddelde tussentijd per run, wachtwoord h=AvgTu)IN
Zoals men kan zien typt Maran niet zo constant als Myrte. Dit is te zien in figuur 5, de grafieken lopen namelijk niet gelijk. Het wachtwoord is waarschijnlijk nog niet helemaal eigen. Wel is te zien dat ook Maran in het begin van het wachtwoord wat langzamer typt, en dus ook opstart problemen heeft.
13
Figuur 6: variantie van de tussentijden per run, wachtwoord h=AvgTu)IN
In figuur 6 is te zien dat Maran niet constant is met het typen van Av en Tu, dus met de overgang van hoofdletter naar kleine letter. Hier is namelijk de variantie erg hoog. Wel gaan de lettercombinaties vg, )I en IN erg constant. Dit is zo omdat deze lettercombinaties erg makkelijk op het toetsenbord liggen. Deze liggen namelijk in een rechte lijn. Het wachtwoord h=AvgTu)IN is waarschijnlijk nog niet eigen. Want waarschijnlijk kan Maran nog wel wat constanter typen. Dit wachtwoord moet waarschijnlijk nog 5 a 10 runs meer geoefend worden. Opmerkelijk is dat Myrte veel sneller typt dan Maran. Want in de figuren is te zien dat de grafieken van Myrte veel lager beginnen dan bij die van Maran. Een verklaring hiervoor is dat Myrte een typecursus heeft gedaan.
14
6
Conclusie
Men kan zien in de grafieken dat het heel erg ligt aan de verschillende wachtwoorden hoe lang het duurt voordat een wachtwoord eigen is gemaakt. Het wachtwoord DeJuncker26011993 is door Myrte al eigen gemaakt in 3 runs, terwijl Maran meer dan 13 runs nodig heeft voor het wachtwoord h=AvgTu)IN. Men kan wel zien in alle grafieken dat de gemiddelden dicht bij elkaar liggen, zo kunnen we deze data gebruiken om een beveilingsprogramma te schrijven. We zijn daar momenteel mee bezig, maar deze is nog niet af. Dit wordt verder besproken in paragraaf 7.
7
Vooruitblik
Komend kwartiel wordt er natuurlijk verder gewerkt aan het project. Ten eerste willen wij het beveiligingsprogramma schrijven. Dus een programma dat persoon B laat weten of hij toegang krijgt tot de account van persoon A, wanneer het originele wachtwoord van persoon A is. Wij willen dit programma goed kunnen afstellen, dat wil zeggen dat we de eisen die wij stellen aan het wachtwoord voordat het wordt goedgekeurd zo strak mogelijk willen hebben. Dit gaan wij doen aan de hand de gegevens van de ons eigen gemaakte wachtwoorden. Ook willen wij elkaars wachtwoord eigen gaan maken. Dit zodat we de gegevens kunnen vergelijken. Waarschijnlijk kunnen wij aan de hand van de gegevens inzien wat ieder heeft voor unieke type-eigenschap heeft. Ook deze eigenschap willen wij dan in het beveiligingsprogramma implementeren. Vervolgens gaan wij testdata verzamelen. Dit gaan wij doen met behulp het programma om data te verzamelen. Wij gaan mensen vragen de wachtwoorden ook te typen, we laten de mensen vragen een run van 30 keer te typen. Met deze data gaan we onderzoeken hoe goed ons beveiligingsprogramma dan is. Dit door simpelweg te proberen of de verschillende mensen zouden worden toegelaten in de accounts van Myrte of van Maran.
15
A
Key codes
Code cijfers 48 t/m 57 letters 65 t/m 90 Shift 16 CapsLk 20 Speciale tekens ← 37 ↑ 38 → 39 ↓ 40 [ 91 ] 93 \ 92 / 47 . 46 , 44 ; 59 45 = 61 ‘ 128 spatie 32 Enter 10 Ctrl 17 Alt 18 Esc 27 Delete 127 Backspace 8
16
B
Programma om data te verzamelen
package m o d e l l e r e n c ; import import import import import
j a v a . awt . ∗ ; j a v a . awt . e v e n t . ∗ ; java . u t i l .∗; j a v a x . swing . ∗ ; java . io . ∗ ;
/∗∗ ∗ M y r t e De J u n c k e r s 1 1 2 9 5 9 ∗ Maran van Heesch s 1 0 6 1 1 7 ∗/ / / c l a s s z o d a t e r m e t e e n g e f o c u s e d w o r d t op h e t p a s s w o r d f i e l d c l a s s JPasswordFieldNew extends JPasswordField { JPasswordFieldNew ( i n t t ) { super ( t ) ; } @Override public void s e t V i s i b l e ( boolean value ) { super . s e t V i s i b l e ( v a l u e ) ; i f ( value ) { t h i s . requestFocusInWindow ( ) ; } } } c l a s s G r a p h i c s P a n e l e x t e n d s J P a n e l implements K e y L i s t e n e r { / / aanmaken v a r i a b e l e n p r i v a t e s t a t i c S t r i n g OK = ” ok ” ; A r r a y L i s t
I A T C h a r a c t e r s P ; / / h o u d t de t i j d e n b i j d a t j e e e n l e t t e r o f e e n c i j f e r i n d r u k t A r r a y L i s t C h a r a c t e r s P ; / / h o u d t b i j w e l k e l e t t e r s en c i j f e r s j e i n t y p t A r r a y L i s t I A T S h i f t P ; / / h o u d t de t i j d e n b i j d a t j e s h i f t / CapsLk i n d r u k t A r r a y L i s t S h i f t P ; / / h o u d t b i j w e l k e s h i f t / CapsLk j e i n t y p t A r r a y L i s t IATSymbolsP ; / / h o u d t de t i j d e n b i j d a t j e e e n s p e c i a a l t e k e n i n d r u k t A r r a y L i s t SymbolsP ; / / h o u d t b i j w e l k e s p e c i a l e t e k e n s j e i n t y p t A r r a y L i s t I A T C h a r a c t e r s R ; / / h o u d t de t i j d e n b i j d a t j e e e n l e t t e r o f e e n c i j f e r l o s l a a t A r r a y L i s t C h a r a c t e r s R ; / / h o u d t b i j w e l k e l e t t e r s en c i j f e r s j e l o s l a a t A r r a y L i s t I A T S h i f t R ; / / h o u d t de t i j d e n b i j d a t j e s h i f t / CapsLk l o s l a a t A r r a y L i s t S h i f t R ; / / h o u d t b i j w e l k e s h i f t / CapsLk j e l o s l a a t A r r a y L i s t IATSymbolsR ; / / h o u d t de t i j d e n b i j d a t j e e e n s p e c i a a l t e k e n l o s l a a t A r r a y L i s t SymbolsR ; / / h o u d t b i j w e l k e s p e c i a l e t e k e n s j e l o s l a a t b o o l e a n g u a r d = f a l s e ; / / a l s g u a r d t r u e ; e r w o r d t o n t h o u d e n wat men t y p t boolean s t a r t = true ; / / beginscherm tonen p u b l i c s t a t i c i n t AANTAL KEER TYPEN = 3 0 ; / / a a n g e v e n h o e v a a k men h e t wachtwoord moet h e r h a l e n i n t t e l l e r = AANTAL KEER TYPEN ; / / t e l l e n hoe v a a k wachtwoord r e e d s g e t y p t / / S t r i n g PASSWORD = ” D e J u n c k e r 2 6 0 1 1 9 9 3 ” ; / / h e t t e t y p e n wachtwoord S t r i n g PASSWORD = ” H K g f s f t 9 6 7 3 ! ” ; J P a s s w o r d F i e l d N e w t e k s t v a k ; / / opmaak JFrame f r a m e ; / / opmaak S c a n n e r s c ; / / s c a n n e r aanmaken S t r i n g f i l e n a m e ; / / hoe de t e maken f i l e g a a t h e t e n F i l e f ; / / f i l e d a t o p g e s l a g e n g a a t worden P r i n t W r i t e r pw ; / / p r i n t w r i t e r aanmaken i n t A a n t a l R u n s = 0 ; / / t e l l e n hoe v a a k wachtwoord r e e d s g e t y p t G r a p h i c s P a n e l ( J P a s s w o r d F i e l d N e w t e k s t v a k , JFrame f r a m e ) { t h i s . t e k s t v a k = t e k s t v a k ; / / k o p p e l e n t e k s t v l a k aan g r a p h i c s p a n e l t h i s . f r a m e = f r a m e ; / / k o p p e l e n f r a m e aan g r a p h i c s p a n e l
17
/ / aanmaken a r r a y l i s t s I A T C h a r a c t e r s P = new A r r a y L i s t ( ) ; C h a r a c t e r s P = new A r r a y L i s t ( ) ; I A T S h i f t P = new A r r a y L i s t ( ) ; S h i f t P = new A r r a y L i s t ( ) ; IATSymbolsP = new A r r a y L i s t ( ) ; SymbolsP = new A r r a y L i s t ( ) ; I A T C h a r a c t e r s R = new A r r a y L i s t ( ) ; C h a r a c t e r s R = new A r r a y L i s t ( ) ; I A T S h i f t R = new A r r a y L i s t ( ) ; S h i f t R = new A r r a y L i s t ( ) ; IATSymbolsR = new A r r a y L i s t ( ) ; SymbolsR = new A r r a y L i s t ( ) ; s c = new S c a n n e r ( System . i n ) ; / / s c a n n e r aanmaken f i l e n a m e = ” d a t a ” + System . c u r r e n t T i m e M i l l i s ( ) + ” . t x t ” ; / / f i l e n a m e v a s t s t e l l e n f = new F i l e ( f i l e n a m e ) ; / / f i l e aanmaken / / standaard nodig try { pw = new P r i n t W r i t e r ( f ) ; } c a t c h ( F i l e N o t F o u n d E x c e p t i o n ex ) { System . e r r . p r i n t ( ” F i l e ” + f i l e n a m e + ” c o u l d n o t be f o u n d . ” ) ; } } p u b l i c v o i d add ( ) { / / a l l e i n f o r m a t i e opslaan i n een . t x t A a n t a l R u n s ++; pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” Run ” + A a n t a l R u n s ) ;
file
pw . p r i n t l n ( ” I A T C h a r a c t e r s P : ” ) ; f o r ( i n t i = 0 ; i < I A T C h a r a c t e r s P . s i z e ( ) ; i ++) { pw . p r i n t ( I A T C h a r a c t e r s P . g e t ( i ) + ” , ” ) ; } pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” C h a r a c t e r s P : ” ) ; f o r ( i n t i = 0 ; i < C h a r a c t e r s P . s i z e ( ) ; i ++) { pw . p r i n t ( C h a r a c t e r s P . g e t ( i ) + ” , ” ) ; } pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” I A T S h i f t P : ” ) ; f o r ( i n t i = 0 ; i < I A T S h i f t P . s i z e ( ) ; i ++) { pw . p r i n t ( I A T S h i f t P . g e t ( i ) + ” , ” ) ; } pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” S h i f t P : ” ) ; f o r ( i n t i = 0 ; i < S h i f t P . s i z e ( ) ; i ++) { pw . p r i n t ( S h i f t P . g e t ( i ) + ” , ” ) ; } pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” I A T C h a r a c t e r s R : ” ) ; f o r ( i n t i = 0 ; i < I A T C h a r a c t e r s R . s i z e ( ) ; i ++) { pw . p r i n t ( I A T C h a r a c t e r s R . g e t ( i ) + ” , ” ) ; } pw . p r i n t l n ( ) ;
18
pw . p r i n t l n ( ” C h a r a c t e r s R : ” ) ; f o r ( i n t i = 0 ; i < C h a r a c t e r s R . s i z e ( ) ; i ++) { pw . p r i n t ( C h a r a c t e r s R . g e t ( i ) + ” , ” ) ; } pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” I A T S h i f t R : ” ) ; f o r ( i n t i = 0 ; i < I A T S h i f t R . s i z e ( ) ; i ++) { pw . p r i n t ( I A T S h i f t R . g e t ( i ) + ” , ” ) ; } pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” S h i f t R : ” ) ; f o r ( i n t i = 0 ; i < S h i f t R . s i z e ( ) ; i ++) { pw . p r i n t ( S h i f t R . g e t ( i ) + ” , ” ) ; } pw . p r i n t l n ( ) ; I A T C h a r a c t e r s P . c l e a r ( ) ; / / l e g e n van a l l e a r r a y l i s t s , n o d i g v o o r v o l g e n d e r u n programma CharactersP . clear ( ) ; IATShiftP . c l e a r ( ) ; ShiftP . clear ( ) ; // IATSymbolsP . c l e a r ( ) ; // SymbolsP . c l e a r ( ) ; IATCharactersR . c l e a r ( ) ; CharactersR . clear ( ) ; IATShiftR . c l e a r ( ) ; ShiftR . clear ( ) ; // IATSymbolsR . c l e a r ( ) ; // SymbolsR . c l e a r ( ) ; } @Override public void paintComponent ( Graphics g ) { super . paintComponent ( g ) ; F o n t f = new F o n t ( ”VERDANA” , F o n t . PLAIN , 2 0 ) ; / / i n s t e l l i n g e n goed z e t t e n F o n t b o l d = new F o n t ( ”VERDANA” , F o n t . BOLD, 2 0 ) ; g . setFont ( f ); F o n t M e t r i c s fm ; fm = g . g e t F o n t M e t r i c s ( ) ; t e k s t v a k . setBounds ( t h i s . getWidth ( ) / 2 − 150 , t h i s . g e t H e i g h t ( ) / 2 − 10 , 300 , 2 0 ) ; i f ( s t a r t ) { / / s t a r t s c h e r m van t e s t l a t e n z i e n , opbouwen van s t a e t s c h e r m i n t x = fm . s t r i n g W i d t h ( ” I n d e z e t e s t w i l l e n we u v r a g e n om e e n a a n t a l woorden ” + AANTAL KEER TYPEN + ” k e e r a c h t e r e l k a a r t e t y p e n . ” ) ; g . d r a w S t r i n g ( ” I n d e z e t e s t w i l l e n we u v r a g e n om e e n a a n t a l woorden ” + AANTAL KEER TYPEN + ” k e e r a c h t e r e l k a a r t e t y p e n . ” , ( t h i s . g e t W i d t h ( ) − x ) / 2 , t h i s . g e t H e i g h t ( ) / 2 − 5 ∗ fm . g e t H e i g h t ( ) ) ; x = fm . s t r i n g W i d t h ( ” Boven i n h e t s c h e r m s t a a t h e t woord d a t u moet t y p e n . ” ) ; g . d r a w S t r i n g ( ” Boven i n h e t s c h e r m s t a a t h e t woord d a t u moet t y p e n . ” , ( t h i s . g e t W i d t h ( ) − x ) / 2 , t h i s . g e t H e i g h t ( ) / 2 − 3 ∗ fm . g e t H e i g h t ( ) ) ; x = fm . s t r i n g W i d t h ( ” D a a r o n d e r s t a a t hoe v a a k u h e t woord nog moet t y p e n . ” ) ; g . d r a w S t r i n g ( ” D a a r o n d e r s t a a t hoe v a a k u h e t woord nog moet t y p e n . ” , ( t h i s . g e t W i d t h ( ) − x ) / 2 , t h i s . g e t H e i g h t ( ) / 2 − fm . g e t H e i g h t ( ) ) ; x = fm . s t r i n g W i d t h ( ” Druk na e l k woord op ’ e n t e r ’ om a a n t e g e v e n d a t u h e t ” + ” woord g e t y p t h e b t . ” ) ; g . d r a w S t r i n g ( ” Druk na e l k woord op ’ e n t e r ’ om a a n t e g e v e n d a t u h e t woord g e t y p t ” + ” h e b t . ” , ( t h i s . g e t W i d t h ( ) − x ) / 2 , t h i s . g e t H e i g h t ( ) / 2 + fm . g e t H e i g h t ( ) ) ; x = fm . s t r i n g W i d t h ( ” Druk op ’ e n t e r ’ om t e b e g i n n e n . ” ) ; g . d r a w S t r i n g ( ” Druk op ’ e n t e r ’ om t e b e g i n n e n . ” , ( t h i s . g e t W i d t h ( ) − x ) / 2 , t h i s . g e t H e i g h t ( ) / 2 + 5 ∗ fm . g e t H e i g h t ( ) ) ;
19
tekstvak . setVisible ( false );
/ / t e k s t v l a k i s h i e r nog n i e t n o d i g
} i f ( t e l l e r <= 0 ) { / / na 30 k e e r t y p e n ; b e d a n k s c h e r m pw . c l o s e ( ) ; i n t x = fm . s t r i n g W i d t h ( ” B e d a n k t v o o r h e t meewerken ! ” ) ; g . d r a w S t r i n g ( ” B e d a n k t v o o r h e t meewerken ! ” , ( t h i s . g e t W i d t h ( ) − x ) / 2 , ( this . getHeight () / 2 ) ) ; t e k s t v a k . s e t V i s i b l e ( f a l s e ) ; / / t e k s t v l a k , waar men z e l f kan t y p e n w o r d t weg g e h a a l d } i f ( ! g u a r d && ! s t a r t && t e l l e r > 0 ) { / / wanneer men n e t k l a a r i s met h e t t y p e n van wachtwoord t e k s t v a k . s e t V i s i b l e ( f a l s e ) ; / / t e k s t v l a k even n i e t nodig i n t x = fm . s t r i n g W i d t h ( ”U moet h e t woord nog ” + t e l l e r + ” k e e r t y p e n . ” ) ; g . d r a w S t r i n g ( ”U moet h e t woord nog ” + t e l l e r + ” k e e r t y p e n . ” , ( t h i s . g e t W i d t h ( ) − x ) / 2 , t h i s . g e t H e i g h t ( ) / 2 − fm . g e t H e i g h t ( ) ) ; x = fm . s t r i n g W i d t h ( ” Druk op ’ e n t e r ’ om t e b e g i n n e n met t y p e n . ” ) ; g . d r a w S t r i n g ( ” Druk op ’ e n t e r ’ om t e b e g i n n e n met t y p e n . ” , ( t h i s . g e t W i d t h ( ) − x ) / 2 , t h i s . g e t H e i g h t ( ) / 2 + fm . g e t H e i g h t ( ) ) ; } i f ( g u a r d && ! s t a r t && t e l l e r > 0 ) { / / wanneer e r e e n wachtwoord g e t y p t g a a t worden t e k s t v a k . s e t V i s i b l e ( true ) ; / / t e k s t v l a k tonen i n t x = fm . s t r i n g W i d t h ( ” Typ h e t v o l g e n d e woord ” ) ; g . d r a w S t r i n g ( ” Typ h e t v o l g e n d e woord ” , ( t h i s . g e t W i d t h ( ) − x ) / 2 , t h i s . g e t H e i g h t ( ) / 2 − 4 ∗ fm . g e t H e i g h t ( ) ) ; g . setFont ( bold ) ; x = fm . s t r i n g W i d t h (PASSWORD ) ; g . d r a w S t r i n g (PASSWORD, ( t h i s . g e t W i d t h ( ) − x ) / 2 , t h i s . g e t H e i g h t ( ) / 2 − fm . g e t H e i g h t ( ) ) ; / / t o n e n w e l k wachtwoord e r g e t y p t moet worden g . setFont ( f );
/ / a l s k l a a r met t y p e n x = fm . s t r i n g W i d t h ( ” Druk op ’ e n t e r ’ a l s u h e t woord g e t y p t h e b t ” ) ; g . d r a w S t r i n g ( ” Druk op ’ e n t e r ’ a l s u h e t woord g e t y p t h e b t ” , ( t h i s . g e t W i d t h ( ) − x ) / 2 , t h i s . g e t H e i g h t ( ) / 2 + 2 ∗ fm . g e t H e i g h t ( ) ) ; } } @Override p u b l i c v o i d keyTyped ( KeyEvent e ) { / / s t a n d a a r d n o d i g } @Override p u b l i c v o i d k e y P r e s s e d ( KeyEvent e ) { / / Wanneer e e n k e y w o r d t i n g e d r u k t w o r d t e r g e k e k e n van w e l k e a a r d de t o e t s i s . / / Dan w o r d t e r i n de b i j b e h o r e n d e a r r a y l i s t s de c o d e van de t o e t s o p g e s l a g e n / / en de t i j d , i n m i l i s e c o n d e n , wanneer de t o e t s i s i n g e d r u k t i f ( g u a r d && e . getKeyCode ( ) == 1 0 ) { start = false ; guard = f a l s e ; add ( ) ; t e l l e r −−; repaint (); frame . s e t F o c u s a b l e ( true ) ; } e l s e i f ( ! g u a r d && e . getKeyCode ( ) == 1 0 ) { start = false ; guard = true ; repaint (); tekstvak . setText ( ”” ); } e l s e i f ( guard ) { i f ( e . getKeyCode ( ) == 16 | | e . getKeyCode ( ) == 2 0 ) {
20
S h i f t P . add ( e . getKeyCode ( ) ) ; I A T S h i f t P . add ( System . c u r r e n t T i m e M i l l i s ( ) ) ; // System . out . p r i n t l n ( e . getKeyCode ( ) ) ; // System . out . p r i n t l n ( System . c u r r e n t T i m e M i l l i s ( ) ) ; } else { C h a r a c t e r s P . add ( e . getKeyCode ( ) ) ; I A T C h a r a c t e r s P . add ( System . c u r r e n t T i m e M i l l i s ( ) ) ; / / System . out . p r i n t l n ( e . getKeyCode ( ) ) ; // System . out . p r i n t l n ( System . c u r r e n t T i m e M i l l i s ( ) ) ; } } } @Override p u b l i c v o i d k e y R e l e a s e d ( KeyEvent e ) { / / Wanneer e e n k e y w o r d t l o s g e l a t e n w o r d t e r g e k e k e n van w e l k e a a r d de t o e t s i s . / / Dan w o r d t e r i n de b i j b e h o r e n d e a r r a y l i s t s de c o d e van de t o e t s o p g e s l a g e n / / en de t i j d , i n m i l i s e c o n d e n , wanneer de t o e t s i s i n g e d r u k t i f ( e . getKeyCode ( ) == 1 0 ) { } e l s e i f ( guard ) { i f ( e . getKeyCode ( ) == 16 | | e . g e t K e y C h a r ( ) == 2 0 ) { S h i f t R . add ( e . getKeyCode ( ) ) ; I A T S h i f t R . add ( System . c u r r e n t T i m e M i l l i s ( ) ) ; // System . out . p r i n t l n ( e . getKeyCode ( ) ) ; // System . out . p r i n t l n ( System . c u r r e n t T i m e M i l l i s ( ) ) ; } else { C h a r a c t e r s R . add ( e . getKeyCode ( ) ) ; I A T C h a r a c t e r s R . add ( System . c u r r e n t T i m e M i l l i s ( ) ) ; // System . out . p r i n t l n ( e . getKeyCode ( ) ) ; // System . out . p r i n t l n ( System . c u r r e n t T i m e M i l l i s ( ) ) ; } } } } public c l a s s ModellerenC { JFrame f r a m e ; GraphicsPanel graphicsPanel ; JButton button ; JPasswordFieldNew t e k s t v a k ; ModellerenC ( ) { f r a m e = new JFrame ( ” W a c h t w o o r d b e v e i l i g i n g ” ) ; / / Aanmaken van h e t f r a m e t e k s t v a k = new J P a s s w o r d F i e l d N e w ( 3 0 ) ; g r a p h i c s P a n e l = new G r a p h i c s P a n e l ( t e k s t v a k , f r a m e ) ; / / Aanmaken van h e t g r a p h i c s p a n e l graphicsPanel . setLayout ( null ) ; g r a p h i c s P a n e l . add ( t e k s t v a k ) ; tekstvak . setVisible ( false ); f r a m e . s e t S i z e ( 1 0 0 0 , 6 0 0 ) ; / / Frame i n s t e l l i n g e n i n s t e l l e n f r a m e . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE ) ; f r a m e . add ( g r a p h i c s P a n e l ) ; / / G r a p h i c s p a n e l t o e v o e g e n aan f r a m e t e k s t v a k . a d d K e y L i s t e n e r ( g r a p h i c s P a n e l ) ; / / K e y L i s t e n e r t o e v o e g e n aan f r a m e frame . addKeyListener ( g r a p h i c s P a n e l ) ; gr ap hi csP an el . setBackground ( Color . white ) ; frame . s e t V i s i b l e ( true ) ; } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new M o d e l l e r e n C ( ) ; }
21
}
C
Programma om data te verwerken
package m o d e l l e r e n c ; import j a v a . u t i l . S c a n n e r ; import j a v a . i o . ∗ ; import j a v a . u t i l . A r r a y L i s t ; public class DataInlezen { Scanner sc ; String filename ; File f ; File F; P r i n t W r i t e r pw ; A r r a y L i s t [] T i j d e n P r e s s e d ; A r r a y L i s t [] T o e t s a a n s l a g e n P ; A r r a y L i s t [] T i j d e n S h i f t P r e s s e d ; A r r a y L i s t [] S h i f t P r e s s e d ; A r r a y L i s t [] T i j d e n R e l e a s e d ; A r r a y L i s t [] T o e t s a a n s l a g e n R ; A r r a y L i s t [] T i j d e n S h i f t R e l e a s e d ; A r r a y L i s t [] S h i f t R e l e a s e d ; int n = 0; i n t aantalWachtwoorden = 0; A r r a y L i s t [] L e n g t e T o e t s a a n s l a g ; A r r a y L i s t [] L e n g t e T o e t s a a n s l a g S h i f t ; A r r a y L i s t [] T u s s e n t i j d e n ; A r r a y L i s t [] T u s s e n t i j d e n V e r h o u d i n g e n ; A r r a y L i s t [] I n t e r v a l l e n S h i f t T i j d e n ; A r r a y L i s t [] I n t e r v a l l e n S h i f t G e b e u r t e n i s s e n ; int ingetyptWachtwoord [ ] [ ] [ ] ; int [ ] [ ] correctWachtwoord ; i n t e e r s t e C o r r e c t = −1; / / De k a n s d a t e r g e e n c o r r e c t e i n z i t t e n i n 30 k e e r i s h e e l k l e i n long [ ] gemiddelden ; double [ ] v a r i a n t i e s ; DataInlezen () { T i j d e n P r e s s e d = new A r r a y L i s t [ 3 0 ] ; T o e t s a a n s l a g e n P = new A r r a y L i s t [ 3 0 ] ; T i j d e n S h i f t P r e s s e d = new A r r a y L i s t [ 3 0 ] ; S h i f t P r e s s e d = new A r r a y L i s t [ 3 0 ] ; T i j d e n R e l e a s e d = new A r r a y L i s t [ 3 0 ] ; T o e t s a a n s l a g e n R = new A r r a y L i s t [ 3 0 ] ; T i j d e n S h i f t R e l e a s e d = new A r r a y L i s t [ 3 0 ] ; S h i f t R e l e a s e d = new A r r a y L i s t [ 3 0 ] ; f o r ( i n t i = 0 ; i < 3 0 ; i ++) { T i j d e n P r e s s e d [ i ] = new A r r a y L i s t ( ) ; T o e t s a a n s l a g e n P [ i ] = new A r r a y L i s t ( ) ; T i j d e n S h i f t P r e s s e d [ i ] = new A r r a y L i s t ( ) ; S h i f t P r e s s e d [ i ] = new A r r a y L i s t ( ) ; T i j d e n R e l e a s e d [ i ] = new A r r a y L i s t ( ) ; T o e t s a a n s l a g e n R [ i ] = new A r r a y L i s t ( ) ; T i j d e n S h i f t R e l e a s e d [ i ] = new A r r a y L i s t ( ) ; S h i f t R e l e a s e d [ i ] = new A r r a y L i s t ( ) ; } s c = new S c a n n e r ( System . i n ) ; / / f i l e n a m e = ” z e l f 1 . t x t ”; f i l e n a m e = ”HK5 . t x t ” ;
22
/ / f i l e n a m e = ”HK13 . t x t ” ; f = new F i l e ( f i l e n a m e ) ; I n t e r v a l l e n S h i f t T i j d e n = new A r r a y L i s t [ 3 0 ] ; I n t e r v a l l e n S h i f t G e b e u r t e n i s s e n = new A r r a y L i s t [ 3 0 ] ; f o r ( i n t i = 0 ; i < 3 0 ; i ++) { I n t e r v a l l e n S h i f t T i j d e n [ i ] = new A r r a y L i s t ( ) ; I n t e r v a l l e n S h i f t G e b e u r t e n i s s e n [ i ] = new A r r a y L i s t ( ) ; } } void matrix ( ) { try { s c = new S c a n n e r ( f ) ; while ( sc . hasNext ( ) ) { sc . next ( ) ; sc . next ( ) ; sc . next ( ) ; / / S y s t e m . o u t . p r i n t l n ( ” Run ” + n ) ; while ( sc . hasNextLong ( ) ) { T i j d e n P r e s s e d [ n ] . add ( s c . n e x t L o n g ( ) ) ; sc . next ( ) ; } sc . next ( ) ; while ( sc . hasNextInt ( ) ) { T o e t s a a n s l a g e n P [ n ] . add ( s c . n e x t I n t ( ) ) ; sc . next ( ) ; } sc . next ( ) ; while ( sc . hasNextLong ( ) ) { T i j d e n S h i f t P r e s s e d [ n ] . add ( s c . n e x t L o n g ( ) ) ; sc . next ( ) ; } sc . next ( ) ; while ( sc . hasNextInt ( ) ) { S h i f t P r e s s e d [ n ] . add ( s c . n e x t I n t ( ) ) ; sc . next ( ) ; } sc . next ( ) ; while ( sc . hasNextLong ( ) ) { T i j d e n R e l e a s e d [ n ] . add ( s c . n e x t L o n g ( ) ) ; sc . next ( ) ; } sc . next ( ) ; while ( sc . hasNextInt ( ) ) { T o e t s a a n s l a g e n R [ n ] . add ( s c . n e x t I n t ( ) ) ; sc . next ( ) ; } sc . next ( ) ; while ( sc . hasNextLong ( ) ) { T i j d e n S h i f t R e l e a s e d [ n ] . add ( s c . n e x t L o n g ( ) ) ; sc . next ( ) ; } sc . next ( ) ; while ( sc . hasNextInt ( ) ) { S h i f t R e l e a s e d [ n ] . add ( s c . n e x t I n t ( ) ) ; sc . next ( ) ; } n ++; } sc . close ( ) ; } catch ( FileNotFoundException e ) {
23
System . o u t . p r i n t l n ( ” F i l e ” + f i l e n a m e + ” c o u l d n o t be f o u n d . ” ) ; } / / f o r ( i n t i = 0 ; i
= = = = = = = = = =
1; 1; 0; 1; 1; 0; 1; 2; 0; 0;
i n g e t y p t W a c h t w o o r d = new i n t [ 3 0 ] [ 2 ] [ 1 0 ] ∗/ /∗ c o r r e c t W a c h t w o o r d = new i n t [ 2 ] [ 1 7 ] ; / / v o o r ” D e J u n c k e r 2 6 0 1 1 9 9 3 ” / / De e e r s t e r i j g e e f t de c a r a c t e r s aan / / De t w e e d e r i j g e e f t aan o f de s h i f t / c a p s i n g e d r u k t moet z i j n o f n i e t / / 0 = j a ( s h i f t o f c a p s L k ) , 1 = nee , 2 = s h i f t moet i n g e d r u k t z i j n ( s y m b o o l ) correctWachtwoord [0][0] = 68; correctWachtwoord [0][1] = 69; correctWachtwoord [0][2] = 74; correctWachtwoord [0][3] = 85; correctWachtwoord [0][4] = 78; correctWachtwoord [0][5] = 67; correctWachtwoord [0][6] = 75; correctWachtwoord [0][7] = 69; correctWachtwoord [0][8] = 82; correctWachtwoord [0][9] = 50; correctWachtwoord [0][10] = 54; correctWachtwoord [0][11] = 48; correctWachtwoord [0][12] = 49;
24
correctWachtwoord [0][13] correctWachtwoord [0][14] correctWachtwoord [0][15] correctWachtwoord [0][16]
= = = =
49; 57; 57; 51;
correctWachtwoord [1][0] = 0; correctWachtwoord [1][1] = 1; correctWachtwoord [1][2] = 0; correctWachtwoord [1][3] = 1; correctWachtwoord [1][4] = 1; correctWachtwoord [1][5] = 1; correctWachtwoord [1][6] = 1; correctWachtwoord [1][7] = 1; correctWachtwoord [1][8] = 1; correctWachtwoord [1][9] = 1; correctWachtwoord [1][10] = 1; correctWachtwoord [1][11] = 1; correctWachtwoord [1][12] = 1; correctWachtwoord [1][13] = 1; correctWachtwoord [1][14] = 1; correctWachtwoord [1][15] = 1; correctWachtwoord [1][16] = 1; i n g e t y p t W a c h t w o o r d = new i n t [ 3 0 ] [ 2 ] [ 1 7 ] ; ∗ ∗/ c o r r e c t W a c h t w o o r d = new i n t [ 2 ] [ 1 2 ] ; / / v o o r ” H K g f s f t 9 6 7 3 ! ” / / De e e r s t e r i j g e e f t de c a r a c t e r s aan / / De t w e e d e r i j g e e f t aan o f de s h i f t / c a p s i n g e d r u k t moet z i j n o f n i e t / / 0 = j a ( s h i f t o f c a p s L k ) , 1 = nee , 2 = s h i f t moet i n g e d r u k t z i j n ( s y m b o o l ) correctWachtwoord [ 0 ] [ 0 ] = 72; correctWachtwoord [ 0 ] [ 1 ] = 75; correctWachtwoord [ 0 ] [ 2 ] = 71; correctWachtwoord [ 0 ] [ 3 ] = 70; correctWachtwoord [ 0 ] [ 4 ] = 83; correctWachtwoord [ 0 ] [ 5 ] = 70; correctWachtwoord [ 0 ] [ 6 ] = 84; correctWachtwoord [ 0 ] [ 7 ] = 57; correctWachtwoord [ 0 ] [ 8 ] = 54; correctWachtwoord [ 0 ] [ 9 ] = 55; correctWachtwoord [ 0 ] [ 1 0 ] = 51; correctWachtwoord [ 0 ] [ 1 1 ] = 49; correctWachtwoord [ 1 ] [ 0 ] = 0; correctWachtwoord [ 1 ] [ 1 ] = 0; correctWachtwoord [ 1 ] [ 2 ] = 1; correctWachtwoord [ 1 ] [ 3 ] = 1; correctWachtwoord [ 1 ] [ 4 ] = 1; correctWachtwoord [ 1 ] [ 5 ] = 1; correctWachtwoord [ 1 ] [ 6 ] = 1; correctWachtwoord [ 1 ] [ 7 ] = 1; correctWachtwoord [ 1 ] [ 8 ] = 1; correctWachtwoord [ 1 ] [ 9 ] = 1; correctWachtwoord [ 1 ] [ 1 0 ] = 1; correctWachtwoord [ 1 ] [ 1 1 ] = 2; i n g e t y p t W a c h t w o o r d = new i n t [ 3 0 ] [ 2 ] [ 1 2 ] ;
/ / K o p i e van T o e t s a a n s l a g e n P en T o e t s a a n s l a g e n R maken A r r a y L i s t [] K o p i e T o e t s a a n s l a g e n P ; A r r a y L i s t [] K o p i e T o e t s a a n s l a g e n R ;
25
K o p i e T o e t s a a n s l a g e n P = new A r r a y L i s t [ 3 0 ] ; K o p i e T o e t s a a n s l a g e n R = new A r r a y L i s t [ 3 0 ] ; f o r ( i n t i = 0 ; i < 3 0 ; i ++) { K o p i e T o e t s a a n s l a g e n P [ i ] = new A r r a y L i s t ( ) ; K o p i e T o e t s a a n s l a g e n R [ i ] = new A r r a y L i s t ( ) ; }
f o r ( i n t i = 0 ; i < 3 0 ; i ++) { f o r ( i n t j = 0 ; j < T o e t s a a n s l a g e n P [ i ] . s i z e ( ) ; j ++) { K o p i e T o e t s a a n s l a g e n P [ i ] . add ( T o e t s a a n s l a g e n P [ i ] . g e t ( j ) ) ; } } f o r ( i n t i = 0 ; i < 3 0 ; i ++) { f o r ( i n t j = 0 ; j < T o e t s a a n s l a g e n R [ i ] . s i z e ( ) ; j ++) { K o p i e T o e t s a a n s l a g e n R [ i ] . add ( T o e t s a a n s l a g e n R [ i ] . g e t ( j ) ) ; } } / / k i j k e n naar backspace boolean [ ] backSpace ; b a c k S p a c e = new b o o l e a n [ 3 0 ] ; / / wanneer b a c k S p a c e [ i ] i s t r u e , / / dan i s e r e r g e n s b i j h e t t y p e n van h e t wachtwoord b a c k s p a c e g e b r u i k t f o r ( i n t i = 0 ; i < 3 0 ; i ++) { f o r ( i n t j = 0 ; j < K o p i e T o e t s a a n s l a g e n P [ i ] . s i z e ( ) ; j ++) { i f ( K o p i e T o e t s a a n s l a g e n P [ i ] . g e t ( j ) == 8 ) { backSpace [ i ] = true ; } } } / / c o n t r o l e r e n o f e r b i j h e t t y p e n van h e t wachtwoord maar e e n t e k e n i s weg g e h a a l d , / / o f d a t e r op n i e u w b e g o n n e n i s f o r ( i n t i = 0 ; i < 3 0 ; i ++) { i f ( b a c k S p a c e [ i ] == t r u e ) { / / v e r d e r o n d e r z o e k e n wanneer e r b a c k s p a c e i s g e b r u i k t f o r ( i n t j = 0 ; j < K o p i e T o e t s a a n s l a g e n P [ i ] . s i z e ( ) ; j ++) { i f ( K o p i e T o e t s a a n s l a g e n P [ i ] . g e t ( j ) == 8 ) { / / a l h e t v o r i g e weg h a l e n f o r ( i n t k = 0 ; k <= j ; k ++) { KopieToetsaanslagenP [ i ] . set (k , 0); T i j d e n P r e s s e d [ i ] . s e t ( k , Long . MIN VALUE ) ; } } while ( ! KopieToetsaanslagenP [ i ] . isEmpty ( ) && K o p i e T o e t s a a n s l a g e n P [ i ] . g e t ( 0 ) == 0 ) { K o p i e T o e t s a a n s l a g e n P [ i ] . remove ( 0 ) ; } while ( ! T i j d e n P r e s s e d [ i ] . isEmpty ( ) && T i j d e n P r e s s e d [ i ] . g e t ( 0 ) == Long . MIN VALUE ) { T i j d e n P r e s s e d [ i ] . remove ( 0 ) ; } } } } f o r ( i n t i = 0 ; i < 3 0 ; i ++) { i f ( b a c k S p a c e [ i ] == t r u e ) { / / v e r d e r o n d e r z o e k e n wanneer e r b a c k s p a c e i s g e b r u i k t f o r ( i n t j = 0 ; j < K o p i e T o e t s a a n s l a g e n R [ i ] . s i z e ( ) ; j ++) { i f ( K o p i e T o e t s a a n s l a g e n R [ i ] . g e t ( j ) == 8 ) { / / a l h e t v o r i g e weg h a l e n f o r ( i n t k = 0 ; k <= j ; k ++) { KopieToetsaanslagenR [ i ] . s e t (k , 0 ) ;
26
T i j d e n R e l e a s e d [ i ] . s e t ( k , Long . MIN VALUE ) ; } } while ( ! KopieToetsaanslagenR [ i ] . isEmpty ( ) && K o p i e T o e t s a a n s l a g e n R [ i ] . g e t ( 0 ) == 0 ) { K o p i e T o e t s a a n s l a g e n R [ i ] . remove ( 0 ) ; } while ( ! T i j d e n R e l e a s e d [ i ] . isEmpty ( ) && T i j d e n R e l e a s e d [ i ] . g e t ( 0 ) == Long . MIN VALUE ) { T i j d e n R e l e a s e d [ i ] . remove ( 0 ) ; } } } } / / nu z i j n a l l e w a c h t w o o r d e n o p g e s l a a n z o n d e r de i n f o r m a t i e van wat e r met b a c k s p a c e i s g e b e u r d / / t o e t s a a n s l a g e n d i e g e t y p t z i j n i n e e n a r r a y z e t t e n om d a d e l i j k t e c o n t r o l e r e n f o r ( i n t i = 0 ; i < 3 0 ; i ++) { f o r ( i n t j = 0 ; j < K o p i e T o e t s a a n s l a g e n P [ i ] . s i z e ( ) ; j ++) { i f ( j < ingetyptWachtwoord [ i ] [ 0 ] . length ) { ingetyptWachtwoord [ i ] [ 0 ] [ j ] = KopieToetsaanslagenP [ i ] . get ( j ) ; } } } / / I n t e r v a l l e n maken w a a r i n s h i f t , c a p s L o c k o f n i k s i s i n g e d r u k t / / 0 = c a p s l o c k ; 1 = nee ; 2 = s h i f t / / K o p i e maken van T i j d e n S h i f t P r e s s e d en T i j d e n S h i f t R e l e a s e d , want d e z e h e b b e n we nog n o d i g A r r a y L i s t [] T i j d e n S h i f t P r e s s e d K o p i e ; A r r a y L i s t [] T i j d e n S h i f t R e l e a s e d K o p i e ; T i j d e n S h i f t P r e s s e d K o p i e = new A r r a y L i s t [ 3 0 ] ; T i j d e n S h i f t R e l e a s e d K o p i e = new A r r a y L i s t [ 3 0 ] ; f o r ( i n t j = 0 ; j < 3 0 ; j ++) { T i j d e n S h i f t P r e s s e d K o p i e [ j ] = new A r r a y L i s t ( ) ; T i j d e n S h i f t R e l e a s e d K o p i e [ j ] = new A r r a y L i s t ( ) ; f o r ( i n t i = 0 ; i < T i j d e n S h i f t P r e s s e d [ j ] . s i z e ( ) ; i ++) { T i j d e n S h i f t P r e s s e d K o p i e [ j ] . add ( T i j d e n S h i f t P r e s s e d [ j ] . g e t ( i ) ) ; } f o r ( i n t i = 0 ; i < T i j d e n S h i f t R e l e a s e d [ j ] . s i z e ( ) ; i ++) { T i j d e n S h i f t R e l e a s e d K o p i e [ j ] . add ( T i j d e n S h i f t R e l e a s e d [ j ] . g e t ( i ) ) ; } } f o r ( i n t j = 0 ; j < 3 0 ; j ++) { long [ ] i n t e r v a l l e n S h i f t T i j d e n ; / / dummy a r r a y aanmaken om i n t e r v a l l e n p e r a r r a y op t e s l a a n i n t e r v a l l e n S h i f t T i j d e n = new l o n g [ 2 ∗ T i j d e n S h i f t P r e s s e d K o p i e [ j ] . s i z e ( ) ] ; int [] intervallenShiftGebeurtenissen ; i n t e r v a l l e n S h i f t G e b e u r t e n i s s e n = new i n t [ 2 ∗ T i j d e n S h i f t P r e s s e d K o p i e [ j ] . s i z e ( ) ] ; int i i = 0; f o r ( i n t i = 0 ; i < T i j d e n S h i f t P r e s s e d K o p i e [ j ] . s i z e ( ) ; i ++) { i f ( i < TijdenShiftPressedKopie [ j ] . s i z e ( ) − 1) { / / h i e r b e s t a a t T i j d e n S h i f t P r e s s e d [ j ] . g e t ( i +1 nog n e t ) i f ( ! T i j d e n S h i f t R e l e a s e d K o p i e [ j ] . isEmpty ( ) ) { / / k i j k e n o f de e e r t s v o l g e n d e r e l e a s e d S h i f t t i j d h o o r t b i j p r e s s e d S h i f t [ i ] i f ( TijdenShiftReleasedKopie [ j ] . get (0) > TijdenShiftPressedKopie [ j ] . get ( i + 1)) { } else { i n t e r v a l l e n S h i f t T i j d e n [ i i ] = TijdenShiftPressedKopie [ j ] . get ( i ) ; i f ( S h i f t P r e s s e d [ j ] . g e t ( i ) == 1 6 ) { intervallenShiftGebeurtenissen [ i i ] = 2;
27
} else { intervallenShiftGebeurtenissen [ i i ] = 0; } i i ++; i n t e r v a l l e n S h i f t T i j d e n [ i i ] = TijdenShiftReleasedKopie [ j ] . get ( 0 ) ; intervallenShiftGebeurtenissen [ i i ] = 1;
T i j d e n S h i f t R e l e a s e d K o p i e [ j ] . remove ( 0 ) ; / / h a a l de e e r s t e r e l e a s e d t i j d weg , z o d a t de e e r s t v o l g e n d e nu op p l e k 0 komt t e s t a i i ++; } } } else { / / a l s T i j d e n S h i f t R e l e a s e d [ j ] . g e t ( 0 ) nog s t e e d s b e s t a a t i f ( ! T i j d e n S h i f t R e l e a s e d K o p i e [ j ] . isEmpty ( ) ) { i n t e r v a l l e n S h i f t T i j d e n [ i i ] = TijdenShiftPressedKopie [ j ] . get ( i ) ; i f ( S h i f t P r e s s e d [ j ] . g e t ( i ) == 1 6 ) { intervallenShiftGebeurtenissen [ i i ] = 2; } else { intervallenShiftGebeurtenissen [ i i ] = 0; } i i ++; i n t e r v a l l e n S h i f t T i j d e n [ i i ] = TijdenShiftReleasedKopie [ j ] . get ( 0 ) ; intervallenShiftGebeurtenissen [ i i ] = 1; T i j d e n S h i f t R e l e a s e d K o p i e [ j ] . remove ( 0 ) ; i i ++; } } } f o r ( i n t k = 0 ; k < i n t e r v a l l e n S h i f t T i j d e n . l e n g t h ; k ++) { I n t e r v a l l e n S h i f t T i j d e n [ j ] . add ( i n t e r v a l l e n S h i f t T i j d e n [ k ] ) ; I n t e r v a l l e n S h i f t G e b e u r t e n i s s e n [ j ] . add ( i n t e r v a l l e n S h i f t G e b e u r t e n i s s e n [ k ] ) ; }
f o r ( i n t i = 0 ; i < T i j d e n P r e s s e d [ j ] . s i z e ( ) ; i ++) { i f ( i < ingetyptWachtwoord [ j ] [ 1 ] . length ) { int k = 0; while ( k < I n t e r v a l l e n S h i f t T i j d e n [ j ] . s i z e ( ) && T i j d e n P r e s s e d [ j ] . g e t ( i ) > I n t e r v a l l e n S h i f t T i j d e n [ j ] . g e t ( k ) ) { k ++; } i f ( k == 0 ) { ingetyptWachtwoord [ j ] [ 1 ] [ i ] = 1; } else { ingetyptWachtwoord [ j ] [ 1 ] [ i ] = I n t e r v a l l e n S h i f t G e b e u r t e n i s s e n [ j ] . get ( k − 1 ) ; } } } } / / Wachtwoorden c o n t r o l e r e n f o r ( i n t i = 0 ; i < 3 0 ; i ++) { i f ( WachtwoordCorrect ( i ) ) { / / System . out . p r i n t l n (” Hallo ” ) ; i f ( e e r s t e C o r r e c t < 0) { eersteCorrect = i ; } a a n t a l W a c h t w o o r d e n ++; } else {
28
/ / S y s t e m . o u t . p r i n t l n ( ” Nee ” ) ; } } } boolean WachtwoordCorrect ( i n t i ) { f o r ( i n t j = 0 ; j < i n g e t y p t W a c h t w o o r d [ i ] [ 0 ] . l e n g t h ; j ++) { i f ( ingetyptWachtwoord [ i ] [ 0 ] [ j ] != correctWachtwoord [ 0 ] [ j ] ) { return f a l s e ; } else { i f ( c o r r e c t W a c h t w o o r d [ 1 ] [ j ] == 1 ) { i f ( ingetyptWachtwoord [ i ] [ 1 ] [ j ] != 1) { return f a l s e ; } } e l s e i f ( c o r r e c t W a c h t w o o r d [ 1 ] [ j ] == 0 ) { i f ( i n g e t y p t W a c h t w o o r d [ i ] [ 1 ] [ j ] == 1 ) { return f a l s e ; } } e l s e i f ( c o r r e c t W a c h t w o o r d [ 1 ] [ j ] == 2 ) { i f ( ingetyptWachtwoord [ i ] [ 1 ] [ j ] != 2) { return f a l s e ; } } } } return true ; } void L e n g t e T o e t s a a n s l a g M a t r i c e s ( ) { L e n g t e T o e t s a a n s l a g = new A r r a y L i s t [ 3 0 ] ; L e n g t e T o e t s a a n s l a g S h i f t = new A r r a y L i s t [ 3 0 ] ; f o r ( i n t i = 0 ; i < 3 0 ; i ++) { / / aanmaken m a t r i x e n L e n g t e T o e t s a a n s l a g L e n g t e T o e t s a a n s l a g [ i ] = new A r r a y L i s t ( ) ; L e n g t e T o e t s a a n s l a g S h i f t [ i ] = new A r r a y L i s t ( ) ; } f o r ( i n t j = 0 ; j < 3 0 ; j ++) { / / v u l l e n m a t r i x L e n g t e T o e t s a a n s l a g i f ( WachtwoordCorrect ( j ) ) { long [ ] l e n g t e T o e t s a a n s l a g ; / / dummy a r r a y aanmaken om de L e n g t e T o e t s a a n s l a g p e r a r r a y op t e s l a a n l e n g t e T o e t s a a n s l a g = new l o n g [ T i j d e n P r e s s e d [ j ] . s i z e ( ) ] ; int t e l l e r = 0; / / aantal keer t o e t s releasen n i e t opslaan f o r ( i n t i = 0 ; i < T i j d e n P r e s s e d [ j ] . s i z e ( ) ; i ++) { i f ( T o e t s a a n s l a g e n P [ j ] . g e t ( i ) == T o e t s a a n s l a g e n R [ j ] . g e t ( i − t e l l e r ) ) { / / c o n t r o l e r e n o f h e t r e l e a s e n van e e n t o e t s d a a d w e r k e l i j k i s o p g e s l a g e n / / z o j a , de t u s s e n t i j d op p l e k i i n a r r a y o p s l a a n lengteToetsaanslag [ i ] = TijdenReleased [ j ] . get ( i ) − TijdenPressed [ j ] . get ( i − t e l l e r ) ; } else { / / z o nee , de t u s s e n t i j d op 0 z e t t e n lengteToetsaanslag [ i ] = 0; t e l l e r ++; } } f o r ( i n t k = 0 ; k < l e n g t e T o e t s a a n s l a g . l e n g t h ; k ++) { / / r i j j van de m a t r i x L e n g t e T o e t s a a n s l a g v u l l e n L e n g t e T o e t s a a n s l a g [ j ] . add ( l e n g t e T o e t s a a n s l a g [ k ] ) ; } } } f o r ( i n t j = 0 ; j < 3 0 ; j ++) { / / v u l l e n m a t r i x L e n g t e T o e t s a a n s l a g s h i f t s i f ( WachtwoordCorrect ( j ) ) { long [ ] l e n g t e T o e t s a a n s l a g S h i f t ;
29
/ / dummy a r r a y aanmaken om L e n g t e T o e t s a a n s l a g p e r a r r a y op t e s l a a n l e n g t e T o e t s a a n s l a g S h i f t = new l o n g [ T i j d e n S h i f t P r e s s e d [ j ] . s i z e ( ) ] ; f o r ( i n t i = 0 ; i < T i j d e n S h i f t P r e s s e d [ j ] . s i z e ( ) ; i ++) { i f ( i < T i j d e n S h i f t P r e s s e d [ j ] . s i z e ( ) − 1) { / / h i e r b e s t a a t T i j d e n S h i f t P r e s s e d [ j ] . g e t ( i +1 nog n e t ) i f ( ! T i j d e n S h i f t R e l e a s e d [ j ] . isEmpty ( ) ) { / / k i j k e n o f de e e r t s v o l g e n d e r e l e a s e d S h i f t t i j d h o o r t b i j p r e s s e d S h i f t [ i ] i f ( TijdenShiftReleased [ j ] . get (0) > TijdenShiftPressed [ j ] . get ( i + 1)) { lengteToetsaanslagShift [ i ] = 0; } else { lengteToetsaanslagShift [ i ] = TijdenShiftReleased [ j ] . get (0) − TijdenShiftPressed [ j ] . get ( i ) ; T i j d e n S h i f t R e l e a s e d [ j ] . remove ( 0 ) ; / / h a a l de e e r s t e r e l e a s e d t i j d weg , / / z o d a t de e e r s t v o l g e n d e nu op p l e k 0 komt t e s t a a n } } else { lengteToetsaanslagShift [ i ] = 0; } } else { / / a l s T i j d e n S h i f t R e l e a s e d [ j ] . g e t ( 0 ) nog s t e e d s b e s t a a t i f ( ! T i j d e n S h i f t R e l e a s e d [ j ] . isEmpty ( ) ) { lengteToetsaanslagShift [ i ] = TijdenShiftReleased [ j ] . get (0) − TijdenShiftPressed [ j ] . get ( i ) ; } else { lengteToetsaanslagShift [ i ] = 0; } } } f o r ( i n t k = 0 ; k < l e n g t e T o e t s a a n s l a g S h i f t . l e n g t h ; k ++) { / / r i j j van de m a t r i x L e n g t e T o e t s a a n s l a g v u l l e n L e n g t e T o e t s a a n s l a g S h i f t [ j ] . add ( l e n g t e T o e t s a a n s l a g S h i f t [ k ] ) ; } } } } void T u s s e n t i j d e n M a t r i c e s ( ) { T u s s e n t i j d e n = new A r r a y L i s t [ 3 0 ] ; f o r ( i n t i = 0 ; i < 3 0 ; i ++) { T u s s e n t i j d e n [ i ] = new A r r a y L i s t ( ) ; } f o r ( i n t j = 0 ; j < 3 0 ; j ++) { i f ( WachtwoordCorrect ( j ) ) { long [ ] t u s s e n t i j d e n ; t u s s e n t i j d e n = new l o n g [ T i j d e n P r e s s e d [ j ] . s i z e ( ) − 1 ] ; f o r ( i n t i = 0 ; i < T i j d e n P r e s s e d [ j ] . s i z e ( ) − 1 ; i ++) { t u s s e n t i j d e n [ i ] = TijdenPressed [ j ] . get ( i + 1) − TijdenPressed [ j ] . get ( i ) ; } f o r ( i n t k = 0 ; k < t u s s e n t i j d e n . l e n g t h ; k ++) { T u s s e n t i j d e n [ j ] . add ( t u s s e n t i j d e n [ k ] ) ; } } } } void g e m i d d e l d e T u s s e n t i j d e n ( ) { g e m i d d e l d e n = new l o n g [ T u s s e n t i j d e n [ e e r s t e C o r r e c t ] . s i z e ( ) ] ; long [ ] o p t e l l i n g ; o p t e l l i n g = new l o n g [ T u s s e n t i j d e n [ e e r s t e C o r r e c t ] . s i z e ( ) ] ; int t e l l e r = 0; f o r ( i n t j = 0 ; j < T u s s e n t i j d e n [ e e r s t e C o r r e c t ] . s i z e ( ) ; j ++) {
30
f o r ( i n t i = 0 ; i < 3 0 ; i ++) { i f ( ! T u s s e n t i j d e n [ i ] . isEmpty ( ) ) { o p t e l l i n g [ j ] += T u s s e n t i j d e n [ i ] . g e t ( j ) ; t e l l e r ++; } } gemiddelden [ j ] = o p t e l l i n g [ j ] / t e l l e r ; } } void v a r i a t i e s T u s s e n t i j d e n ( ) { v a r i a n t i e s = new d o u b l e [ T u s s e n t i j d e n [ e e r s t e C o r r e c t ] . s i z e ( ) ] ; long [ ] o p t e l l i n g ; o p t e l l i n g = new l o n g [ T u s s e n t i j d e n [ e e r s t e C o r r e c t ] . s i z e ( ) ] ; int t e l l e r = 0; f o r ( i n t j = 0 ; j < T u s s e n t i j d e n [ e e r s t e C o r r e c t ] . s i z e ( ) ; j ++) { f o r ( i n t i = 0 ; i < 3 0 ; i ++) { i f ( ! T u s s e n t i j d e n [ i ] . isEmpty ( ) ) { o p t e l l i n g [ j ] += ( T u s s e n t i j d e n [ i ] . g e t ( j ) ∗ T u s s e n t i j d e n [ i ] . g e t ( j ) ) − ( gemiddelden [ j ] ∗ gemiddelden [ j ] ) ; t e l l e r ++; } } v a r i a n t i e s [ j ] = Math . s q r t ( o p t e l l i n g [ j ] / t e l l e r ) ; } } void verhoudingen ( ) { T u s s e n t i j d e n V e r h o u d i n g e n = new A r r a y L i s t [ 3 0 ] ; f o r ( i n t i = 0 ; i < 3 0 ; i ++) { / / aanmaken m a t r i x e n T u s s e n t i j d e n V e r h o u d i n g e n T u s s e n t i j d e n V e r h o u d i n g e n [ i ] = new A r r a y L i s t ( ) ; } / / I e d e r e r i j i n T u s s e n t i j d e n moet d e z e l f d e l e n g t e h e b b e n / / D i t heb j e v o o r e l k a a r g e k r e g e n d o o r h e t c o n t r o l e r e n van h e t i n g e t y p t e wachtwoord f o r ( i n t i = 0 ; i < 3 0 ; i ++) { / / a l l e r i j e n a f gaan i f ( WachtwoordCorrect ( i ) ) { f o r ( i n t j = 0 ; j < T u s s e n t i j d e n [ i ] . s i z e ( ) ; j ++) { / / e l k e l e t t e r afgaan , b e h a l v e l a a t s t e l e t t e r ( deze n i e t r e l e v a n t ) f o r ( i n t k = j + 1 ; k < T u s s e n t i j d e n [ i ] . s i z e ( ) ; k ++) { / / v a n a f p l a a t s j , d e l e n op i e d e r e v o l g e n d e i f ( T u s s e n t i j d e n [ i ] . g e t ( k ) != 0) { T u s s e n t i j d e n V e r h o u d i n g e n [ i ] . add ( 1 . 0 ∗ Tussentijden [ i ] . get ( j ) / Tussentijden [ i ] . get (k ) ) ; } else { T u s s e n t i j d e n V e r h o u d i n g e n [ i ] . add ( 0 . 0 ) ; } } } } } } void v e r g e l i j k e n V e r h o u d i n g e n ( ) { double differenceMM = 50000; / / Er van u i t gaande d a t i e d e r e r i j i n T u s s e n t i j d e n V e r h o u d i n g e n d e z e l f d e l e n g t e h e e f t f o r ( i n t j = 0 ; j < T u s s e n t i j d e n V e r h o u d i n g e n [ e e r s t e C o r r e c t ] . s i z e ( ) ; j ++) { d o u b l e min = 1 0 0 0 ; / / aangenomen d a t de v e r h o u d i n g t u s s e n t w e e t u s s e n t i j d e n n o o i t 1 : 1 0 0 0 d o u b l e max = 0 ; / / a l l e v e r h o u d i n g e n z u l l e n g r o t e r z i j n dan n u l , / / d u s om t e b e g i n n e n b i j max = 0 , k r i j g j e l a t e r s o w i e s o de m a x i m a l e waarde f o r ( i n t i = 0 ; i < 3 0 ; i ++) { i f ( ! T u s s e n t i j d e n V e r h o u d i n g e n [ i ] . isEmpty ( ) ) { / / v e r s c h i l m a x i m a l e en m i n i m a l e waarde van i e d e r e kolom b e p a l e n
31
/ / a l s deze erg k l e i n is , / / dan i s de v e r h o u d i n g w a a r i n j e t w e e l e t t e r s t y p t v r i j c o n s t a n t i f ( T u s s e n t i j d e n V e r h o u d i n g e n [ i ] . g e t ( j ) < min ) { min = T u s s e n t i j d e n V e r h o u d i n g e n [ i ] . g e t ( j ) ; } i f ( T u s s e n t i j d e n V e r h o u d i n g e n [ i ] . g e t ( j ) > max ) { max = T u s s e n t i j d e n V e r h o u d i n g e n [ i ] . g e t ( j ) ; } d i f f e r e n c e M M = max − min ; } } } } void d a t a P r i n t e n ( ) { F = new F i l e ( ” D a t a a n a l y s e ” + f i l e n a m e ) ; try { pw = new P r i n t W r i t e r ( F ) ; / / lengte toetsaanslagen pw . p r i n t l n ( ” L e n g t e van de t o e t s a a n s l a g e n en s h i f t a a n s l a g e n : ” ) ; f o r ( i n t i = 0 ; i < 3 0 ; i ++) { pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” Run ” + i ) ; pw . p r i n t l n ( ” L e n g t e t o e t s a a n s l a g : ” ) ; f o r ( i n t j = 0 ; j < L e n g t e T o e t s a a n s l a g [ i ] . s i z e ( ) ; j ++) { pw . p r i n t ( L e n g t e T o e t s a a n s l a g [ i ] . g e t ( j ) + ” ” ) ; } pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” L e n g t e s h i f t a a n s l a g : ” ) ; f o r ( i n t j = 0 ; j < L e n g t e T o e t s a a n s l a g S h i f t [ i ] . s i z e ( ) ; j ++) { pw . p r i n t ( L e n g t e T o e t s a a n s l a g S h i f t [ i ] . g e t ( j ) + ” ” ) ; } pw . p r i n t l n ( ) ; } // tussentijden pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” T u s s e n t i j d e n : ” ) ; f o r ( i n t i = 0 ; i < 3 0 ; i ++) { pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” Run ” + i ) ; f o r ( i n t j = 0 ; j < T u s s e n t i j d e n [ i ] . s i z e ( ) ; j ++) { pw . p r i n t ( T u s s e n t i j d e n [ i ] . g e t ( j ) + ” ” ) ; } pw . p r i n t l n ( ) ; } / / gemiddelden pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” G e m i d d e l d e t u s s e n t i j d e n : ” ) ; f o r ( i n t i = 0 ; i < g e m i d d e l d e n . l e n g t h ; i ++) { pw . p r i n t ( g e m i d d e l d e n [ i ] + ” ” ) ; } pw . p r i n t l n ( ) ; // variaties pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” V a r i a n t i e s t u s s e n t i j d e n : ” ) ; f o r ( i n t i = 0 ; i < v a r i a n t i e s . l e n g t h ; i ++) { pw . p r i n t ( v a r i a n t i e s [ i ] + ” ” ) ; } pw . p r i n t l n ( ) ;
32
/ / verhoudingen pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” V e r h o u d i n g e n t u s s e n t i j d e n : ” ) ; f o r ( i n t i = 0 ; i < 3 0 ; i ++) { pw . p r i n t l n ( ) ; pw . p r i n t l n ( ” Run ” + i ) ; f o r ( i n t j = 0 ; j < T u s s e n t i j d e n V e r h o u d i n g e n [ i ] . s i z e ( ) ; j ++) { pw . p r i n t ( T u s s e n t i j d e n V e r h o u d i n g e n [ i ] . g e t ( j ) + ” ” ) ; } pw . p r i n t l n ( ) ; } pw . c l o s e ( ) ; } catch ( FileNotFoundException e ) { System . o u t . p r i n t l n ( ” F i l e ” + ” D a t a a n a l y s e ” + f i l e n a m e + ” c o u l d n o t be o p e n e d . ” ) ; } } void run ( ) { matrix ( ) ; wachtwoordControle ( ) ; LengteToetsaanslagMatrices ( ) ; TussentijdenMatrices ( ) ; gemiddeldeTussentijden ( ) ; variatiesTussentijden (); verhoudingen ( ) ; vergelijkenVerhoudingen ( ) ; dataPrinten (); } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { new D a t a I n l e z e n ( ) . r u n ( ) ; } }
33