Last active
March 21, 2019 13:09
-
-
Save iPublicis/092bc8b6a2294c55a57365eb83cb7ce4 to your computer and use it in GitHub Desktop.
Create XKCD password - taken from https://web.cs.dal.ca/~dneil/xkcdPassword.php
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| //------------------------------------------------------------------- | |
| // Altered 2014, Derek Neil | |
| // add functionality on controlling final output | |
| //------------------------------------------------------------------- | |
| //------------------------------------------------------------------- | |
| // Copyright (c) 2011, Jeff Preshing | |
| // http://preshing.com/20110811/xkcd-password-generator | |
| // All rights reserved. | |
| // | |
| // Some parts based on http://www.mytsoftware.com/dailyproject/PassGen/entropy.js, copyright 2003 David Finch. | |
| // | |
| // Released under the Modified BSD License: | |
| // | |
| // Redistribution and use in source and binary forms, with or without | |
| // modification, are permitted provided that the following conditions are met: | |
| // * Redistributions of source code must retain the above copyright | |
| // notice, this list of conditions and the following disclaimer. | |
| // * Redistributions in binary form must reproduce the above copyright | |
| // notice, this list of conditions and the following disclaimer in the | |
| // documentation and/or other materials provided with the distribution. | |
| // * Neither the name of the organization nor the | |
| // names of its contributors may be used to endorse or promote products | |
| // derived from this software without specific prior written permission. | |
| // | |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
| // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
| // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| // DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER BE LIABLE FOR ANY | |
| // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
| // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
| // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
| // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
| // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| //------------------------------------------------------------------- | |
| // A SHA-1 hash generated on the server which is unique for each visit: | |
| // Requires sha1.min.js - https://github.com/iPublicis/sha1.min.js | |
| var xkcd_pw_gen_server_hash = "933b4eef42569cfa0e96d9af7670b1ba74795647"; | |
| var xkcd_pw_gen_wordlist = [ | |
| "ability","able","aboard","about","above","accept","accident","according", | |
| "account","accurate","acres","across","act","action","active","activity", | |
| "actual","actually","add","addition","additional","adjective","adult","adventure", | |
| "advice","affect","afraid","after","afternoon","again","against","age", | |
| "ago","agree","ahead","aid","air","airplane","alike","alive", | |
| "all","allow","almost","alone","along","aloud","alphabet","already", | |
| "also","although","am","among","amount","ancient","angle","angry", | |
| "animal","announced","another","answer","ants","any","anybody","anyone", | |
| "anything","anyway","anywhere","apart","apartment","appearance","apple","applied", | |
| "appropriate","are","area","arm","army","around","arrange","arrangement", | |
| "arrive","arrow","art","article","as","aside","ask","asleep", | |
| "at","ate","atmosphere","atom","atomic","attached","attack","attempt", | |
| "attention","audience","author","automobile","available","average","avoid","aware", | |
| "away","baby","back","bad","badly","bag","balance","ball", | |
| "balloon","band","bank","bar","bare","bark","barn","base", | |
| "baseball","basic","basis","basket","bat","battle","be","bean", | |
| "bear","beat","beautiful","beauty","became","because","become","becoming", | |
| "bee","been","before","began","beginning","begun","behavior","behind", | |
| "being","believed","bell","belong","below","belt","bend","beneath", | |
| "bent","beside","best","bet","better","between","beyond","bicycle", | |
| "bigger","biggest","bill","birds","birth","birthday","bit","bite", | |
| "black","blank","blanket","blew","blind","block","blood","blow", | |
| "blue","board","boat","body","bone","book","border","born", | |
| "both","bottle","bottom","bound","bow","bowl","box","boy", | |
| "brain","branch","brass","brave","bread","break","breakfast","breath", | |
| "breathe","breathing","breeze","brick","bridge","brief","bright","bring", | |
| "broad","broke","broken","brother","brought","brown","brush","buffalo", | |
| "build","building","built","buried","burn","burst","bus","bush", | |
| "business","busy","but","butter","buy","by","cabin","cage", | |
| "cake","call","calm","came","camera","camp","can","canal", | |
| "cannot","cap","capital","captain","captured","car","carbon","card", | |
| "care","careful","carefully","carried","carry","case","cast","castle", | |
| "cat","catch","cattle","caught","cause","cave","cell","cent", | |
| "center","central","century","certain","certainly","chain","chair","chamber", | |
| "chance","change","changing","chapter","character","characteristic","charge","chart", | |
| "check","cheese","chemical","chest","chicken","chief","child","children", | |
| "choice","choose","chose","chosen","church","circle","circus","citizen", | |
| "city","class","classroom","claws","clay","clean","clear","clearly", | |
| "climate","climb","clock","close","closely","closer","cloth","clothes", | |
| "clothing","cloud","club","coach","coal","coast","coat","coffee", | |
| "cold","collect","college","colony","color","column","combination","combine", | |
| "come","comfortable","coming","command","common","community","company","compare", | |
| "compass","complete","completely","complex","composed","composition","compound","concerned", | |
| "condition","congress","connected","consider","consist","consonant","constantly","construction", | |
| "contain","continent","continued","contrast","control","conversation","cook","cookies", | |
| "cool","copper","copy","corn","corner","correct","correctly","cost", | |
| "cotton","could","count","country","couple","courage","course","court", | |
| "cover","cow","cowboy","crack","cream","create","creature","crew", | |
| "crop","cross","crowd","cry","cup","curious","current","curve", | |
| "customs","cut","cutting","daily","damage","dance","danger","dangerous", | |
| "dark","darkness","date","daughter","dawn","day","dead","deal", | |
| "dear","death","decide","declared","deep","deeply","deer","definition", | |
| "degree","depend","depth","describe","desert","design","desk","detail", | |
| "determine","develop","development","diagram","diameter","did","die","differ", | |
| "difference","different","difficult","difficulty","dig","dinner","direct","direction", | |
| "directly","dirt","dirty","disappear","discover","discovery","discuss","discussion", | |
| "disease","dish","distance","distant","divide","division","do","doctor", | |
| "does","dog","doing","doll","dollar","done","donkey","door", | |
| "dot","double","doubt","down","dozen","draw","drawn","dream", | |
| "dress","drew","dried","drink","drive","driven","driver","driving", | |
| "drop","dropped","drove","dry","duck","due","dug","dull", | |
| "during","dust","duty","each","eager","ear","earlier","early", | |
| "earn","earth","easier","easily","east","easy","eat","eaten", | |
| "edge","education","effect","effort","egg","eight","either","electric", | |
| "electricity","element","elephant","eleven","else","empty","end","enemy", | |
| "energy","engine","engineer","enjoy","enough","enter","entire","entirely", | |
| "environment","equal","equally","equator","equipment","escape","especially","essential", | |
| "establish","even","evening","event","eventually","ever","every","everybody", | |
| "everyone","everything","everywhere","evidence","exact","exactly","examine","example", | |
| "excellent","except","exchange","excited","excitement","exciting","exclaimed","exercise", | |
| "exist","expect","experience","experiment","explain","explanation","explore","express", | |
| "expression","extra","eye","face","facing","fact","factor","factory", | |
| "failed","fair","fairly","fall","fallen","familiar","family","famous", | |
| "far","farm","farmer","farther","fast","fastened","faster","fat", | |
| "father","favorite","fear","feathers","feature","fed","feed","feel", | |
| "feet","fell","fellow","felt","fence","few","fewer","field", | |
| "fierce","fifteen","fifth","fifty","fight","fighting","figure","fill", | |
| "film","final","finally","find","fine","finest","finger","finish", | |
| "fire","fireplace","firm","first","fish","five","fix","flag", | |
| "flame","flat","flew","flies","flight","floating","floor","flow", | |
| "flower","fly","fog","folks","follow","food","foot","football", | |
| "for","force","foreign","forest","forget","forgot","forgotten","form", | |
| "former","fort","forth","forty","forward","fought","found","four", | |
| "fourth","fox","frame","free","freedom","frequently","fresh","friend", | |
| "friendly","frighten","frog","from","front","frozen","fruit","fuel", | |
| "full","fully","fun","function","funny","fur","furniture","further", | |
| "future","gain","game","garage","garden","gas","gasoline","gate", | |
| "gather","gave","general","generally","gentle","gently","get","getting", | |
| "giant","gift","girl","give","given","giving","glad","glass", | |
| "globe","go","goes","gold","golden","gone","good","goose", | |
| "got","government","grabbed","grade","gradually","grain","grandfather","grandmother", | |
| "graph","grass","gravity","gray","great","greater","greatest","greatly", | |
| "green","grew","ground","group","grow","grown","growth","guard", | |
| "guess","guide","gulf","gun","habit","had","hair","half", | |
| "halfway","hall","hand","handle","handsome","hang","happen","happened", | |
| "happily","happy","harbor","hard","harder","hardly","has","hat", | |
| "have","having","hay","he","headed","heading","health","heard", | |
| "hearing","heart","heat","heavy","height","held","hello","help", | |
| "helpful","her","herd","here","herself","hidden","hide","high", | |
| "higher","highest","highway","hill","him","himself","his","history", | |
| "hit","hold","hole","hollow","home","honor","hope","horn", | |
| "horse","hospital","hot","hour","house","how","however","huge", | |
| "human","hundred","hung","hungry","hunt","hunter","hurried","hurry", | |
| "hurt","husband","ice","idea","identity","if","ill","image", | |
| "imagine","immediately","importance","important","impossible","improve","in","inch", | |
| "include","including","income","increase","indeed","independent","indicate","individual", | |
| "industrial","industry","influence","information","inside","instance","instant","instead", | |
| "instrument","interest","interior","into","introduced","invented","involved","iron", | |
| "is","island","it","its","itself","jack","jar","jet", | |
| "job","join","joined","journey","joy","judge","jump","jungle", | |
| "just","keep","kept","key","kids","kill","kind","kitchen", | |
| "knew","knife","know","knowledge","known","label","labor","lack", | |
| "lady","laid","lake","lamp","land","language","large","larger", | |
| "largest","last","late","later","laugh","law","lay","layers", | |
| "lead","leader","leaf","learn","least","leather","leave","leaving", | |
| "led","left","leg","length","lesson","let","letter","level", | |
| "library","lie","life","lift","light","like","likely","limited", | |
| "line","lion","lips","liquid","list","listen","little","live", | |
| "living","load","local","locate","location","log","lonely","long", | |
| "longer","look","loose","lose","loss","lost","lot","loud", | |
| "love","lovely","low","lower","luck","lucky","lunch","lungs", | |
| "lying","machine","machinery","mad","made","magic","magnet","mail", | |
| "main","mainly","major","make","making","man","managed","manner", | |
| "manufacturing","many","map","mark","market","married","mass","massage", | |
| "master","material","mathematics","matter","may","maybe","me","meal", | |
| "mean","means","meant","measure","meat","medicine","meet","melted", | |
| "member","memory","men","mental","merely","met","metal","method", | |
| "mice","middle","might","mighty","mile","military","milk","mill", | |
| "mind","mine","minerals","minute","mirror","missing","mission","mistake", | |
| "mix","mixture","model","modern","molecular","moment","money","monkey", | |
| "month","mood","moon","more","morning","most","mostly","mother", | |
| "motion","motor","mountain","mouse","mouth","move","movement","movie", | |
| "moving","mud","muscle","music","musical","must","my","myself", | |
| "mysterious","nails","name","nation","national","native","natural","naturally", | |
| "nature","near","nearby","nearer","nearest","nearly","necessary","neck", | |
| "needed","needle","needs","negative","neighbor","neighborhood","nervous","nest", | |
| "never","new","news","newspaper","next","nice","night","nine", | |
| "no","nobody","nodded","noise","none","noon","nor","north", | |
| "nose","not","note","noted","nothing","notice","noun","now", | |
| "number","numeral","nuts","object","observe","obtain","occasionally","occur", | |
| "ocean","of","off","offer","office","officer","official","oil", | |
| "old","older","oldest","on","once","one","only","onto", | |
| "open","operation","opinion","opportunity","opposite","or","orange","orbit", | |
| "order","ordinary","organization","organized","origin","original","other","ought", | |
| "our","ourselves","out","outer","outline","outside","over","own", | |
| "owner","oxygen","pack","package","page","paid","pain","paint", | |
| "pair","palace","pale","pan","paper","paragraph","parallel","parent", | |
| "park","part","particles","particular","particularly","partly","parts","party", | |
| "pass","passage","past","path","pattern","pay","peace","pen", | |
| "pencil","people","per","percent","perfect","perfectly","perhaps","period", | |
| "person","personal","pet","phrase","physical","piano","pick","picture", | |
| "pictured","pie","piece","pig","pile","pilot","pine","pink", | |
| "pipe","pitch","place","plain","plan","plane","planet","planned", | |
| "planning","plant","plastic","plate","plates","play","pleasant","please", | |
| "pleasure","plenty","plural","plus","pocket","poem","poet","poetry", | |
| "point","pole","police","policeman","political","pond","pony","pool", | |
| "poor","popular","population","porch","port","position","positive","possible", | |
| "possibly","post","pot","potatoes","pound","pour","powder","power", | |
| "powerful","practical","practice","prepare","present","president","press","pressure", | |
| "pretty","prevent","previous","price","pride","primitive","principal","principle", | |
| "printed","private","prize","probably","problem","process","produce","product", | |
| "production","program","progress","promised","proper","properly","property","protection", | |
| "proud","prove","provide","public","pull","pupil","pure","purple", | |
| "purpose","push","put","putting","quarter","queen","question","quick", | |
| "quickly","quiet","quietly","quite","rabbit","race","radio","railroad", | |
| "rain","raise","ran","ranch","range","rapidly","rate","rather", | |
| "raw","rays","reach","read","reader","ready","real","realize", | |
| "rear","reason","recall","receive","recent","recently","recognize","record", | |
| "red","refer","refused","region","regular","related","relationship","religious", | |
| "remain","remarkable","remember","remove","repeat","replace","replied","report", | |
| "represent","require","research","respect","rest","result","return","review", | |
| "rhyme","rhythm","rice","rich","ride","riding","right","ring", | |
| "rise","rising","river","road","roar","rock","rocket","rocky", | |
| "rod","roll","roof","room","root","rope","rose","rough", | |
| "round","route","row","rubbed","rubber","rule","ruler","run", | |
| "running","rush","sad","saddle","safe","safety","said","sail", | |
| "sale","salmon","salt","same","sand","sang","sat","satellites", | |
| "satisfied","save","saved","saw","say","scale","scared","scene", | |
| "school","science","scientific","scientist","score","screen","sea","search", | |
| "season","seat","second","secret","section","see","seed","seeing", | |
| "seems","seen","seldom","select","selection","sell","send","sense", | |
| "sent","sentence","separate","series","serious","serve","service","sets", | |
| "setting","settle","settlers","seven","several","shade","shadow","shake", | |
| "shaking","shall","shallow","shape","share","sharp","she","sheep", | |
| "sheet","shelf","shells","shelter","shine","shinning","ship","shirt", | |
| "shoe","shoot","shop","shore","short","shorter","shot","should", | |
| "shoulder","shout","show","shown","shut","sick","sides","sight", | |
| "sign","signal","silence","silent","silk","silly","silver","similar", | |
| "simple","simplest","simply","since","sing","single","sink","sister", | |
| "sit","sitting","situation","six","size","skill","skin","sky", | |
| "slabs","slave","sleep","slept","slide","slight","slightly","slip", | |
| "slipped","slope","slow","slowly","small","smaller","smallest","smell", | |
| "smile","smoke","smooth","snake","snow","so","soap","social", | |
| "society","soft","softly","soil","solar","sold","soldier","solid", | |
| "solution","solve","some","somebody","somehow","someone","something","sometime", | |
| "somewhere","son","song","soon","sort","sound","source","south", | |
| "southern","space","speak","special","species","specific","speech","speed", | |
| "spell","spend","spent","spider","spin","spirit","spite","split", | |
| "spoken","sport","spread","spring","square","stage","stairs","stand", | |
| "standard","star","stared","start","state","statement","station","stay", | |
| "steady","steam","steel","steep","stems","step","stepped","stick", | |
| "stiff","still","stock","stomach","stone","stood","stop","stopped", | |
| "store","storm","story","stove","straight","strange","stranger","straw", | |
| "stream","street","strength","stretch","strike","string","strip","strong", | |
| "stronger","struck","structure","struggle","stuck","student","studied","studying", | |
| "subject","substance","success","successful","such","sudden","suddenly","sugar", | |
| "suggest","suit","sum","summer","sun","sunlight","supper","supply", | |
| "support","suppose","sure","surface","surprise","surrounded","swam","sweet", | |
| "swept","swim","swimming","swing","swung","syllable","symbol","system", | |
| "table","tail","take","taken","tales","talk","tall","tank", | |
| "tape","task","taste","taught","tax","tea","teach","teacher", | |
| "team","tears","teeth","telephone","television","tell","temperature","ten", | |
| "tent","term","terrible","test","than","thank","that","thee", | |
| "them","themselves","then","theory","there","therefore","these","they", | |
| "thick","thin","thing","think","third","thirty","this","those", | |
| "thou","though","thought","thousand","thread","three","threw","throat", | |
| "through","throughout","throw","thrown","thumb","thus","thy","tide", | |
| "tie","tight","tightly","till","time","tin","tiny","tip", | |
| "tired","title","to","tobacco","today","together","told","tomorrow", | |
| "tone","tongue","tonight","too","took","tool","top","topic", | |
| "torn","total","touch","toward","tower","town","toy","trace", | |
| "track","trade","traffic","trail","train","transportation","trap","travel", | |
| "treated","tree","triangle","tribe","trick","tried","trip","troops", | |
| "tropical","trouble","truck","trunk","truth","try","tube","tune", | |
| "turn","twelve","twenty","twice","two","type","typical","uncle", | |
| "under","underline","understanding","unhappy","union","unit","universe","unknown", | |
| "unless","until","unusual","up","upon","upper","upward","us", | |
| "use","useful","using","usual","usually","valley","valuable","value", | |
| "vapor","variety","various","vast","vegetable","verb","vertical","very", | |
| "vessels","victory","view","village","visit","visitor","voice","volume", | |
| "vote","vowel","voyage","wagon","wait","walk","wall","want", | |
| "war","warm","warn","was","wash","waste","watch","water", | |
| "wave","way","we","weak","wealth","wear","weather","week", | |
| "weigh","weight","welcome","well","went","were","west","western", | |
| "wet","whale","what","whatever","wheat","wheel","when","whenever", | |
| "where","wherever","whether","which","while","whispered","whistle","white", | |
| "who","whole","whom","whose","why","wide","widely","wife", | |
| "wild","will","willing","win","wind","window","wing","winter", | |
| "wire","wise","wish","with","within","without","wolf","women", | |
| "won","wonder","wonderful","wood","wooden","wool","word","wore", | |
| "work","worker","world","worried","worry","worse","worth","would", | |
| "wrapped","write","writer","writing","written","wrong","wrote","yard", | |
| "year","yellow","yes","yesterday","yet","you","young","younger", | |
| "your","yourself","youth","zero","zoo" | |
| ]; | |
| // Get some entropy from the system clock: | |
| function xkcd_pw_gen_time_ent() | |
| { | |
| var d = 1 * new Date(); | |
| var i = 0; | |
| while (1 * new Date() == d) | |
| i++; // Measure iterations until next tick | |
| return "" + d + i; | |
| } | |
| // Return a pseudorandom array of four 32-bit integers: | |
| function xkcd_pw_gen_create_hash() | |
| { | |
| // Entropy string built in a manner inspired by David Finch: | |
| var entropy = xkcd_pw_gen_server_hash + xkcd_pw_gen_time_ent(); | |
| entropy += navigator.userAgent + Math.random() + Math.random() + screen.width + screen.height; | |
| if (document.all) | |
| entropy = entropy + document.body.clientWidth + document.body.clientHeight + document.body.scrollWidth + document.body.scrollHeight; | |
| else | |
| entropy = entropy + window.innerWidth + window.innerHeight + window.width + window.height; | |
| entropy += xkcd_pw_gen_time_ent(); | |
| // Hash and convert to 32-bit integers: | |
| var hexString = hex_sha1(entropy); // from sha1-min.js | |
| var result = []; | |
| for (var i = 0; i < 32; i += 8) | |
| { | |
| result.push(parseInt(hexString.substr(i, 8), 16)); | |
| } | |
| return result; | |
| } | |
| function toProperCase(s) { | |
| return s.toLowerCase().replace(/^(.)|\s(.)/g, function($1) { return $1.toUpperCase(); }); | |
| } | |
| function randomCase(s) { | |
| var r = Math.floor((Math.random() * s.length)); | |
| if (r === 0) { return s.charAt(r).toUpperCase() + s.slice(1); } | |
| if (r === s.length-1) { return s.slice(0, s.length) + s.charAt(r).toUpperCase(); } | |
| else { return s.slice(0, r) + s.charAt(r).toUpperCase() + s.slice(r); } | |
| } | |
| function replaceChar(i, s, c) { | |
| if (i === 0) { return c + s.slice(1); } | |
| if (i === s.length-1) { return s.slice(0, s.length) + c; } | |
| else { return s.slice(0, i) + c + s.slice(i); } | |
| } | |
| function checkLength() { | |
| var length = document.getElementById("length").value; | |
| var joinChar = document.getElementById("joinChar").value; | |
| length -= ((joinChar.length) * (numWords-1)); | |
| if (length <=14) { | |
| document.getElementById("joinChar").disabled = true; | |
| } | |
| else { | |
| document.getElementById("joinChar").disabled = false; | |
| } | |
| } | |
| function regexOnce_All(old, s) { | |
| for(var i=0; old==s && i<s.length; i++) { | |
| var c = s.charAt(i); | |
| if (c=='a' || c=='A') { s = s.replace(/a|A/, '@'); } | |
| if (c=='b' || c=='B') { s = s.replace(/b|B/, '8'); } | |
| if (c=='c' || c=='C') { s = s.replace(/c|C/, '('); } | |
| if (c=='e' || c=='E') { s = s.replace(/e|E/, '3'); } | |
| if (c=='i' || c=='I') { s = s.replace(/i|I/, '!'); } | |
| if (c=='l' || c=='L') { s = s.replace(/l|L/, '|'); } | |
| if (c=='o' || c=='O') { s = s.replace(/o|O/, '0'); } | |
| if (c=='p' || c=='P') { s = s.replace(/p|P/, '%'); } | |
| if (c=='s' || c=='S') { s = s.replace(/s|S/, '$'); } | |
| if (c=='x' || c=='X') { s = s.replace(/x|X/, '*'); } | |
| } | |
| return s; | |
| } | |
| function regexOnce_Num(old, s) { | |
| for(var i=0; old==s && i<s.length; i++) { | |
| var c = s.charAt(i); | |
| if (c=='a' || c=='A') { s = s.replace(/a|A/, '4'); } | |
| if (c=='b' || c=='B') { s = s.replace(/b|B/, '8'); } | |
| if (c=='e' || c=='E') { s = s.replace(/e|E/, '3'); } | |
| if (c=='i' || c=='I') { s = s.replace(/i|I/, '1'); } | |
| if (c=='o' || c=='O') { s = s.replace(/o|O/, '0'); } | |
| if (c=='s' || c=='S') { s = s.replace(/s|S/, '5'); } | |
| } | |
| return s; | |
| } | |
| function regexOnce_Sym(old, s) { | |
| for(var i=0; old==s && i<s.length; i++) { | |
| var c = s.charAt(i); | |
| if (c=='a' || c=='A') { s = s.replace(/a|A/, '@'); } | |
| if (c=='c' || c=='C') { s = s.replace(/c|C/, '('); } | |
| if (c=='i' || c=='I') { s = s.replace(/i|I/, '!'); } | |
| if (c=='l' || c=='L') { s = s.replace(/l|L/, '|'); } | |
| if (c=='p' || c=='P') { s = s.replace(/p|P/, '%'); } | |
| if (c=='s' || c=='S') { s = s.replace(/s|S/, '$'); } | |
| if (c=='x' || c=='X') { s = s.replace(/x|X/, '*'); } | |
| } | |
| return s; | |
| } | |
| // Generate a new passphrase and update the document: | |
| function xkcd_pw_gen() //removed php > < | |
| { | |
| var hash = xkcd_pw_gen_create_hash(); | |
| var choices = []; | |
| var numWords = document.getElementById("numWords").value; | |
| var length = document.getElementById("length").value; | |
| var joinChar = ""; | |
| if (length > 16) { | |
| joinChar = document.getElementById("joinChar").value; | |
| length -= ((joinChar.length) * (numWords-1)); | |
| } | |
| var caps = document.getElementById("caps").value; | |
| var camelFirstWordSkipped = false; | |
| var subs = document.getElementById("subs").value; | |
| var numSubs = document.getElementById("numSubs").value; | |
| var w = 0; | |
| var xkcd_pw_gen_wordlist_lastSubset = []; | |
| var xkcd_pw_gen_wordlist_subset = []; | |
| var maxSubsetLength = length+1; //force subset generation first time it's needed | |
| while ( w < numWords) { | |
| var jsRandom = Math.floor(Math.random() * 0x100000000); | |
| var index = ((jsRandom ^ hash[w]) + 0x100000000) % xkcd_pw_gen_wordlist.length; | |
| var nextPick = xkcd_pw_gen_wordlist[index]; | |
| if (length-nextPick.length < 0) { | |
| //lazyload xkcd_pw_gen_wordlist_subset | |
| if (xkcd_pw_gen_wordlist_subset.length == 0) { | |
| xkcd_pw_gen_wordlist_lastSubset = xkcd_pw_gen_wordlist; | |
| } | |
| if (maxSubsetLength > length){ | |
| xkcd_pw_gen_wordlist_lastSubset = xkcd_pw_gen_wordlist_subset; | |
| xkcd_pw_gen_wordlist_subset = []; | |
| maxSubsetLength = length; | |
| var wordlistLength = xkcd_pw_gen_wordlist_lastSubset.length; | |
| for(var i=0; i<wordlistLength; i++){ | |
| var nextWord = xkcd_pw_gen_wordlist_lastSubset[i]; | |
| if (nextWord.length <= maxSubsetLength) { | |
| xkcd_pw_gen_wordlist_subset.push(nextWord); | |
| } | |
| } | |
| } | |
| if (xkcd_pw_gen_wordlist_subset.length == 0) { | |
| //try again from scratch | |
| xkcd_pw_gen(); | |
| return; | |
| } | |
| jsRandom = Math.floor(Math.random() * 0x100000000); | |
| index = ((jsRandom ^ hash[w]) + 0x100000000) % xkcd_pw_gen_wordlist_subset.length; | |
| nextPick = xkcd_pw_gen_wordlist_subset[index]; | |
| } | |
| length -= nextPick.length; | |
| if (caps!="none") { | |
| if (caps=="proper") { nextPick = toProperCase(nextPick); } | |
| else if (caps=="camel") { | |
| if (!camelFirstWordSkipped) { camelFirstWordSkipped = true; } | |
| else { nextPick = toProperCase(nextPick); } | |
| } | |
| else if (caps=="random") { nextPick = randomCase(nextPick); } | |
| else if (caps=="all") { nextPick = nextPick.toUpperCase(); } | |
| } | |
| if (subs!="none" && numSubs=="onePerWord") { | |
| var oldNextPick = nextPick; | |
| if (subs=="all") { | |
| nextPick = regexOnce_All(oldNextPick, nextPick); | |
| } | |
| else if (subs=="num") { | |
| nextPick = regexOnce_Num(oldNextPick, nextPick); | |
| } | |
| else if (subs=="sym") { | |
| nextPick = regexOnce_Sym(oldNextPick, nextPick); | |
| } | |
| } | |
| choices.push(nextPick); | |
| w++; | |
| } | |
| var output = choices.join(joinChar); | |
| var newOutput = output; | |
| if (subs!="none") { | |
| if (subs=="all") { | |
| if (numSubs=="first") { | |
| newOutput = regexOnce_All(output, newOutput); | |
| } | |
| else if(numSubs=="all") { | |
| newOutput = newOutput.replace(/a|A/g, '@'); | |
| newOutput = newOutput.replace(/b|B/g, '8'); | |
| newOutput = newOutput.replace(/c|C/g, '('); | |
| newOutput = newOutput.replace(/e|E/g, '3'); | |
| newOutput = newOutput.replace(/i|I/g, '!'); | |
| newOutput = newOutput.replace(/l|L/g, '|'); | |
| newOutput = newOutput.replace(/o|O/g, '0'); | |
| newOutput = newOutput.replace(/p|P/g, '%'); | |
| newOutput = newOutput.replace(/s|S/g, '5'); | |
| newOutput = newOutput.replace(/x|X/g, '*'); | |
| } | |
| else if (numSubs=="oneEach") { | |
| for(var j=0; newOutput==output && j<output.length*2; j++) { | |
| var i = Math.floor((Math.random() * newOutput.length)); | |
| var c = newOutput.charAt(i); | |
| if (c=='a' || c=='A') { newOutput = newOutput.replace(/a|A/, '4'); } | |
| if (c=='b' || c=='B') { newOutput = newOutput.replace(/b|B/, '8'); } | |
| if (c=='i' || c=='I') { newOutput = newOutput.replace(/i|I/, '1'); } | |
| if (c=='o' || c=='O') { newOutput = newOutput.replace(/o|O/, '0'); } | |
| if (c=='s' || c=='S') { newOutput = newOutput.replace(/s|S/, '5'); } | |
| } | |
| output = newOutput; | |
| for(var j=0; newOutput==output && j<output.length*2; j++) { | |
| var i = Math.floor((Math.random() * newOutput.length)); | |
| var c = newOutput.charAt(i); | |
| if (c=='a' || c=='A') { newOutput = newOutput.replace(/a|A/, '@'); } | |
| if (c=='c' || c=='C') { newOutput = newOutput.replace(/c|C/, '('); } | |
| if (c=='i' || c=='I') { newOutput = newOutput.replace(/i|I/, '!'); } | |
| if (c=='l' || c=='L') { newOutput = newOutput.replace(/l|L/, '|'); } | |
| if (c=='p' || c=='P') { newOutput = newOutput.replace(/p|P/, '%'); } | |
| if (c=='s' || c=='S') { newOutput = newOutput.replace(/s|S/, '$'); } | |
| if (c=='x' || c=='X') { newOutput = newOutput.replace(/x|X/, '*'); } | |
| } | |
| } | |
| } | |
| else if (subs=="num") { | |
| if (numSubs=="first") { | |
| newOutput = regexOnce_Num(output, newOutput); | |
| } | |
| else if (numSubs=="oneEach") { | |
| for(var j=0; newOutput==output && j<output.length*2; j++) { | |
| var i = Math.floor((Math.random() * newOutput.length)); | |
| var c = newOutput.charAt(i); | |
| if (c=='a' || c=='A') { newOutput = newOutput.replace(/a|A/, '4'); } | |
| if (c=='b' || c=='B') { newOutput = newOutput.replace(/b|B/, '8'); } | |
| if (c=='i' || c=='I') { newOutput = newOutput.replace(/i|I/, '1'); } | |
| if (c=='o' || c=='O') { newOutput = newOutput.replace(/o|O/, '0'); } | |
| if (c=='s' || c=='S') { newOutput = newOutput.replace(/s|S/, '5'); } | |
| } | |
| } | |
| else if (numSubs=="all"){ | |
| newOuput = newOutput.replace(/b|B/g, '8'); | |
| newOuput = newOutput.replace(/e|E/g, '3'); | |
| newOuput = newOutput.replace(/o|O/g, '0'); | |
| newOuput = newOutput.replace(/s|S/g, '5'); | |
| } | |
| } | |
| else if (subs=="sym") { | |
| if (numSubs=="first") { | |
| newOutput = regexOnce_Sym(output, newOutput); | |
| } | |
| else if (numSubs=="oneEach") { | |
| for(var j=0; newOutput==output && j<output.length*2; j++) { | |
| var i = Math.floor((Math.random() * newOutput.length)); | |
| var c = newOutput.charAt(i); | |
| if (c=='a' || c=='A') { newOutput = newOutput.replace(/a|A/, '@'); } | |
| if (c=='c' || c=='C') { newOutput = newOutput.replace(/c|C/, '('); } | |
| if (c=='i' || c=='I') { newOutput = newOutput.replace(/i|I/, '!'); } | |
| if (c=='l' || c=='L') { newOutput = newOutput.replace(/l|L/, '|'); } | |
| if (c=='p' || c=='P') { newOutput = newOutput.replace(/p|P/, '%'); } | |
| if (c=='s' || c=='S') { newOutput = newOutput.replace(/s|S/, '$'); } | |
| if (c=='x' || c=='X') { newOutput = newOutput.replace(/x|X/, '*'); } | |
| } | |
| } | |
| else if (numSubs=="all"){ //numSubs == all | |
| newOuput = newOutput.replace(/a|A/g, '@'); | |
| newOuput = newOutput.replace(/c|C/g, '('); | |
| newOuput = newOutput.replace(/i|I/g, '!'); | |
| newOuput = newOutput.replace(/l|L/g, '|'); | |
| newOuput = newOutput.replace(/p|P/g, '%'); | |
| newOuput = newOutput.replace(/s|S/g, '$'); | |
| newOuput = newOutput.replace(/x|X/g, '*'); | |
| } | |
| } | |
| } | |
| var resultSpan = document.getElementById("xkcd_pw_gen_result"); | |
| resultSpan.innerText = resultSpan.textContent = newOutput; | |
| } | |
| window.onload = function() { | |
| xkcd_pw_gen(); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment