home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1997 December / Internet_Info_CD-ROM_Walnut_Creek_December_1997.iso / rfc / rfc1751 < prev    next >
Text File  |  1995-09-15  |  31KB  |  845 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7. Network Working Group                                        D. McDonald
  8. Request for Comments: 1751                                           NRL
  9. Category: Informational                                    December 1994
  10.  
  11.  
  12.               A Convention for Human-Readable 128-bit Keys
  13.  
  14. Status of this Memo
  15.  
  16.    This memo provides information for the Internet community.  This memo
  17.    does not specify an Internet standard of any kind.  Distribution of
  18.    the memo is unlimited.
  19.  
  20. Introduction
  21.  
  22.    The Internet community has begun to address matters of security.
  23.    Recent standards, including version 2 of SNMP [GM93], have explicit
  24.    requirements for an authentication mechanism.  These require use of a
  25.    keyed message-digest algorithm, MD5 [Riv92], with a key size of 128-
  26.    bits.  A 128-bit key, while sufficiently strong, is hard for most
  27.    people to read, remember, and type in.  This memo proposes a
  28.    convention for use with Internet applications & protocols using 128-
  29.    bit cryptographic keys.
  30.  
  31. A Solution Already Exists
  32.  
  33.    The S/Key(tm) one-time password system [Hal94] uses MD4 (and now MD5,
  34.    as well) to compute one-time passwords.  It takes the 128-bit result
  35.    of MD4 and collapses it to a 64-bit result.  Despite the size
  36.    reduction, 64-bit one-time passwords are still difficult for ordinary
  37.    people to remember and enter.  The authors of S/Key devised a system
  38.    to make the 64-bit one-time password easy for people to enter.
  39.  
  40.    Their idea was to transform the password into a string of small
  41.    English words.  English words are significantly easier for people to
  42.    both remember and type.  The authors of S/Key started with a
  43.    dictionary of 2048 English words, ranging in length from one to four
  44.    characters.  The space covered by a 64-bit key (2^64) could be
  45.    covered by six words from this dictionary (2^66) with room remaining
  46.    for parity.  For example, an S/Key one-time password of hex value:
  47.  
  48.                             EB33 F77E E73D 4053
  49.  
  50.    would become the following six English words:
  51.  
  52.                        TIDE ITCH SLOW REIN RULE MOT
  53.  
  54.  
  55.  
  56.  
  57.  
  58. McDonald                                                        [Page 1]
  59.  
  60. RFC 1751              Human-Readable 128-bit Keys          December 1994
  61.  
  62.  
  63.    Because of the need for interoperability, it is undesirable to have
  64.    different dictionaries for different languages.  Also, the current
  65.    dictionary only uses characters from the invariant portion of ISO-
  66.    646.  Finally, there is an installed base of users and applications
  67.    with this dictionary.
  68.  
  69. The Proposal
  70.  
  71.    The code (see Appendix A) which S/Key uses to convert 64-bit numbers
  72.    to six English words contains two primitives which perform
  73.    conversions either way.  The primitive btoe(char *engout,char *c)
  74.    takes a 64-bit quantity referenced by c and places English words in
  75.    the string referenced by engout.  The primitive etob(char *out,char
  76.    *e) performs the opposite with an input string of English words
  77.    referenced by e, and by placing the 64-bit result into the buffer
  78.    referenced by out.
  79.  
  80.    The aforementioned primitives can be applied to both halves of a
  81.    128-bit key, or both halves of a string of twelve English words.  Two
  82.    new primitives (see Appendix B), key2eng(char *engout,char *key) and
  83.    eng2key(char *keyout,char *eng) serve as wrappers which call the
  84.    S/Key primitives twice, once for each half of the 128-bit key or
  85.    string of twelve words.
  86.  
  87.    For example, the 128-bit key of:
  88.  
  89.                   CCAC 2AED 5910 56BE 4F90 FD44 1C53 4766
  90.  
  91.    would become
  92.  
  93.          RASH BUSH MILK LOOK BAD BRIM AVID GAFF BAIT ROT POD LOVE
  94.  
  95.    Likewise, a user should be able to type in
  96.  
  97.           TROD MUTE TAIL WARM CHAR KONG HAAG CITY BORE O TEAL AWL
  98.  
  99.    as a key, and the machine should make the translation to:
  100.  
  101.                   EFF8 1F9B FBC6 5350 920C DD74 16DE 8009
  102.  
  103.    If this proposal is to work, it is critical that the dictionary of
  104.    English words does not change with different implementations.  A
  105.    freely redistributable reference implementation is given in
  106.    Appendices A and B.
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114. McDonald                                                        [Page 2]
  115.  
  116. RFC 1751              Human-Readable 128-bit Keys          December 1994
  117.  
  118.  
  119. Security Considerations
  120.  
  121.    This document recommends a method of representing 128-bit keys using
  122.    strings of English words.  Since the strings of English words are
  123.    easy to remember, people may potentially construct easy-to-guess
  124.    strings of English words.  With easy-to-guess strings comes the
  125.    possibility of a sentential equivalent of a dictionary attack.  In
  126.    order to maximize the strength of any authentication mechanism that
  127.    uses 128-bit keys, the keys must be sufficiently obscure.  In
  128.    particular, people should avoid the temptation to devise sentences.
  129.  
  130. Acknowledgements
  131.  
  132.    S/Key is a registered trademark of Bell Communications Research.
  133.  
  134.    Thanks to Randall Atkinson for the bulk of the security
  135.    considerations section, and for general advice.  Thanks to Phil Karn
  136.    and Neil Haller for producing the S/Key one-time password system,
  137.    which inspired this document.
  138.  
  139. References
  140.  
  141.    [GM93]  Galvin, J. and K. McCloghrie, "Security Protocols for version
  142.    2 of the Simple Network Management Protocol (SNMPv2)", RFC 1446,
  143.    Trusted Information Systems, Hughes LAN Systems, April 1993.
  144.  
  145.    [Hal94]  Haller, N., "The S/Key(tm) One-Time Password System",
  146.    Proceedings of the Symposium on Network & Distributed Systems
  147.    Security, Internet Society, San Diego, February 1994.
  148.  
  149.    [Riv92]  Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321,
  150.    MIT Laboratory for Computer Science and RSA Data Security, Inc.,
  151.    April 1992.
  152.  
  153. Author's Address
  154.  
  155.    Daniel L. McDonald
  156.    United States Naval Research Laboratory
  157.    Code 5544
  158.    4555 Overlook Ave. SW
  159.    Washington, DC 20375
  160.  
  161.    Phone:  (202) 404-7122
  162.    EMail:  danmcd@itd.nrl.navy.mil
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170. McDonald                                                        [Page 3]
  171.  
  172. RFC 1751              Human-Readable 128-bit Keys          December 1994
  173.  
  174.  
  175. Appendix A - Source for S/Key 8-bytes to/from Words Routines (put.c)
  176.  
  177. /* This code originally appeared in the source for S/Key(TM),
  178.  * available in the directory
  179.  *   ftp://thumper.bellcore.com/pub/nmh
  180.  *
  181.  * It has been modified only to remove explicit S/Key(TM) references.
  182.  */
  183.  
  184. #include <stdio.h>
  185. #include <string.h>
  186. #include <assert.h>
  187. #include <ctype.h>
  188.  
  189. #ifdef __STDC__
  190. #define __ARGS(x) x
  191. #else
  192. #define __ARGS(x) ()
  193. #endif
  194.  
  195. static unsigned long extract __ARGS((char *s,int start,int length));
  196. static void standard __ARGS((char *word));
  197. static void insert __ARGS((char *s, int x, int start, int length));
  198. static int wsrch __ARGS((char *w,int low,int high));
  199.  
  200. /* Dictionary for integer-word translations */
  201. char Wp[2048][4] = { "A", "ABE", "ACE", "ACT", "AD", "ADA", "ADD",
  202. "AGO", "AID", "AIM", "AIR", "ALL", "ALP", "AM", "AMY", "AN", "ANA",
  203. "AND", "ANN", "ANT", "ANY", "APE", "APS", "APT", "ARC", "ARE", "ARK",
  204. "ARM", "ART", "AS", "ASH", "ASK", "AT", "ATE", "AUG", "AUK", "AVE",
  205. "AWE", "AWK", "AWL", "AWN", "AX", "AYE", "BAD", "BAG", "BAH", "BAM",
  206. "BAN", "BAR", "BAT", "BAY", "BE", "BED", "BEE", "BEG", "BEN", "BET",
  207. "BEY", "BIB", "BID", "BIG", "BIN", "BIT", "BOB", "BOG", "BON", "BOO",
  208. "BOP", "BOW", "BOY", "BUB", "BUD", "BUG", "BUM", "BUN", "BUS", "BUT",
  209. "BUY", "BY", "BYE", "CAB", "CAL", "CAM", "CAN", "CAP", "CAR", "CAT",
  210. "CAW", "COD", "COG", "COL", "CON", "COO", "COP", "COT", "COW", "COY",
  211. "CRY", "CUB", "CUE", "CUP", "CUR", "CUT", "DAB", "DAD", "DAM", "DAN",
  212. "DAR", "DAY", "DEE", "DEL", "DEN", "DES", "DEW", "DID", "DIE", "DIG",
  213. "DIN", "DIP", "DO", "DOE", "DOG", "DON", "DOT", "DOW", "DRY", "DUB",
  214. "DUD", "DUE", "DUG", "DUN", "EAR", "EAT", "ED", "EEL", "EGG", "EGO",
  215. "ELI", "ELK", "ELM", "ELY", "EM", "END", "EST", "ETC", "EVA", "EVE",
  216. "EWE", "EYE", "FAD", "FAN", "FAR", "FAT", "FAY", "FED", "FEE", "FEW",
  217. "FIB", "FIG", "FIN", "FIR", "FIT", "FLO", "FLY", "FOE", "FOG", "FOR",
  218. "FRY", "FUM", "FUN", "FUR", "GAB", "GAD", "GAG", "GAL", "GAM", "GAP",
  219. "GAS", "GAY", "GEE", "GEL", "GEM", "GET", "GIG", "GIL", "GIN", "GO",
  220. "GOT", "GUM", "GUN", "GUS", "GUT", "GUY", "GYM", "GYP", "HA", "HAD",
  221. "HAL", "HAM", "HAN", "HAP", "HAS", "HAT", "HAW", "HAY", "HE", "HEM",
  222. "HEN", "HER", "HEW", "HEY", "HI", "HID", "HIM", "HIP", "HIS", "HIT",
  223.  
  224.  
  225.  
  226. McDonald                                                        [Page 4]
  227.  
  228. RFC 1751              Human-Readable 128-bit Keys          December 1994
  229.  
  230.  
  231. "HO", "HOB", "HOC", "HOE", "HOG", "HOP", "HOT", "HOW", "HUB", "HUE",
  232. "HUG", "HUH", "HUM", "HUT", "I", "ICY", "IDA", "IF", "IKE", "ILL",
  233. "INK", "INN", "IO", "ION", "IQ", "IRA", "IRE", "IRK", "IS", "IT", "ITS",
  234. "IVY", "JAB", "JAG", "JAM", "JAN", "JAR", "JAW", "JAY", "JET", "JIG",
  235. "JIM", "JO", "JOB", "JOE", "JOG", "JOT", "JOY", "JUG", "JUT", "KAY",
  236. "KEG", "KEN", "KEY", "KID", "KIM", "KIN", "KIT", "LA", "LAB", "LAC",
  237. "LAD", "LAG", "LAM", "LAP", "LAW", "LAY", "LEA", "LED", "LEE", "LEG",
  238. "LEN", "LEO", "LET", "LEW", "LID", "LIE", "LIN", "LIP", "LIT", "LO",
  239. "LOB", "LOG", "LOP", "LOS", "LOT", "LOU", "LOW", "LOY", "LUG", "LYE",
  240. "MA", "MAC", "MAD", "MAE", "MAN", "MAO", "MAP", "MAT", "MAW", "MAY",
  241. "ME", "MEG", "MEL", "MEN", "MET", "MEW", "MID", "MIN", "MIT", "MOB",
  242. "MOD", "MOE", "MOO", "MOP", "MOS", "MOT", "MOW", "MUD", "MUG", "MUM",
  243. "MY", "NAB", "NAG", "NAN", "NAP", "NAT", "NAY", "NE", "NED", "NEE",
  244. "NET", "NEW", "NIB", "NIL", "NIP", "NIT", "NO", "NOB", "NOD", "NON",
  245. "NOR", "NOT", "NOV", "NOW", "NU", "NUN", "NUT", "O", "OAF", "OAK",
  246. "OAR", "OAT", "ODD", "ODE", "OF", "OFF", "OFT", "OH", "OIL", "OK",
  247. "OLD", "ON", "ONE", "OR", "ORB", "ORE", "ORR", "OS", "OTT", "OUR",
  248. "OUT", "OVA", "OW", "OWE", "OWL", "OWN", "OX", "PA", "PAD", "PAL",
  249. "PAM", "PAN", "PAP", "PAR", "PAT", "PAW", "PAY", "PEA", "PEG", "PEN",
  250. "PEP", "PER", "PET", "PEW", "PHI", "PI", "PIE", "PIN", "PIT", "PLY",
  251. "PO", "POD", "POE", "POP", "POT", "POW", "PRO", "PRY", "PUB", "PUG",
  252. "PUN", "PUP", "PUT", "QUO", "RAG", "RAM", "RAN", "RAP", "RAT", "RAW",
  253. "RAY", "REB", "RED", "REP", "RET", "RIB", "RID", "RIG", "RIM", "RIO",
  254. "RIP", "ROB", "ROD", "ROE", "RON", "ROT", "ROW", "ROY", "RUB", "RUE",
  255. "RUG", "RUM", "RUN", "RYE", "SAC", "SAD", "SAG", "SAL", "SAM", "SAN",
  256. "SAP", "SAT", "SAW", "SAY", "SEA", "SEC", "SEE", "SEN", "SET", "SEW",
  257. "SHE", "SHY", "SIN", "SIP", "SIR", "SIS", "SIT", "SKI", "SKY", "SLY",
  258. "SO", "SOB", "SOD", "SON", "SOP", "SOW", "SOY", "SPA", "SPY", "SUB",
  259. "SUD", "SUE", "SUM", "SUN", "SUP", "TAB", "TAD", "TAG", "TAN", "TAP",
  260. "TAR", "TEA", "TED", "TEE", "TEN", "THE", "THY", "TIC", "TIE", "TIM",
  261. "TIN", "TIP", "TO", "TOE", "TOG", "TOM", "TON", "TOO", "TOP", "TOW",
  262. "TOY", "TRY", "TUB", "TUG", "TUM", "TUN", "TWO", "UN", "UP", "US",
  263. "USE", "VAN", "VAT", "VET", "VIE", "WAD", "WAG", "WAR", "WAS", "WAY",
  264. "WE", "WEB", "WED", "WEE", "WET", "WHO", "WHY", "WIN", "WIT", "WOK",
  265. "WON", "WOO", "WOW", "WRY", "WU", "YAM", "YAP", "YAW", "YE", "YEA",
  266. "YES", "YET", "YOU", "ABED", "ABEL", "ABET", "ABLE", "ABUT", "ACHE",
  267. "ACID", "ACME", "ACRE", "ACTA", "ACTS", "ADAM", "ADDS", "ADEN", "AFAR",
  268. "AFRO", "AGEE", "AHEM", "AHOY", "AIDA", "AIDE", "AIDS", "AIRY", "AJAR",
  269. "AKIN", "ALAN", "ALEC", "ALGA", "ALIA", "ALLY", "ALMA", "ALOE", "ALSO",
  270. "ALTO", "ALUM", "ALVA", "AMEN", "AMES", "AMID", "AMMO", "AMOK", "AMOS",
  271. "AMRA", "ANDY", "ANEW", "ANNA", "ANNE", "ANTE", "ANTI", "AQUA", "ARAB",
  272. "ARCH", "AREA", "ARGO", "ARID", "ARMY", "ARTS", "ARTY", "ASIA", "ASKS",
  273. "ATOM", "AUNT", "AURA", "AUTO", "AVER", "AVID", "AVIS", "AVON", "AVOW",
  274. "AWAY", "AWRY", "BABE", "BABY", "BACH", "BACK", "BADE", "BAIL", "BAIT",
  275. "BAKE", "BALD", "BALE", "BALI", "BALK", "BALL", "BALM", "BAND", "BANE",
  276. "BANG", "BANK", "BARB", "BARD", "BARE", "BARK", "BARN", "BARR", "BASE",
  277. "BASH", "BASK", "BASS", "BATE", "BATH", "BAWD", "BAWL", "BEAD", "BEAK",
  278. "BEAM", "BEAN", "BEAR", "BEAT", "BEAU", "BECK", "BEEF", "BEEN", "BEER",
  279.  
  280.  
  281.  
  282. McDonald                                                        [Page 5]
  283.  
  284. RFC 1751              Human-Readable 128-bit Keys          December 1994
  285.  
  286.  
  287. "BEET", "BELA", "BELL", "BELT", "BEND", "BENT", "BERG", "BERN", "BERT",
  288. "BESS", "BEST", "BETA", "BETH", "BHOY", "BIAS", "BIDE", "BIEN", "BILE",
  289. "BILK", "BILL", "BIND", "BING", "BIRD", "BITE", "BITS", "BLAB", "BLAT",
  290. "BLED", "BLEW", "BLOB", "BLOC", "BLOT", "BLOW", "BLUE", "BLUM", "BLUR",
  291. "BOAR", "BOAT", "BOCA", "BOCK", "BODE", "BODY", "BOGY", "BOHR", "BOIL",
  292. "BOLD", "BOLO", "BOLT", "BOMB", "BONA", "BOND", "BONE", "BONG", "BONN",
  293. "BONY", "BOOK", "BOOM", "BOON", "BOOT", "BORE", "BORG", "BORN", "BOSE",
  294. "BOSS", "BOTH", "BOUT", "BOWL", "BOYD", "BRAD", "BRAE", "BRAG", "BRAN",
  295. "BRAY", "BRED", "BREW", "BRIG", "BRIM", "BROW", "BUCK", "BUDD", "BUFF",
  296. "BULB", "BULK", "BULL", "BUNK", "BUNT", "BUOY", "BURG", "BURL", "BURN",
  297. "BURR", "BURT", "BURY", "BUSH", "BUSS", "BUST", "BUSY", "BYTE", "CADY",
  298. "CAFE", "CAGE", "CAIN", "CAKE", "CALF", "CALL", "CALM", "CAME", "CANE",
  299. "CANT", "CARD", "CARE", "CARL", "CARR", "CART", "CASE", "CASH", "CASK",
  300. "CAST", "CAVE", "CEIL", "CELL", "CENT", "CERN", "CHAD", "CHAR", "CHAT",
  301. "CHAW", "CHEF", "CHEN", "CHEW", "CHIC", "CHIN", "CHOU", "CHOW", "CHUB",
  302. "CHUG", "CHUM", "CITE", "CITY", "CLAD", "CLAM", "CLAN", "CLAW", "CLAY",
  303. "CLOD", "CLOG", "CLOT", "CLUB", "CLUE", "COAL", "COAT", "COCA", "COCK",
  304. "COCO", "CODA", "CODE", "CODY", "COED", "COIL", "COIN", "COKE", "COLA",
  305. "COLD", "COLT", "COMA", "COMB", "COME", "COOK", "COOL", "COON", "COOT",
  306. "CORD", "CORE", "CORK", "CORN", "COST", "COVE", "COWL", "CRAB", "CRAG",
  307. "CRAM", "CRAY", "CREW", "CRIB", "CROW", "CRUD", "CUBA", "CUBE", "CUFF",
  308. "CULL", "CULT", "CUNY", "CURB", "CURD", "CURE", "CURL", "CURT", "CUTS",
  309. "DADE", "DALE", "DAME", "DANA", "DANE", "DANG", "DANK", "DARE", "DARK",
  310. "DARN", "DART", "DASH", "DATA", "DATE", "DAVE", "DAVY", "DAWN", "DAYS",
  311. "DEAD", "DEAF", "DEAL", "DEAN", "DEAR", "DEBT", "DECK", "DEED", "DEEM",
  312. "DEER", "DEFT", "DEFY", "DELL", "DENT", "DENY", "DESK", "DIAL", "DICE",
  313. "DIED", "DIET", "DIME", "DINE", "DING", "DINT", "DIRE", "DIRT", "DISC",
  314. "DISH", "DISK", "DIVE", "DOCK", "DOES", "DOLE", "DOLL", "DOLT", "DOME",
  315. "DONE", "DOOM", "DOOR", "DORA", "DOSE", "DOTE", "DOUG", "DOUR", "DOVE",
  316. "DOWN", "DRAB", "DRAG", "DRAM", "DRAW", "DREW", "DRUB", "DRUG", "DRUM",
  317. "DUAL", "DUCK", "DUCT", "DUEL", "DUET", "DUKE", "DULL", "DUMB", "DUNE",
  318. "DUNK", "DUSK", "DUST", "DUTY", "EACH", "EARL", "EARN", "EASE", "EAST",
  319. "EASY", "EBEN", "ECHO", "EDDY", "EDEN", "EDGE", "EDGY", "EDIT", "EDNA",
  320. "EGAN", "ELAN", "ELBA", "ELLA", "ELSE", "EMIL", "EMIT", "EMMA", "ENDS",
  321. "ERIC", "EROS", "EVEN", "EVER", "EVIL", "EYED", "FACE", "FACT", "FADE",
  322. "FAIL", "FAIN", "FAIR", "FAKE", "FALL", "FAME", "FANG", "FARM", "FAST",
  323. "FATE", "FAWN", "FEAR", "FEAT", "FEED", "FEEL", "FEET", "FELL", "FELT",
  324. "FEND", "FERN", "FEST", "FEUD", "FIEF", "FIGS", "FILE", "FILL", "FILM",
  325. "FIND", "FINE", "FINK", "FIRE", "FIRM", "FISH", "FISK", "FIST", "FITS",
  326. "FIVE", "FLAG", "FLAK", "FLAM", "FLAT", "FLAW", "FLEA", "FLED", "FLEW",
  327. "FLIT", "FLOC", "FLOG", "FLOW", "FLUB", "FLUE", "FOAL", "FOAM", "FOGY",
  328. "FOIL", "FOLD", "FOLK", "FOND", "FONT", "FOOD", "FOOL", "FOOT", "FORD",
  329. "FORE", "FORK", "FORM", "FORT", "FOSS", "FOUL", "FOUR", "FOWL", "FRAU",
  330. "FRAY", "FRED", "FREE", "FRET", "FREY", "FROG", "FROM", "FUEL", "FULL",
  331. "FUME", "FUND", "FUNK", "FURY", "FUSE", "FUSS", "GAFF", "GAGE", "GAIL",
  332. "GAIN", "GAIT", "GALA", "GALE", "GALL", "GALT", "GAME", "GANG", "GARB",
  333. "GARY", "GASH", "GATE", "GAUL", "GAUR", "GAVE", "GAWK", "GEAR", "GELD",
  334. "GENE", "GENT", "GERM", "GETS", "GIBE", "GIFT", "GILD", "GILL", "GILT",
  335.  
  336.  
  337.  
  338. McDonald                                                        [Page 6]
  339.  
  340. RFC 1751              Human-Readable 128-bit Keys          December 1994
  341.  
  342.  
  343. "GINA", "GIRD", "GIRL", "GIST", "GIVE", "GLAD", "GLEE", "GLEN", "GLIB",
  344. "GLOB", "GLOM", "GLOW", "GLUE", "GLUM", "GLUT", "GOAD", "GOAL", "GOAT",
  345. "GOER", "GOES", "GOLD", "GOLF", "GONE", "GONG", "GOOD", "GOOF", "GORE",
  346. "GORY", "GOSH", "GOUT", "GOWN", "GRAB", "GRAD", "GRAY", "GREG", "GREW",
  347. "GREY", "GRID", "GRIM", "GRIN", "GRIT", "GROW", "GRUB", "GULF", "GULL",
  348. "GUNK", "GURU", "GUSH", "GUST", "GWEN", "GWYN", "HAAG", "HAAS", "HACK",
  349. "HAIL", "HAIR", "HALE", "HALF", "HALL", "HALO", "HALT", "HAND", "HANG",
  350. "HANK", "HANS", "HARD", "HARK", "HARM", "HART", "HASH", "HAST", "HATE",
  351. "HATH", "HAUL", "HAVE", "HAWK", "HAYS", "HEAD", "HEAL", "HEAR", "HEAT",
  352. "HEBE", "HECK", "HEED", "HEEL", "HEFT", "HELD", "HELL", "HELM", "HERB",
  353. "HERD", "HERE", "HERO", "HERS", "HESS", "HEWN", "HICK", "HIDE", "HIGH",
  354. "HIKE", "HILL", "HILT", "HIND", "HINT", "HIRE", "HISS", "HIVE", "HOBO",
  355. "HOCK", "HOFF", "HOLD", "HOLE", "HOLM", "HOLT", "HOME", "HONE", "HONK",
  356. "HOOD", "HOOF", "HOOK", "HOOT", "HORN", "HOSE", "HOST", "HOUR", "HOVE",
  357. "HOWE", "HOWL", "HOYT", "HUCK", "HUED", "HUFF", "HUGE", "HUGH", "HUGO",
  358. "HULK", "HULL", "HUNK", "HUNT", "HURD", "HURL", "HURT", "HUSH", "HYDE",
  359. "HYMN", "IBIS", "ICON", "IDEA", "IDLE", "IFFY", "INCA", "INCH", "INTO",
  360. "IONS", "IOTA", "IOWA", "IRIS", "IRMA", "IRON", "ISLE", "ITCH", "ITEM",
  361. "IVAN", "JACK", "JADE", "JAIL", "JAKE", "JANE", "JAVA", "JEAN", "JEFF",
  362. "JERK", "JESS", "JEST", "JIBE", "JILL", "JILT", "JIVE", "JOAN", "JOBS",
  363. "JOCK", "JOEL", "JOEY", "JOHN", "JOIN", "JOKE", "JOLT", "JOVE", "JUDD",
  364. "JUDE", "JUDO", "JUDY", "JUJU", "JUKE", "JULY", "JUNE", "JUNK", "JUNO",
  365. "JURY", "JUST", "JUTE", "KAHN", "KALE", "KANE", "KANT", "KARL", "KATE",
  366. "KEEL", "KEEN", "KENO", "KENT", "KERN", "KERR", "KEYS", "KICK", "KILL",
  367. "KIND", "KING", "KIRK", "KISS", "KITE", "KLAN", "KNEE", "KNEW", "KNIT",
  368. "KNOB", "KNOT", "KNOW", "KOCH", "KONG", "KUDO", "KURD", "KURT", "KYLE",
  369. "LACE", "LACK", "LACY", "LADY", "LAID", "LAIN", "LAIR", "LAKE", "LAMB",
  370. "LAME", "LAND", "LANE", "LANG", "LARD", "LARK", "LASS", "LAST", "LATE",
  371. "LAUD", "LAVA", "LAWN", "LAWS", "LAYS", "LEAD", "LEAF", "LEAK", "LEAN",
  372. "LEAR", "LEEK", "LEER", "LEFT", "LEND", "LENS", "LENT", "LEON", "LESK",
  373. "LESS", "LEST", "LETS", "LIAR", "LICE", "LICK", "LIED", "LIEN", "LIES",
  374. "LIEU", "LIFE", "LIFT", "LIKE", "LILA", "LILT", "LILY", "LIMA", "LIMB",
  375. "LIME", "LIND", "LINE", "LINK", "LINT", "LION", "LISA", "LIST", "LIVE",
  376. "LOAD", "LOAF", "LOAM", "LOAN", "LOCK", "LOFT", "LOGE", "LOIS", "LOLA",
  377. "LONE", "LONG", "LOOK", "LOON", "LOOT", "LORD", "LORE", "LOSE", "LOSS",
  378. "LOST", "LOUD", "LOVE", "LOWE", "LUCK", "LUCY", "LUGE", "LUKE", "LULU",
  379. "LUND", "LUNG", "LURA", "LURE", "LURK", "LUSH", "LUST", "LYLE", "LYNN",
  380. "LYON", "LYRA", "MACE", "MADE", "MAGI", "MAID", "MAIL", "MAIN", "MAKE",
  381. "MALE", "MALI", "MALL", "MALT", "MANA", "MANN", "MANY", "MARC", "MARE",
  382. "MARK", "MARS", "MART", "MARY", "MASH", "MASK", "MASS", "MAST", "MATE",
  383. "MATH", "MAUL", "MAYO", "MEAD", "MEAL", "MEAN", "MEAT", "MEEK", "MEET",
  384. "MELD", "MELT", "MEMO", "MEND", "MENU", "MERT", "MESH", "MESS", "MICE",
  385. "MIKE", "MILD", "MILE", "MILK", "MILL", "MILT", "MIMI", "MIND", "MINE",
  386. "MINI", "MINK", "MINT", "MIRE", "MISS", "MIST", "MITE", "MITT", "MOAN",
  387. "MOAT", "MOCK", "MODE", "MOLD", "MOLE", "MOLL", "MOLT", "MONA", "MONK",
  388. "MONT", "MOOD", "MOON", "MOOR", "MOOT", "MORE", "MORN", "MORT", "MOSS",
  389. "MOST", "MOTH", "MOVE", "MUCH", "MUCK", "MUDD", "MUFF", "MULE", "MULL",
  390. "MURK", "MUSH", "MUST", "MUTE", "MUTT", "MYRA", "MYTH", "NAGY", "NAIL",
  391.  
  392.  
  393.  
  394. McDonald                                                        [Page 7]
  395.  
  396. RFC 1751              Human-Readable 128-bit Keys          December 1994
  397.  
  398.  
  399. "NAIR", "NAME", "NARY", "NASH", "NAVE", "NAVY", "NEAL", "NEAR", "NEAT",
  400. "NECK", "NEED", "NEIL", "NELL", "NEON", "NERO", "NESS", "NEST", "NEWS",
  401. "NEWT", "NIBS", "NICE", "NICK", "NILE", "NINA", "NINE", "NOAH", "NODE",
  402. "NOEL", "NOLL", "NONE", "NOOK", "NOON", "NORM", "NOSE", "NOTE", "NOUN",
  403. "NOVA", "NUDE", "NULL", "NUMB", "OATH", "OBEY", "OBOE", "ODIN", "OHIO",
  404. "OILY", "OINT", "OKAY", "OLAF", "OLDY", "OLGA", "OLIN", "OMAN", "OMEN",
  405. "OMIT", "ONCE", "ONES", "ONLY", "ONTO", "ONUS", "ORAL", "ORGY", "OSLO",
  406. "OTIS", "OTTO", "OUCH", "OUST", "OUTS", "OVAL", "OVEN", "OVER", "OWLY",
  407. "OWNS", "QUAD", "QUIT", "QUOD", "RACE", "RACK", "RACY", "RAFT", "RAGE",
  408. "RAID", "RAIL", "RAIN", "RAKE", "RANK", "RANT", "RARE", "RASH", "RATE",
  409. "RAVE", "RAYS", "READ", "REAL", "REAM", "REAR", "RECK", "REED", "REEF",
  410. "REEK", "REEL", "REID", "REIN", "RENA", "REND", "RENT", "REST", "RICE",
  411. "RICH", "RICK", "RIDE", "RIFT", "RILL", "RIME", "RING", "RINK", "RISE",
  412. "RISK", "RITE", "ROAD", "ROAM", "ROAR", "ROBE", "ROCK", "RODE", "ROIL",
  413. "ROLL", "ROME", "ROOD", "ROOF", "ROOK", "ROOM", "ROOT", "ROSA", "ROSE",
  414. "ROSS", "ROSY", "ROTH", "ROUT", "ROVE", "ROWE", "ROWS", "RUBE", "RUBY",
  415. "RUDE", "RUDY", "RUIN", "RULE", "RUNG", "RUNS", "RUNT", "RUSE", "RUSH",
  416. "RUSK", "RUSS", "RUST", "RUTH", "SACK", "SAFE", "SAGE", "SAID", "SAIL",
  417. "SALE", "SALK", "SALT", "SAME", "SAND", "SANE", "SANG", "SANK", "SARA",
  418. "SAUL", "SAVE", "SAYS", "SCAN", "SCAR", "SCAT", "SCOT", "SEAL", "SEAM",
  419. "SEAR", "SEAT", "SEED", "SEEK", "SEEM", "SEEN", "SEES", "SELF", "SELL",
  420. "SEND", "SENT", "SETS", "SEWN", "SHAG", "SHAM", "SHAW", "SHAY", "SHED",
  421. "SHIM", "SHIN", "SHOD", "SHOE", "SHOT", "SHOW", "SHUN", "SHUT", "SICK",
  422. "SIDE", "SIFT", "SIGH", "SIGN", "SILK", "SILL", "SILO", "SILT", "SINE",
  423. "SING", "SINK", "SIRE", "SITE", "SITS", "SITU", "SKAT", "SKEW", "SKID",
  424. "SKIM", "SKIN", "SKIT", "SLAB", "SLAM", "SLAT", "SLAY", "SLED", "SLEW",
  425. "SLID", "SLIM", "SLIT", "SLOB", "SLOG", "SLOT", "SLOW", "SLUG", "SLUM",
  426. "SLUR", "SMOG", "SMUG", "SNAG", "SNOB", "SNOW", "SNUB", "SNUG", "SOAK",
  427. "SOAR", "SOCK", "SODA", "SOFA", "SOFT", "SOIL", "SOLD", "SOME", "SONG",
  428. "SOON", "SOOT", "SORE", "SORT", "SOUL", "SOUR", "SOWN", "STAB", "STAG",
  429. "STAN", "STAR", "STAY", "STEM", "STEW", "STIR", "STOW", "STUB", "STUN",
  430. "SUCH", "SUDS", "SUIT", "SULK", "SUMS", "SUNG", "SUNK", "SURE", "SURF",
  431. "SWAB", "SWAG", "SWAM", "SWAN", "SWAT", "SWAY", "SWIM", "SWUM", "TACK",
  432. "TACT", "TAIL", "TAKE", "TALE", "TALK", "TALL", "TANK", "TASK", "TATE",
  433. "TAUT", "TEAL", "TEAM", "TEAR", "TECH", "TEEM", "TEEN", "TEET", "TELL",
  434. "TEND", "TENT", "TERM", "TERN", "TESS", "TEST", "THAN", "THAT", "THEE",
  435. "THEM", "THEN", "THEY", "THIN", "THIS", "THUD", "THUG", "TICK", "TIDE",
  436. "TIDY", "TIED", "TIER", "TILE", "TILL", "TILT", "TIME", "TINA", "TINE",
  437. "TINT", "TINY", "TIRE", "TOAD", "TOGO", "TOIL", "TOLD", "TOLL", "TONE",
  438. "TONG", "TONY", "TOOK", "TOOL", "TOOT", "TORE", "TORN", "TOTE", "TOUR",
  439. "TOUT", "TOWN", "TRAG", "TRAM", "TRAY", "TREE", "TREK", "TRIG", "TRIM",
  440. "TRIO", "TROD", "TROT", "TROY", "TRUE", "TUBA", "TUBE", "TUCK", "TUFT",
  441. "TUNA", "TUNE", "TUNG", "TURF", "TURN", "TUSK", "TWIG", "TWIN", "TWIT",
  442. "ULAN", "UNIT", "URGE", "USED", "USER", "USES", "UTAH", "VAIL", "VAIN",
  443. "VALE", "VARY", "VASE", "VAST", "VEAL", "VEDA", "VEIL", "VEIN", "VEND",
  444. "VENT", "VERB", "VERY", "VETO", "VICE", "VIEW", "VINE", "VISE", "VOID",
  445. "VOLT", "VOTE", "WACK", "WADE", "WAGE", "WAIL", "WAIT", "WAKE", "WALE",
  446. "WALK", "WALL", "WALT", "WAND", "WANE", "WANG", "WANT", "WARD", "WARM",
  447.  
  448.  
  449.  
  450. McDonald                                                        [Page 8]
  451.  
  452. RFC 1751              Human-Readable 128-bit Keys          December 1994
  453.  
  454.  
  455. "WARN", "WART", "WASH", "WAST", "WATS", "WATT", "WAVE", "WAVY", "WAYS",
  456. "WEAK", "WEAL", "WEAN", "WEAR", "WEED", "WEEK", "WEIR", "WELD", "WELL",
  457. "WELT", "WENT", "WERE", "WERT", "WEST", "WHAM", "WHAT", "WHEE", "WHEN",
  458. "WHET", "WHOA", "WHOM", "WICK", "WIFE", "WILD", "WILL", "WIND", "WINE",
  459. "WING", "WINK", "WINO", "WIRE", "WISE", "WISH", "WITH", "WOLF", "WONT",
  460. "WOOD", "WOOL", "WORD", "WORE", "WORK", "WORM", "WORN", "WOVE", "WRIT",
  461. "WYNN", "YALE", "YANG", "YANK", "YARD", "YARN", "YAWL", "YAWN", "YEAH",
  462. "YEAR", "YELL", "YOGA", "YOKE"
  463. };
  464.  
  465. /* Encode 8 bytes in 'c' as a string of English words.
  466.  * Returns a pointer to a static buffer
  467.  */
  468. char *
  469. btoe(engout,c)
  470. char *c, *engout;
  471. {
  472.         char cp[9];     /* add in room for the parity 2 bits*/
  473.         int p,i ;
  474.  
  475.         engout[0] = '\0';
  476.         memcpy(cp, c,8);
  477.         /* compute parity */
  478.         for(p = 0,i = 0; i < 64;i += 2)
  479.                 p += extract(cp,i,2);
  480.  
  481.         cp[8] = (char)p << 6;
  482.         strncat(engout,&Wp[extract(cp, 0,11)][0],4);
  483.         strcat(engout," ");
  484.         strncat(engout,&Wp[extract(cp,11,11)][0],4);
  485.         strcat(engout," ");
  486.         strncat(engout,&Wp[extract(cp,22,11)][0],4);
  487.         strcat(engout," ");
  488.         strncat(engout,&Wp[extract(cp,33,11)][0],4);
  489.         strcat(engout," ");
  490.         strncat(engout,&Wp[extract(cp,44,11)][0],4);
  491.         strcat(engout," ");
  492.         strncat(engout,&Wp[extract(cp,55,11)][0],4);
  493. #ifdef  notdef
  494.         printf("engout is %s\n\r",engout);
  495. #endif
  496.         return(engout);
  497. }
  498.  
  499. /* convert English to binary
  500.  * returns 1 OK - all good words and parity is OK
  501.  *         0 word not in data base
  502.  *        -1 badly formed in put ie > 4 char word
  503.  
  504.  
  505.  
  506. McDonald                                                        [Page 9]
  507.  
  508. RFC 1751              Human-Readable 128-bit Keys          December 1994
  509.  
  510.  
  511.  *        -2 words OK but parity is wrong
  512.  */
  513. int
  514. etob(out, e)
  515. char *out;
  516. char *e;
  517. {
  518.         char *word;
  519.         int i, p, v,l, low,high;
  520.         char b[9];
  521.         char input[36];
  522.  
  523.         if(e == NULL)
  524.                 return -1;
  525.  
  526.         strncpy(input,e,sizeof(input));
  527.         memset(b, 0, sizeof(b));
  528.         memset(out, 0, 8);
  529.         for(i=0,p=0;i<6;i++,p+=11){
  530.                 if((word = strtok(i == 0 ? input : NULL," ")) == NULL)
  531.                         return -1;
  532.                 l = strlen(word);
  533.                 if(l > 4 || l < 1){
  534.                         return -1;
  535.                 } else if(l < 4){
  536.                         low = 0;
  537.                         high = 570;
  538.                 } else {
  539.                         low = 571;
  540.                         high = 2047;
  541.                 }
  542.                 standard(word);
  543.                 if( (v = wsrch(word,low,high)) < 0 )
  544.                         return 0;
  545.                 insert(b,v,p,11);
  546.         }
  547.  
  548.         /* now check the parity of what we got */
  549.         for(p = 0, i = 0; i < 64; i +=2)
  550.                 p += extract(b, i, 2);
  551.  
  552.         if( (p & 3) != extract(b, 64,2) )
  553.                 return -2;
  554.  
  555.         memcpy(out,b,8);
  556.  
  557.         return 1;
  558. }
  559.  
  560.  
  561.  
  562. McDonald                                                       [Page 10]
  563.  
  564. RFC 1751              Human-Readable 128-bit Keys          December 1994
  565.  
  566.  
  567. /* Display 8 bytes as a series of 16-bit hex digits */
  568. char *
  569. put8(out,s)
  570. char *out;
  571. char *s;
  572. {
  573.         sprintf(out,"%02X%02X %02X%02X %02X%02X %02X%02X",
  574.                 s[0] & 0xff,s[1] & 0xff,s[2] & 0xff,
  575.                 s[3] & 0xff,s[4] & 0xff,s[5] & 0xff,
  576.                 s[6] & 0xff,s[7] & 0xff);
  577.         return out;
  578. }
  579. #ifdef  notdef
  580. /* Encode 8 bytes in 'cp' as stream of ascii letters.
  581.  * Provided as a possible alternative to btoe()
  582.  */
  583. char *
  584. btoc(cp)
  585. char *cp;
  586. {
  587.         int i;
  588.         static char out[31];
  589.  
  590.         /* code out put by characters 6 bits each added to 0x21 (!)*/
  591.         for(i=0;i <= 10;i++){
  592.                 /* last one is only 4 bits not 6*/
  593.                 out[i] = '!'+ extract(cp,6*i,i >= 10 ? 4:6);
  594.         }
  595.         out[i] = '\0';
  596.         return(out);
  597. }
  598. #endif
  599.  
  600. /* Internal subroutines for word encoding/decoding */
  601.  
  602. /* Dictionary binary search */
  603. static int
  604. wsrch(w,low,high)
  605. char *w;
  606. int low, high;
  607. {
  608.         int i,j;
  609.  
  610.         for(;;){
  611.                 i = (low + high)/2;
  612.                 if((j = strncmp(w,Wp[i],4)) == 0)
  613.                         return i;       /* Found it */
  614.                 if(high == low+1){
  615.  
  616.  
  617.  
  618. McDonald                                                       [Page 11]
  619.  
  620. RFC 1751              Human-Readable 128-bit Keys          December 1994
  621.  
  622.  
  623.                         /* Avoid effects of integer truncation in /2 */
  624.                         if(strncmp(w,Wp[high],4) == 0)
  625.                                 return high;
  626.                         else
  627.                                 return -1;
  628.                 }
  629.                 if(low >= high)
  630.                         return -1;
  631.                    /* I don't *think* this can happen...*/
  632.                 if(j < 0)
  633.                         high = i;  /* Search lower half */
  634.                 else
  635.                         low = i;   /* Search upper half */
  636.         }
  637. }
  638. static void
  639. insert(s, x, start, length)
  640. char *s;
  641. int x;
  642. int  start, length;
  643. {
  644.         unsigned char cl;
  645.         unsigned char cc;
  646.         unsigned char cr;
  647.         unsigned long y;
  648.         int shift;
  649.  
  650.         assert(length <= 11);
  651.         assert(start >= 0);
  652.         assert(length >= 0);
  653.         assert(start +length <= 66);
  654.  
  655.         shift = ((8  -(( start + length) % 8))%8);
  656.         y = (long) x << shift;
  657.         cl = (y >> 16) & 0xff;
  658.         cc = (y >> 8) & 0xff;
  659.         cr = y & 0xff;
  660.         if(shift + length > 16){
  661.                 s[start /8] |= cl;
  662.                 s[start/8 +1] |= cc;
  663.                 s[start/8 +2] |= cr;
  664.         } else if(shift +length > 8){
  665.                 s[start/8] |= cc;
  666.                 s[start/8 + 1] |= cr;
  667.         } else {
  668.                 s[start/8] |= cr;
  669.         }
  670. }
  671.  
  672.  
  673.  
  674. McDonald                                                       [Page 12]
  675.  
  676. RFC 1751              Human-Readable 128-bit Keys          December 1994
  677.  
  678.  
  679. static void
  680. standard(word)
  681. register char *word;
  682. {
  683.         while(*word){
  684.                 if(!isascii(*word))
  685.                         break;
  686.                 if(islower(*word))
  687.                         *word = toupper(*word);
  688.                 if(*word == '1')
  689.                         *word = 'L';
  690.                 if(*word == '0')
  691.                         *word = 'O';
  692.                 if(*word == '5')
  693.                         *word = 'S';
  694.                 word++;
  695.         }
  696. }
  697.  
  698. /* Extract 'length' bits from the char array 's'
  699.    starting with bit 'start' */
  700. static unsigned long
  701. extract(s, start, length)
  702. char *s;
  703. int start, length;
  704. {
  705.         unsigned char cl;
  706.         unsigned char cc;
  707.         unsigned char cr;
  708.         unsigned long x;
  709.  
  710.         assert(length <= 11);
  711.         assert(start >= 0);
  712.         assert(length >= 0);
  713.         assert(start +length <= 66);
  714.  
  715.         cl = s[start/8];
  716.         cc = s[start/8 +1];
  717.         cr = s[start/8 +2];
  718.         x = ((long)(cl<<8 | cc) <<8  | cr) ;
  719.         x = x >> (24 - (length + (start %8)));
  720.         x =( x & (0xffff >> (16-length) )   );
  721.         return(x);
  722. }
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730. McDonald                                                       [Page 13]
  731.  
  732. RFC 1751              Human-Readable 128-bit Keys          December 1994
  733.  
  734.  
  735. Appendix B - Source for 128-bit key to/from English words (convert.c)
  736.  
  737. /* convert.c  --  Wrapper to S/Key binary-to-English routines.
  738.       Daniel L. McDonald  --  U. S. Naval Research Laboratory. */
  739.  
  740. #include <string.h>
  741.  
  742. /* eng2key() assumes words must be separated by spaces only.
  743.  
  744.    eng2key() returns
  745.  
  746.    1 if succeeded
  747.    0 if word not in dictionary
  748.    -1 if badly formed string
  749.    -2 if words are okay but parity is wrong.
  750.    (see etob() in S/Key)
  751. */
  752.  
  753. int eng2key(keyout,eng)
  754. char *keyout,*eng;
  755. {
  756.   int rc=0,state=1;
  757.   char *eng2;
  758.  
  759.   /* Find pointer to word 7. */
  760.  
  761.   for (eng2 = eng; rc<7 && (*(++eng2) != '\0'); )
  762.     if (*eng2 != ' ')
  763.       {
  764.         rc += state;
  765.         state = 0;
  766.       }
  767.     else state=1;
  768.  
  769.   if ( (rc = etob(keyout,eng)) != 1)
  770.     return rc;
  771.  
  772.   rc = etob(keyout+8,eng2);
  773.  
  774.   return rc;
  775. }
  776.  
  777. /* key2eng() assumes string referenced by
  778.    engout has at least 60 characters
  779.    (4*12 + 11 spaces + '\0') of space.
  780.  
  781.    key2eng() returns pointer to engout.
  782.  
  783.  
  784.  
  785.  
  786. McDonald                                                       [Page 14]
  787.  
  788. RFC 1751              Human-Readable 128-bit Keys          December 1994
  789.  
  790.  
  791. */
  792.  
  793. char *key2eng(engout,key)
  794. char *engout,*key;
  795. {
  796.   btoe(engout,key);
  797.   strcat(engout," ");
  798.   btoe(engout+strlen(engout),key+8);
  799.   return engout;
  800. }
  801.  
  802.  
  803.  
  804.  
  805.  
  806.  
  807.  
  808.  
  809.  
  810.  
  811.  
  812.  
  813.  
  814.  
  815.  
  816.  
  817.  
  818.  
  819.  
  820.  
  821.  
  822.  
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.  
  840.  
  841.  
  842.  
  843. McDonald                                                       [Page 15]
  844.  
  845.