home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume16 / obvious-pw < prev    next >
Text File  |  1988-11-09  |  20KB  |  396 lines

  1. Path: rsalz
  2. From: rsalz@uunet.uu.net (Rich Salz)
  3. Newsgroups: comp.sources.unix
  4. Subject: v16i060:  Tell if a password is "obvious"
  5. Message-ID: <1175@fig.bbn.com>
  6. Date: 10 Nov 88 14:47:09 GMT
  7. Lines: 386
  8. Approved: rsalz@uunet.UU.NET
  9.  
  10. Submitted-by: "John B. Nagle" <jbn@glacier.stanford.edu>
  11. Posting-number: Volume 16, Issue 60
  12. Archive-name: obvious-pw
  13.  
  14. [  This program does NOT try brute-force methods to guess passwords,
  15.    but instead tells if a password is an "obvious" one likely to be
  16.    guessed by such a program.  Given the, ahh, recent heightened
  17.    interest in security right now, I'm posting this right away.
  18.    Folks with source might want to merge this into their passwd
  19.    program; folks without should consider trying to merge it in
  20.    as a front end, at the cost of making people type their password
  21.    three times, and they could change it for times two and three, but
  22.    it's better than nothing. --r$  ]
  23.  
  24. #! /bin/sh
  25. : This is a shar archive.  Extract with sh, not csh.
  26. echo x - obvious.doc
  27. cat > obvious.doc << '1206!Funky!Stuff!'
  28.                    An Obvious Password Detector
  29.  
  30.                            John Nagle
  31.  
  32.      Given a free choice, altogether too many users choose passwords
  33. that can be easily guessed.  Dennis Richie, in his "Notes on the
  34. Security of UNIX", comments .....
  35. XXXX, in "The Hacker Papers", has harsher comments.  With
  36. passwords the only line of defense in many systems, it's often
  37. desirable to prevent users from choosing ones that leave the system
  38. wide open to any cracker.
  39.      
  40.      This small subroutine uses a little-known property of the English
  41. language to detect candidate passwords that might be easy to guess.
  42. The subroutine should be built into the password-changing utility
  43. function of the system, so that all new passwords must be considered
  44. "non-obvious" to be accepted.  
  45.  
  46.      The algorithm depends upon a subtle property of English.  Less
  47. than one-third of the possible "triples", sequences of three letters,
  48. are used in English words.  This property makes it possible to
  49. distinguish random letter strings from strings that look like English
  50. words.  The word "password", for example, contains the five triples
  51.  
  52.           "pas"
  53.           "ass"
  54.           "ssw"
  55.           "wor"
  56.           "ord"
  57.  
  58. All five of these triples, therefore, are used in English.  The triple
  59. "xqy", on the other hand, appears in no common English word.  In
  60. general, a triple chosen at random has only one chance in three of
  61. appearing in any English word.  Starting with a suitable large list of
  62. words, such as a dictionary, we can make a table of all the triples
  63. that appear in the list of words.  We can then test words against the
  64. table by extracting all triples from the word and looking up the
  65. triples in the table.  If the word contains several triples that
  66. are not in the table, it is almost certaintly not an English word, and
  67. definitely non-obvious.
  68.  
  69.      The table of triples seems at first unwieldy, but a compact
  70. representation is possible.  The table in the subroutine is essentially a
  71. 3-dimensional Boolean array, 27 x 27 x 27.  There are thus 19,683
  72. slots in the table, each containing one bit.  C does not provide a
  73. built-in representation for packed Boolean arrays, so the third
  74. dimension of the array is handled by using a "long" value for each
  75. group of 27 bits.  Letters are mapped to the range 1..27, so that "a"
  76. or "A" is represented by 1, "b" or "B" by 2, and so forth.
  77. Non-letters are mapped to zero.  For every possible sequence of three
  78. letters, then, there is a unique bit in the table.  That bit is a 1 if
  79. the three letter sequence is used in English.  So we can take any
  80. sequence of three letters, look it up in the table, and find out if it
  81. is a triple known to be used in the English language.
  82.  
  83.      The triple "pas", for example, maps to triple number (16,1,19).
  84. Array element [16,1] in the table is hex 07fffabc, and bit 19 of that
  85. value is a 1.  So, the triple "pas" is known to be used in some
  86. existing word, and the odds are that the word from which the triple
  87. was drawn is an English word or looks like one.
  88.  
  89.      The table was built with a program that extracted all the triples
  90. in the UNIX spelling dictionary and set the appropriate bit for each
  91. triple.  Along with the UNIX list of words, a few other obvious
  92. patterns were thrown in; the sequences "aaa", "bbb", and so forth, the
  93. alphabet, and the rows of the "qwerty" typewriter keyboard.  Building
  94. the table is a straightforward process, and, with a machine-readable
  95. dictionary or just a large body of text to use as raw data, you can
  96. write your own table-builder and build a table of your own.  Any
  97. table, though, based upon a list of English words, will be very
  98. similar to the one given here.  The triple statistics are a real
  99. property of English, not an artifact of the word list used.
  100.  
  101.      This is definitely a detector for obvious ENGLISH words.  Words
  102. in other languages, particularly ones distant from English, often
  103. pass.  "Bejing" and "Timbuktu" are considered non-obvious.
  104.  
  105.      The test considers any word with at least two triples not found
  106. in the table to be non-obvious.  This makes the odds quite good that a
  107. randomly chosen string of letters will pass and be considered
  108. non-obvious, and thus a suitable password.  More than 95% of all
  109. eight-letter sequences chosen at random will pass.  Even for a
  110. five-letter sequence, the minimum considered a good defense against
  111. trying all possibilities, most randomly chosen sequences will pass.
  112. But every word in the UNIX dictionary, and almost all English words
  113. generally, will be rejected as obvious.
  114.  
  115.      This technique isn't idiot-proof.  It is possible, with effort,
  116. to come up with an easily-guessed password that will pass the test.
  117. But it's more work than coming up with a good password.
  118. 1206!Funky!Stuff!
  119. echo x - obvious.c
  120. cat > obvious.c << '1206!Funky!Stuff!'
  121. /*
  122.     Obvious    password detection subroutine.
  123.  
  124.     Call:
  125.  
  126.         char word[];
  127.         char *obvious(word);
  128.  
  129.     Returns    0 if password is acceptable.
  130.     Returns    a pointer to a static message if the password is unacceptable.
  131.  
  132.     The algorithm used requires that the length of the password be
  133.     within configurable length limits, and that the    password not
  134.     have triplet statistics    similar    to those associated with words
  135.     in the English language.  This is an inversion of a technique
  136.     used to    find spelling errors without a full dictionary.     No
  137.     word in    the UNIX spelling dictionary will pass this algorithm.
  138.  
  139.     Users should be    advised    to pick    a password composed of random
  140.     letters    and numbers.  Eight randomly chosen letters will
  141.     pass the algorithm over    95% of the time.  A word prefaced
  142.     by a digit will    not pass the algorithm,    although a word
  143.     with a digit in    the middle usually will.  Two words run
  144.     together will often pass.
  145.  
  146.     In the interest    of greater network security, this algorithm
  147.     is offered to the ARPANET community as a proposed standard technique
  148.     for eliminating    obvious    passwords.
  149.  
  150.                 John Nagle
  151.                 Ford Aerospace and Communications Corporation
  152.                 Western    Development Laboratories
  153.                 3939 Fabian Way
  154.                 Palo Alto, CA  94303
  155.                 
  156.                 1/16/84
  157.                 [ John is now at Stanford:
  158.                     jbn@glacier.stanford.edu ]
  159. */
  160. /*
  161.         Table of triple    usage in text
  162.  
  163.         24511 words were used to make this table.
  164.         The words came from the    files:
  165.             /usr/dict/words
  166.             obvpats.lp
  167.  
  168.         The table is 30    percent    populated.
  169. */
  170. long obvtab[27][27] =
  171. {
  172.     {    0X00100001, 0X00040000,    0X00040000, 0X00009000,    0X00808020, 0X00140000,    
  173.     0X00000000, 0X00080000,    0X00000002, 0X00000000,    0X00000000, 0X00000000,    
  174.     0X00001020, 0X00000000,    0X00000010, 0X00000020,    0X00000000, 0X00000000,    
  175.     0X00000030, 0X00300100,    0X00000100, 0X00000000,    0X00000020, 0X00000000,    
  176.     0X00000000, 0X00000000,    0X00000000 },
  177.     {    0X00090000, 0X000c708a,    0X022cd73e, 0X023ffbbe,    0X02fffffe, 0X002cd0da,    
  178.     0X023cdae2, 0X02adf3b6,    0X0024f222, 0X00dd7efa,    0X00008022, 0X02b5937a,    
  179.     0X06fdfbfe, 0X02bdf37e,    0X07ffdfff, 0X003c3248,    0X023dfb76, 0X00200000,    
  180.     0X07fffffe, 0X02bbfbbe,    0X06bcfb6f, 0X055f7dfc,    0X02609232, 0X021cfbf6,    
  181.     0X02999222, 0X00bdf3ff,    0X06308232 },
  182.     {    0X00080000, 0X07fdfbfc,    0X022c9226, 0X00008012,    0X00248222, 0X07dffbfe,    
  183.     0X00200000, 0X00000000,    0X00208020, 0X047ffdfe,    0X00000020, 0X00000000,    
  184.     0X02208222, 0X00800220,    0X0000a022, 0X03fdfffe,    0X00048000, 0X00000000,    
  185.     0X02208222, 0X00308228,    0X00049062, 0X071efefc,    0X00000220, 0X00000020,    
  186.     0X00000000, 0X049d11a2,    0X00000000 },
  187.     {    0X00080080, 0X02fffffe,    0X000c0020, 0X0024932a,    0X0000802a, 0X06bdf3fe,    
  188.     0X00000002, 0X00248220,    0X02bdf3fe, 0X007df0fe,    0X00000000, 0X02bdfffe,    
  189.     0X02208222, 0X00200222,    0X00008222, 0X07fffffe,    0X00000102, 0X00200000,    
  190.     0X02308222, 0X00188200,    0X02aca262, 0X003df27e,    0X00000004, 0X00000000,    
  191.     0X00000000, 0X001dd08e,    0X00000022 },
  192.     {    0X00088022, 0X06fd7bfc,    0X02249222, 0X00209102,    0X02249332, 0X07fff7fe,    
  193.     0X00249282, 0X02a43a22,    0X00008222, 0X05fdf3fe,    0X00208022, 0X00000220,    
  194.     0X02208222, 0X00208222,    0X00008223, 0X07fdf3fe,    0X00049322, 0X00200000,    
  195.     0X02208222, 0X0091bb2a,    0X00008302, 0X043dfafe,    0X00008222, 0X02048222,    
  196.     0X00000000, 0X00987aef,    0X00200000 },
  197.     {    0X004c1030, 0X04ff79dc,    0X023c9226, 0X023c9b3a,    0X02bdf3fe, 0X04ddfbfe,    
  198.     0X023c92fa, 0X0224f3e6,    0X0224a222, 0X045d7afa,    0X00208022, 0X0218ca36,    
  199.     0X02fdfbfe, 0X02a9f22e,    0X06ffffff, 0X05fd73d8,    0X02bdb32e, 0X00200000,    
  200.     0X07fffffe, 0X02fbfbbe,    0X06bdfb6e, 0X005d78bc,    0X066c8222, 0X029df37e,    
  201.     0X0333832a, 0X008df97f,    0X06648222 },
  202.     {    0X00080000, 0X07bc7bfe,    0X00000222, 0X0000000a,    0X00008002, 0X02fc7abe,    
  203.     0X022cb366, 0X00000102,    0X00000022, 0X055c70fe,    0X00008000, 0X00000002,    
  204.     0X02208222, 0X0000000a,    0X00000200, 0X03edf2be,    0X00000008, 0X00000000,    
  205.     0X02208222, 0X00118922,    0X028ca32e, 0X041c74b8,    0X00000000, 0X00000002,    
  206.     0X00000000, 0X00000000,    0X00000000 },
  207.     {    0X00080000, 0X06fdf3fc,    0X00008222, 0X00000000,    0X00008022, 0X02fdf3fe,    
  208.     0X00240220, 0X020d93a2,    0X02bddffe, 0X047df0fe,    0X00000002, 0X00008200,    
  209.     0X02208222, 0X02300222,    0X00318226, 0X02fdf3fe,    0X00009220, 0X00000000,    
  210.     0X02208222, 0X00919b06,    0X00048302, 0X061cf2ee,    0X00000000, 0X02048022,    
  211.     0X00000000, 0X00056002,    0X00000002 },
  212.     {    0X00080000, 0X06fdfbfe,    0X02249222, 0X00048102,    0X00048202, 0X07fff2ff,    
  213.     0X00208202, 0X00008022,    0X00008122, 0X047dfcfe,    0X00000800, 0X00008220,    
  214.     0X02248222, 0X0008a222,    0X0028c222, 0X06fdfeff,    0X00209202, 0X00200000,    
  215.     0X02249232, 0X00108302,    0X02bdf3fa, 0X071d71fe,    0X00000200, 0X00008322,    
  216.     0X00000000, 0X011d32be,    0X00000000 },
  217.     {    0X00483010, 0X05dd7bbc,    0X022cf226, 0X023cdb2a,    0X02bdf6b6, 0X04fd79fc,    
  218.     0X0234d262, 0X063df3a2,    0X00000222, 0X00000202,    0X00208002, 0X02208a22,    
  219.     0X02fdbbfe, 0X022df36e,    0X07ffffff, 0X05fd70be,    0X02bdb766, 0X00200000,    
  220.     0X02fdfafe, 0X02ffffff,    0X06bdfb6f, 0X000c7008,    0X02248222, 0X00008202,    
  221.     0X023082e2, 0X00000002,    0X04608022 },
  222.     {    0X00080000, 0X07ed7bbc,    0X00000000, 0X00000000,    0X00000000, 0X009cd57a,    
  223.     0X00000000, 0X00000000,    0X00000000, 0X005070c4,    0X00000400, 0X00001000,    
  224.     0X00000000, 0X00000000,    0X00000000, 0X02fc5bae,    0X00000000, 0X00000000,    
  225.     0X00000000, 0X00000000,    0X00000000, 0X015d7e96,    0X00000000, 0X00000000,    
  226.     0X00000000, 0X00000000,    0X00000000 },
  227.     {    0X00080000, 0X07fdfff4,    0X00248222, 0X00040302,    0X00048022, 0X02fdf3f6,    
  228.     0X00208222, 0X00048000,    0X0014a022, 0X00ddf8fe,    0X00000002, 0X0000ca22,    
  229.     0X0220a222, 0X00000022,    0X00208222, 0X01fdfb7a,    0X00009202, 0X00000000,    
  230.     0X02208222, 0X02b1abae,    0X00048302, 0X029d7110,    0X00000000, 0X00008322,    
  231.     0X00000000, 0X00ac9522,    0X00000000 },
  232.     {    0X00088000, 0X07fffbfe,    0X02249222, 0X0234b322,    0X02bdf36e, 0X07fdfffe,    
  233.     0X00bc93e6, 0X00048222,    0X00008222, 0X05fffdfe,    0X00008000, 0X0288d322,    
  234.     0X02bdb7fe, 0X0228e332,    0X00208020, 0X07fffffe,    0X021ca362, 0X00000000,    
  235.     0X02208022, 0X0299ab26,    0X06eca326, 0X055dfefe,    0X00008222, 0X02008322,    
  236.     0X00000000, 0X00bdfbfe,    0X00000022 },
  237.     {    0X00080000, 0X07fdffbc,    0X002dd236, 0X0021fbfe,    0X00008020, 0X07ddfbfe,    
  238.     0X00209220, 0X00000000,    0X00208020, 0X053efcfa,    0X00000000, 0X00000000,    
  239.     0X00008222, 0X0220a222,    0X02208222, 0X07fdfbfe,    0X023c9be6, 0X00200000,    
  240.     0X00088002, 0X0239a37c,    0X00048120, 0X041dfaf8,    0X00000020, 0X00008222,    
  241.     0X00000000, 0X001cd0a8,    0X00000000 },
  242.     {    0X00180000, 0X06fdfbfe,    0X002c922a, 0X02349b22,    0X02bffffe, 0X07fff3ff,    
  243.     0X00249222, 0X02bdbb76,    0X02208222, 0X057ffbfe,    0X00208022, 0X021d33ea,    
  244.     0X02008222, 0X00008222,    0X0228c222, 0X07fdf2fe,    0X00209220, 0X00200000,    
  245.     0X0220822a, 0X02fdfbfe,    0X06adf3ee, 0X043dfafe,    0X02208222, 0X00048322,    
  246.     0X00100200, 0X01ffb11e,    0X02808222 },
  247.     {    0X0008113c, 0X017f79da,    0X02fcd77e, 0X02349b2a,    0X02adfbfe, 0X037ef35c,    
  248.     0X0234b262, 0X02bcf7f6,    0X0204f222, 0X011c58fe,    0X00008222, 0X02a99b2e,    
  249.     0X06fdfbfe, 0X02aff36e,    0X07ffffff, 0X045df9dc,    0X02bffbae, 0X00200000,    
  250.     0X06fffbfe, 0X02fbbbae,    0X02bdf3ee, 0X055f73ff,    0X02008a22, 0X06bdfb7e,    
  251.     0X02d043ea, 0X001dd37e,    0X06008222 },
  252.     {    0X00080000, 0X07fffabc,    0X002c9022, 0X00008100,    0X00040002, 0X07fdfefe,    
  253.     0X00241220, 0X00040002,    0X023cd232, 0X057ff8fa,    0X00000002, 0X00000220,    
  254.     0X02208222, 0X00208022,    0X00008020, 0X03fdfafa,    0X022db322, 0X00040000,    
  255.     0X02208222, 0X02b0bb2a,    0X0224832a, 0X041d7afe,    0X00000008, 0X00048202,    
  256.     0X00000000, 0X00949b86,    0X00000000 },
  257.     {    0X00080000, 0X00100000,    0X00000000, 0X00000000,    0X00000000, 0X00000010,    
  258.     0X00000000, 0X00000000,    0X00000000, 0X00000000,    0X00000000, 0X00000000,    
  259.     0X00000000, 0X00000000,    0X00000000, 0X00000000,    0X00000000, 0X00020000,    
  260.     0X00080000, 0X00000000,    0X00000000, 0X02008222,    0X00000000, 0X00000020,    
  261.     0X00000000, 0X00000000,    0X00000000 },
  262.     {    0X00080010, 0X07fffffc,    0X022c9222, 0X023c9b2a,    0X02bdd366, 0X07ffffff,    
  263.     0X00249222, 0X022cb322,    0X02208222, 0X07fbfdfe,    0X00208020, 0X029df336,    
  264.     0X02b98236, 0X0239936e,    0X02b9ab66, 0X07fffffe,    0X023cb322, 0X00200000,    
  265.     0X02248322, 0X02f3fb7e,    0X06bcf3ee, 0X01ddf2fe,    0X02208222, 0X00008222,    
  266.     0X00000020, 0X0099f0be,    0X00008222 },
  267.     {    0X00081000, 0X03fdfffe,    0X02248222, 0X0224b323,    0X00248242, 0X07fffbfe,    
  268.     0X02208222, 0X002c8220,    0X02f5fa6e, 0X057ff8fe,    0X00200000, 0X0224a222,    
  269.     0X02208222, 0X02208222,    0X02208223, 0X06f5f7fe,    0X022c9326, 0X00200000,    
  270.     0X00288222, 0X02bdf36e,    0X02edf7ff, 0X041df2fe,    0X00010220, 0X00248222,    
  271.     0X00000000, 0X001d78bc,    0X00000000 },
  272.     {    0X001c1010, 0X03fdfbfc,    0X00248222, 0X02249102,    0X00048000, 0X03fdfbfe,    
  273.     0X00249222, 0X00248022,    0X02bffbfe, 0X047ff8fe,    0X00000000, 0X02000222,    
  274.     0X02208222, 0X00208222,    0X00308223, 0X07fdfafe,    0X00049222, 0X00000000,    
  275.     0X02a08222, 0X02f1ab7e,    0X027c9be2, 0X031df2fe,    0X00000202, 0X01208322,    
  276.     0X00000000, 0X01ad328e,    0X000db2a2 },
  277.     {    0X004c1010, 0X02dd7bdc,    0X027db736, 0X023c9b2a,    0X06ac92b6, 0X063df5f6,    
  278.     0X0030b042, 0X002cf3a2,    0X00004002, 0X057dd0be,    0X00208202, 0X00048a30,    
  279.     0X06fdfafe, 0X007bf36e,    0X02bdfbfe, 0X023d5210,    0X02bdbbfe, 0X00200000,    
  280.     0X06fffbfe, 0X023bdbbe,    0X06bcf3be, 0X00202000,    0X00840220, 0X00000002,    
  281.     0X00309220, 0X00601022,    0X04208022 },
  282.     {    0X00080000, 0X003d7fbc,    0X00004000, 0X00000000,    0X00000002, 0X039dfbfe,    
  283.     0X00000000, 0X00000000,    0X00000000, 0X057cdafe,    0X00000000, 0X00000100,    
  284.     0X00008002, 0X00000000,    0X00000000, 0X02bcfa88,    0X00000000, 0X00000000,    
  285.     0X00008020, 0X00000800,    0X00000000, 0X000c1000,    0X02400220, 0X01000000,    
  286.     0X00000000, 0X00800200,    0X00008000 },
  287.     {    0X00080000, 0X077d7bde,    0X00248222, 0X00208102,    0X02248220, 0X025d53bf,    
  288.     0X00209202, 0X00000200,    0X02208222, 0X055d70f8,    0X00000000, 0X02804200,    
  289.     0X02180222, 0X00000222,    0X02bd03fc, 0X00fdf864,    0X00209222, 0X00000000,    
  290.     0X02008222, 0X02bdbb2c,    0X00208322, 0X00057100,    0X00000000, 0X00808002,    
  291.     0X02000000, 0X0000f022,    0X02000000 },
  292.     {    0X00080000, 0X005870d8,    0X00000000, 0X00649322,    0X00000000, 0X021c7298,    
  293.     0X00008000, 0X00201000,    0X00208202, 0X0058f0fe,    0X00000000, 0X00000000,    
  294.     0X00000020, 0X00000000,    0X00000002, 0X001d6090,    0X00249222, 0X00200000,    
  295.     0X00000000, 0X00000020,    0X02248326, 0X00051016,    0X00000200, 0X00008020,    
  296.     0X01008000, 0X04041080,    0X00000000 },
  297.     {    0X004c1010, 0X0097f998,    0X00248232, 0X00009322,    0X0004c226, 0X00ddf0f6,    
  298.     0X00201222, 0X0224f230,    0X02048020, 0X00094030,    0X00000002, 0X00004420,    
  299.     0X00699a22, 0X0221e22e,    0X0310c3ba, 0X04fd78d8,    0X023dd322, 0X00200000,    
  300.     0X0234c272, 0X0039b32e,    0X02108322, 0X00095b88,    0X00000022, 0X0004832a,    
  301.     0X00000200, 0X02000000,    0X00000002 },
  302.     {    0X00080000, 0X00557b8e,    0X00000000, 0X00000000,    0X00000002, 0X00bc5a3e,    
  303.     0X00000000, 0X00000020,    0X00000000, 0X003df0ae,    0X00000000, 0X00000000,    
  304.     0X02008020, 0X00000002,    0X00000000, 0X0065e2b2,    0X00000002, 0X00000000,    
  305.     0X00008002, 0X00000008,    0X00000020, 0X00040820,    0X00008020, 0X00008020,    
  306.     0X00000008, 0X00002084,    0X06809222 } };
  307. /*
  308.     Configuration parameters
  309. */
  310. #define    MINLENGTH 5            /* minimum password length */
  311. #define    MAXLENGTH 8            /* maximum password length */
  312. #define    MINNOFIND 2            /* minimum unusual triples */
  313. static short unusual;            /* count of unusual triples */
  314. /*
  315.     dotriple  --  called by    obvword
  316.  
  317.     If this    triple is not used by any word used to build the table,
  318.     we tally that fact.
  319. */
  320. static void dotriple(m1,m2,m3)
  321. short m1,m2,m3;                /* all in 0..26    */
  322. {
  323.     if (!(obvtab[m1][m2] & (1L << m3))) unusual++; /* check    for triple */
  324. }
  325. /*
  326.     obvword     --  do    one word
  327.  
  328.     dotriple is called on each 3-character triple in the word,
  329.     using a    mapped value of    the character into the range 0..26,
  330.     where letters map into 1..26 regardless    of case    and everything
  331.     else maps to zero.
  332. */
  333. static void obvword(word)
  334. char word[];                /* word    to do, max 20 chars */
  335. {    register int i;            /* for loops */
  336.     register int patcnt = 0;    /* count in word */
  337.     register char ch;        /* working char    */
  338.     short pat[21];            /* pattern of mapped values */
  339.     for (i=0; word[i] && (i    < sizeof(pat));    i++)    /* scan    until null */
  340.     {    patcnt = i;        /* max value */
  341.         ch = word[i];        /* get character */
  342.                 if ((ch >= 'a') && (ch <= 'z')) pat[i] = ch + 1 - 'a';
  343.            else if ((ch >= 'A') && (ch <= 'Z')) pat[i] = ch + 1 - 'A';
  344.        else    pat[i] = 0;        /* map into 0..26 */
  345.     }
  346.     for (i=0; i < patcnt - 1; i++)    /* for all triples */
  347.     {    dotriple(pat[i],pat[i+1],pat[i+2]); /* do the triple */
  348.     }
  349. }
  350. /*
  351.     obvious     --  test word for obviousness as password
  352.  
  353.     Words are rejected for being too short,    too long, 
  354.     or looking too much like English words.
  355. */
  356. char *obvious(word)            /* returns msg or zero if OK */
  357. char word[];                /* word    to try */
  358. {
  359.     register int i = 0;        /* for length */
  360.     while (word[i])    i++;        /* compute length */
  361.         if (i < MINLENGTH) return("too short");
  362.         if (i > MAXLENGTH) return("too long");
  363.     unusual    = 0;            /* no unusual triples yet */
  364.     obvword(word);            /* try the word    */
  365.         if (unusual<MINNOFIND) return("too obvious");   /* too obvious */
  366.     return((char *)0);        /* success */
  367. }
  368. 1206!Funky!Stuff!
  369. echo x - obvdemo.c
  370. cat > obvdemo.c << '1206!Funky!Stuff!'
  371. /*
  372.        Obvious password    detector demonstration program
  373.  
  374.                        John Nagle
  375. */
  376. #include <stdio.h>
  377. char *obvious(char *);                   /* external */
  378. main()
  379. {      char pword[200];                   /* potentially huge line    */
  380.        char *s;                       /* status from obvious test */
  381.        printf("Password obviousness tester - try your candidates.\n");
  382.        for (;;)
  383.        {       printf("Candidate password: ");
  384.            if (gets(pword) == NULL)    break; /* read next try    */
  385.                if (pword[0] == '\0') break;    /* empty reply, quit */
  386.            s = obvious(pword);           /* check    for obviousness    */
  387.            if (s)                   /* if nonnull, bad choice */
  388.                {       printf("NO GOOD: %s.\n",s); /* no good, print error msg */
  389.                } else {printf("OK.\n");        /* OK, so state */
  390.            }
  391.        }
  392. }
  393. 1206!Funky!Stuff!
  394. -- 
  395. Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.
  396.