skeydictionary.java

来自「一个非常好的ssh客户端实现」· Java 代码 · 共 390 行 · 第 1/2 页

JAVA
390
字号
	"OWNS", "QUAD", "QUIT", "QUOD", "RACE", "RACK", "RACY", "RAFT", "RAGE",	"RAID", "RAIL", "RAIN", "RAKE", "RANK", "RANT", "RARE", "RASH", "RATE",	"RAVE", "RAYS", "READ", "REAL", "REAM", "REAR", "RECK", "REED", "REEF",	"REEK", "REEL", "REID", "REIN", "RENA", "REND", "RENT", "REST", "RICE",	"RICH", "RICK", "RIDE", "RIFT", "RILL", "RIME", "RING", "RINK", "RISE",	"RISK", "RITE", "ROAD", "ROAM", "ROAR", "ROBE", "ROCK", "RODE", "ROIL",	"ROLL", "ROME", "ROOD", "ROOF", "ROOK", "ROOM", "ROOT", "ROSA", "ROSE",	"ROSS", "ROSY", "ROTH", "ROUT", "ROVE", "ROWE", "ROWS", "RUBE", "RUBY",	"RUDE", "RUDY", "RUIN", "RULE", "RUNG", "RUNS", "RUNT", "RUSE", "RUSH",	"RUSK", "RUSS", "RUST", "RUTH", "SACK", "SAFE", "SAGE", "SAID", "SAIL",	"SALE", "SALK", "SALT", "SAME", "SAND", "SANE", "SANG", "SANK", "SARA",	"SAUL", "SAVE", "SAYS", "SCAN", "SCAR", "SCAT", "SCOT", "SEAL", "SEAM",	"SEAR", "SEAT", "SEED", "SEEK", "SEEM", "SEEN", "SEES", "SELF", "SELL",	"SEND", "SENT", "SETS", "SEWN", "SHAG", "SHAM", "SHAW", "SHAY", "SHED",	"SHIM", "SHIN", "SHOD", "SHOE", "SHOT", "SHOW", "SHUN", "SHUT", "SICK",	"SIDE", "SIFT", "SIGH", "SIGN", "SILK", "SILL", "SILO", "SILT", "SINE",	"SING", "SINK", "SIRE", "SITE", "SITS", "SITU", "SKAT", "SKEW", "SKID",	"SKIM", "SKIN", "SKIT", "SLAB", "SLAM", "SLAT", "SLAY", "SLED", "SLEW",	"SLID", "SLIM", "SLIT", "SLOB", "SLOG", "SLOT", "SLOW", "SLUG", "SLUM",	"SLUR", "SMOG", "SMUG", "SNAG", "SNOB", "SNOW", "SNUB", "SNUG", "SOAK",	"SOAR", "SOCK", "SODA", "SOFA", "SOFT", "SOIL", "SOLD", "SOME", "SONG",	"SOON", "SOOT", "SORE", "SORT", "SOUL", "SOUR", "SOWN", "STAB", "STAG",	"STAN", "STAR", "STAY", "STEM", "STEW", "STIR", "STOW", "STUB", "STUN",	"SUCH", "SUDS", "SUIT", "SULK", "SUMS", "SUNG", "SUNK", "SURE", "SURF",	"SWAB", "SWAG", "SWAM", "SWAN", "SWAT", "SWAY", "SWIM", "SWUM", "TACK",	"TACT", "TAIL", "TAKE", "TALE", "TALK", "TALL", "TANK", "TASK", "TATE",	"TAUT", "TEAL", "TEAM", "TEAR", "TECH", "TEEM", "TEEN", "TEET", "TELL",	"TEND", "TENT", "TERM", "TERN", "TESS", "TEST", "THAN", "THAT", "THEE",	"THEM", "THEN", "THEY", "THIN", "THIS", "THUD", "THUG", "TICK", "TIDE",	"TIDY", "TIED", "TIER", "TILE", "TILL", "TILT", "TIME", "TINA", "TINE",	"TINT", "TINY", "TIRE", "TOAD", "TOGO", "TOIL", "TOLD", "TOLL", "TONE",	"TONG", "TONY", "TOOK", "TOOL", "TOOT", "TORE", "TORN", "TOTE", "TOUR",	"TOUT", "TOWN", "TRAG", "TRAM", "TRAY", "TREE", "TREK", "TRIG", "TRIM",	"TRIO", "TROD", "TROT", "TROY", "TRUE", "TUBA", "TUBE", "TUCK", "TUFT",	"TUNA", "TUNE", "TUNG", "TURF", "TURN", "TUSK", "TWIG", "TWIN", "TWIT",	"ULAN", "UNIT", "URGE", "USED", "USER", "USES", "UTAH", "VAIL", "VAIN",	"VALE", "VARY", "VASE", "VAST", "VEAL", "VEDA", "VEIL", "VEIN", "VEND",	"VENT", "VERB", "VERY", "VETO", "VICE", "VIEW", "VINE", "VISE", "VOID",	"VOLT", "VOTE", "WACK", "WADE", "WAGE", "WAIL", "WAIT", "WAKE", "WALE",	"WALK", "WALL", "WALT", "WAND", "WANE", "WANG", "WANT", "WARD", "WARM",	"WARN", "WART", "WASH", "WAST", "WATS", "WATT", "WAVE", "WAVY", "WAYS",	"WEAK", "WEAL", "WEAN", "WEAR", "WEED", "WEEK", "WEIR", "WELD", "WELL",	"WELT", "WENT", "WERE", "WERT", "WEST", "WHAM", "WHAT", "WHEE", "WHEN",	"WHET", "WHOA", "WHOM", "WICK", "WIFE", "WILD", "WILL", "WIND", "WINE",	"WING", "WINK", "WINO", "WIRE", "WISE", "WISH", "WITH", "WOLF", "WONT",	"WOOD", "WOOL", "WORD", "WORE", "WORK", "WORM", "WORN", "WOVE", "WRIT",	"WYNN", "YALE", "YANG", "YANK", "YARD", "YARN", "YAWL", "YAWN", "YEAH",	"YEAR", "YELL", "YOGA", "YOKE"    };    public static String bitsToEnglish(byte[] bits, int offset) {        byte[] bits2 = new byte[9];        int p,i;        System.arraycopy(bits, 0, bits2, 0, 8);        /* compute parity */        for(p = 0,i = 0; i < 64; i += 2)	    p += extractBits(bits2, i, 2);        bits2[8] = (byte)(p << 6);	StringBuffer buf = new StringBuffer();	for(i = 0; i < 66; i += 11) {	    if(i > 0) {		buf.append(" ");	    }	    buf.append(dict[extractBits(bits2, i, 11)]);	}	return buf.toString();    }    public static byte[] englishToBits(String english) {	StringTokenizer st   = new StringTokenizer(english);	byte[]          bits = new byte[9];        int             i, p, v, l, low, high;	String          word;        for(i = 0, p = 0; i < 6; i++, p += 11) {	    if((word = st.nextToken()) == null)		return null;	    l = word.length();	    if(l > 4 || l < 1) {		return null;	    } else if(l < 4) {		low = 0;		high = 570;	    } else {		low = 571;		high = 2047;	    }	    // !!! standard(word);	    if((v = wsrch(word, low, high)) < 0)		return null;	    insertBits(bits, v, p, 11);        }        /* now check the parity of what we got */        for(p = 0, i = 0; i < 64; i +=2)	    p += extractBits(bits, i, 2);        if((p & 3) != extractBits(bits, 64, 2))	    return null;	byte[] out = new byte[8];        System.arraycopy(bits, 0, out, 0, 8);	return out;    }    static int extractBits(byte[] bits, int offset, int length) {        int l = 0, c = 0, r = 0, x, byteOff = offset / 8;        l = (bits[byteOff] & 0xff);	if(byteOff + 1 < bits.length) {	    c = (bits[byteOff + 1] & 0xff);	}	if(byteOff + 2 < bits.length) {	    r = (bits[byteOff + 2] & 0xff);	}        x = ((l << 8 | c) << 8  | r);        x = x >>> (24 - (length + (offset % 8)));        x = (x & (0xffff >>> (16 - length)));        return x;    }    static void insertBits(byte[] bits, int x, int offset, int length) {        int l, c, r, y, shift;        shift = ((8 - ((offset + length) & 0x07)) & 0x07);        y = x << shift;        l = (y >>> 16) & 0xff;        c = (y >>> 8) & 0xff;        r = y & 0xff;        if(shift + length > 16) {	    bits[offset / 8]     |= l;	    bits[offset / 8 + 1] |= c;	    bits[offset / 8 + 2] |= r;        } else if(shift +length > 8) {	    bits[offset / 8]     |= c;	    bits[offset / 8 + 1] |= r;        } else {	    bits[offset / 8] |= r;        }    }    /* Dictionary binary search */    private static int wsrch(String word, int low, int high) {        int i, j;	word = word.toUpperCase();        for(;;) {	    i = (low + high) / 2;	    if((j = word.compareTo(dict[i])) == 0) {		return i;       /* Found it */	    } else if(high == low + 1) {		/* Avoid effects of integer truncation in /2 */		if(word.equalsIgnoreCase(dict[high]))		    return high;		else		    return -1;	    } else if(low >= high) {		return -1;	    }	    /* I don't *think* this can happen...*/	    if(j < 0)		high = i;  /* Search lower half */	    else		low = i;   /* Search upper half */        }    }    /* !!! DEBUG    public static void main(String[] argv) {	String words1 = "RASH BUSH MILK LOOK BAD BRIM";	String words2 = "TROD MUTE TAIL WARM CHAR KONG";	byte[] bits1, bits2;	System.out.println("words1: ");	bits1 = SKEYDictionary.englishToBits(words1);	com.mindbright.util.HexDump.hexDump(bits1);	System.out.println("words2: ");	bits2 = SKEYDictionary.englishToBits(words2);	com.mindbright.util.HexDump.hexDump(bits2);	System.out.println(SKEYDictionary.bitsToEnglish(bits1, 0));	System.out.println(SKEYDictionary.bitsToEnglish(bits2, 0));    }    */}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?