| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965 |
- /**
- * Definition of Data Encryption Standard (DES) taken from:
- * http://www.itl.nist.gov/fipspubs/fip46-2.htm
- */
- (function () {
- var C = typeof window === 'undefined' ? require('./Crypto').Crypto : window.Crypto;
- // Shortcuts
- var util = C.util;
- var charenc = C.charenc;
- var UTF8 = charenc.UTF8;
- /***************************************************************************
- *
- * DES Key Schedule.
- *
- * The Key consists of 16 sub-keys of 48 bits each. As each sub-key is
- * applied to an expanded 32-bit value where each 4 bits of input is
- * expanded into 6 bits of output the sub-key can be broken down into 8
- * 32-bit values which allows the key to be used without expansion.
- *
- * To create the 16 sub-keys, 56 bits are selected from the input 64 bit key
- * according to <i>PC1</i>. Each sub-key is generated by left rotating the
- * bits a different amount and then selecting 48 bits according to <i>PC2</i>.
- *
- **************************************************************************/
- var KeySchedule;
- /**
- * Representation of a DES key schedule.
- *
- * @param {Array
- * of 8 bytes} key The cipher key
- *
- * @constructor
- */
- KeySchedule = function (key) {
- /**
- * The schedule of 16 keys
- */
- this.keys = new Array(16);
- this._initialiseKeys(key);
- };
- /**
- * Permuted Choice 1 (PC1) byte offsets into the key. Each of the 56 entries
- * selects one bit of DES's 56 bit key.
- * <p>
- *
- * <pre>
- * The PC1 is defined as:
- *
- * 57, 49, 41, 33, 25, 17, 9,
- * 1, 58, 50, 42, 34, 26, 18,
- * 10, 2, 59, 51, 43, 35, 27,
- * 19, 11, 3, 60, 52, 44, 36,
- * 63, 55, 47, 39, 31, 23, 15,
- * 7, 62, 54, 46, 38, 30, 22,
- * 14, 6, 61, 53, 45, 37, 29,
- * 21, 13, 5, 28, 20, 12, 4
- * </pre>
- *
- * We represent this as an offset into an 8-byte array and a bit mask upon
- * that byte. For example 57=(7*8)+1 so is the first (MSB) of the 7th byte.
- *
- * @constant
- */
- KeySchedule.PC1_offsets = [
- 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 3, 2, 1, 0
- ];
- /**
- * Permuted Choice 1 (PC1) bit masks. Each of the 56 entries selects one bit
- * of DES's 56 bit key.
- *
- * @constant
- */
- KeySchedule.PC1_masks = [
- 128, 128, 128, 128, 128, 128, 128, 128, 64, 64, 64, 64, 64, 64, 64, 64, 32, 32, 32, 32, 32, 32, 32, 32, 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 8,
- 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16
- ];
- /**
- * Permuted Choice 2 (PC2) selects the active 48 bits from the 56 bits of
- * the key.
- * <p>
- *
- * <pre>
- * The PC2 is defined as:
- *
- * 14, 17, 11, 24, 1, 5,
- * 3, 28, 15, 6, 21, 10,
- * 23, 19, 12, 4, 26, 8,
- * 16, 7, 27, 20, 13, 2,
- * 41, 52, 31, 37, 47, 55,
- * 30, 40, 51, 45, 33, 48,
- * 44, 49, 39, 56, 34, 53,
- * 46, 42, 50, 36, 29, 32
- * </pre>
- *
- * We invert the choice to specify what each bit adds to each 6-bit value of
- * the key. For example, bit 1 is the 5th bit selected so this add 2 to the
- * first 6-bit value.
- *
- * @constant
- */
- KeySchedule.PC2_offsets1 = [0, 3, 1, 2, 0, 1, 3, 2, 0, 1, 0, 2, 3, 0, 1, 3, 0, 0, 2, 3, 1, 0, 2, 0, 0, 2, 3, 1];
- /**
- * PC2 offsets for 2nd block.
- *
- * @constant
- */
- KeySchedule.PC2_offsets2 = [7, 5, 4, 7, 5, 6, 0, 7, 4, 0, 6, 5, 4, 7, 0, 6, 5, 7, 4, 5, 6, 7, 5, 4, 6, 0, 4, 6];
- /**
- * Permuted Choice 2 (PC2) masks for 1st block.
- *
- * @constant
- */
- KeySchedule.PC2_masks1 = [2, 1, 32, 4, 1, 4, 16, 1, 0, 1, 8, 8, 2, 32, 8, 32, 16, 0, 16, 4, 2, 0, 32, 4, 0, 2, 8, 16];
- /**
- * PC2 masks for 2nd block.
- *
- * @constant
- */
- KeySchedule.PC2_masks2 = [2, 32, 8, 1, 2, 2, 0, 4, 4, 0, 8, 16, 32, 16, 0, 32, 4, 32, 2, 1, 16, 8, 8, 16, 1, 0, 1, 4];
- /**
- * Cumulative key shifts.
- *
- * @constant
- */
- KeySchedule.keyShifts = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
- KeySchedule.prototype._initialiseKeys = function (key) {
- var i;
- // extract 56 key bits in order determined by PC1
- var bits = new Array(56);
- for (i = 0; i < 56; i++) {
- bits[i] = (key[KeySchedule.PC1_offsets[i]] & KeySchedule.PC1_masks[i]) != 0;
- }
- // split 56 bits into two 28-bit chunks
- var bits1 = bits.slice(0, 28);
- var bits2 = bits.slice(28, 56);
- // duplicate each half to allow for easy bit shifts
- bits1 = bits1.concat(bits1);
- bits2 = bits2.concat(bits2);
- // assemble the 16 keys
- for (i = 0; i < 16; i++) {
- var k = [0, 0, 0, 0, 0, 0, 0, 0];
- // select the bits of the key according to PC2
- var s = KeySchedule.keyShifts[i];
- for (var j = 0; j < 28; j++) {
- if (bits1[j + s]) {
- k[KeySchedule.PC2_offsets1[j]] += KeySchedule.PC2_masks1[j];
- }
- if (bits2[j + s]) {
- k[KeySchedule.PC2_offsets2[j]] += KeySchedule.PC2_masks2[j];
- }
- }
- // Scale each of the 8 blocks to a 32-bit mask.
- k[0] = ((k[0] & 31) << 27) + ((k[0] & 32) >> 5);
- for (var j = 1; j <= 6; j++) {
- k[j] = k[j] << (27 - 4 * j);
- }
- k[7] = ((k[7] & 62) >> 1) + ((k[7] & 1) << 31);
- this.keys[i] = k;
- }
- };
- /**
- * Retrieve the key for a specified round
- *
- * @param i
- * the round
- * @returns the key
- */
- KeySchedule.prototype.getKey = function (i) {
- return this.keys[i];
- };
- /***************************************************************************
- *
- * DES Engine State
- *
- **************************************************************************/
- var State;
- /**
- * The algorithm's state. DES operates on two sets of 32-bits, with each
- * block of 32-bits treated as a single number.
- *
- * @class
- */
- State = function () {
- /** The LHS of the Feistel scheme */
- this.lhs = 0;
- /** The RHS of the Feistel scheme */
- this.rhs = 0;
- };
- /**
- * The masks that select the SBOX input. Each SBOX accepts 6 bits from the
- * input.
- *
- * @constant
- */
- State.SBOX_MASK = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679];
- /**
- * The SBOXes. The 8 SBOXes each map 6 bit masked bit of the input to 4 bits
- * of output. These SBOXes include the post SBOX permutation and benefit
- * from JavaScript's sparse arrays to make specifying the input match
- * simple.
- *
- * @constant
- */
- State.SBOX = new Array(8);
- var SBOX = State.SBOX;
- SBOX[0] = new Array();
- SBOX[0][0] = 8421888; // 0 (0, 0) = 14
- SBOX[0][268435456] = 32768; // 10000000 (0, 1) = 4
- SBOX[0][536870912] = 8421378; // 20000000 (0, 2) = 13
- SBOX[0][805306368] = 2; // 30000000 (0, 3) = 1
- SBOX[0][1073741824] = 512; // 40000000 (0, 4) = 2
- SBOX[0][1342177280] = 8421890; // 50000000 (0, 5) = 15
- SBOX[0][1610612736] = 8389122; // 60000000 (0, 6) = 11
- SBOX[0][1879048192] = 8388608; // 70000000 (0, 7) = 8
- SBOX[0][-2147483648] = 514; // 80000000 (0, 8) = 3
- SBOX[0][-1879048192] = 8389120; // 90000000 (0, 9) = 10
- SBOX[0][-1610612736] = 33280; // a0000000 (0, 10) = 6
- SBOX[0][-1342177280] = 8421376; // b0000000 (0, 11) = 12
- SBOX[0][-1073741824] = 32770; // c0000000 (0, 12) = 5
- SBOX[0][-805306368] = 8388610; // d0000000 (0, 13) = 9
- SBOX[0][-536870912] = 0; // e0000000 (0, 14) = 0
- SBOX[0][-268435456] = 33282; // f0000000 (0, 15) = 7
- SBOX[0][134217728] = 0; // 8000000 (1, 0) = 0
- SBOX[0][402653184] = 8421890; // 18000000 (1, 1) = 15
- SBOX[0][671088640] = 33282; // 28000000 (1, 2) = 7
- SBOX[0][939524096] = 32768; // 38000000 (1, 3) = 4
- SBOX[0][1207959552] = 8421888; // 48000000 (1, 4) = 14
- SBOX[0][1476395008] = 512; // 58000000 (1, 5) = 2
- SBOX[0][1744830464] = 8421378; // 68000000 (1, 6) = 13
- SBOX[0][2013265920] = 2; // 78000000 (1, 7) = 1
- SBOX[0][-2013265920] = 8389120; // 88000000 (1, 8) = 10
- SBOX[0][-1744830464] = 33280; // 98000000 (1, 9) = 6
- SBOX[0][-1476395008] = 8421376; // a8000000 (1, 10) = 12
- SBOX[0][-1207959552] = 8389122; // b8000000 (1, 11) = 11
- SBOX[0][-939524096] = 8388610; // c8000000 (1, 12) = 9
- SBOX[0][-671088640] = 32770; // d8000000 (1, 13) = 5
- SBOX[0][-402653184] = 514; // e8000000 (1, 14) = 3
- SBOX[0][-134217728] = 8388608; // f8000000 (1, 15) = 8
- SBOX[0][1] = 32768; // 1 (2, 0) = 4
- SBOX[0][268435457] = 2; // 10000001 (2, 1) = 1
- SBOX[0][536870913] = 8421888; // 20000001 (2, 2) = 14
- SBOX[0][805306369] = 8388608; // 30000001 (2, 3) = 8
- SBOX[0][1073741825] = 8421378; // 40000001 (2, 4) = 13
- SBOX[0][1342177281] = 33280; // 50000001 (2, 5) = 6
- SBOX[0][1610612737] = 512; // 60000001 (2, 6) = 2
- SBOX[0][1879048193] = 8389122; // 70000001 (2, 7) = 11
- SBOX[0][-2147483647] = 8421890; // 80000001 (2, 8) = 15
- SBOX[0][-1879048191] = 8421376; // 90000001 (2, 9) = 12
- SBOX[0][-1610612735] = 8388610; // a0000001 (2, 10) = 9
- SBOX[0][-1342177279] = 33282; // b0000001 (2, 11) = 7
- SBOX[0][-1073741823] = 514; // c0000001 (2, 12) = 3
- SBOX[0][-805306367] = 8389120; // d0000001 (2, 13) = 10
- SBOX[0][-536870911] = 32770; // e0000001 (2, 14) = 5
- SBOX[0][-268435455] = 0; // f0000001 (2, 15) = 0
- SBOX[0][134217729] = 8421890; // 8000001 (3, 0) = 15
- SBOX[0][402653185] = 8421376; // 18000001 (3, 1) = 12
- SBOX[0][671088641] = 8388608; // 28000001 (3, 2) = 8
- SBOX[0][939524097] = 512; // 38000001 (3, 3) = 2
- SBOX[0][1207959553] = 32768; // 48000001 (3, 4) = 4
- SBOX[0][1476395009] = 8388610; // 58000001 (3, 5) = 9
- SBOX[0][1744830465] = 2; // 68000001 (3, 6) = 1
- SBOX[0][2013265921] = 33282; // 78000001 (3, 7) = 7
- SBOX[0][-2013265919] = 32770; // 88000001 (3, 8) = 5
- SBOX[0][-1744830463] = 8389122; // 98000001 (3, 9) = 11
- SBOX[0][-1476395007] = 514; // a8000001 (3, 10) = 3
- SBOX[0][-1207959551] = 8421888; // b8000001 (3, 11) = 14
- SBOX[0][-939524095] = 8389120; // c8000001 (3, 12) = 10
- SBOX[0][-671088639] = 0; // d8000001 (3, 13) = 0
- SBOX[0][-402653183] = 33280; // e8000001 (3, 14) = 6
- SBOX[0][-134217727] = 8421378; // f8000001 (3, 15) = 13
- SBOX[1] = new Array();
- SBOX[1][0] = 1074282512; // 0 (0, 0) = 15
- SBOX[1][16777216] = 16384; // 1000000 (0, 1) = 1
- SBOX[1][33554432] = 524288; // 2000000 (0, 2) = 8
- SBOX[1][50331648] = 1074266128; // 3000000 (0, 3) = 14
- SBOX[1][67108864] = 1073741840; // 4000000 (0, 4) = 6
- SBOX[1][83886080] = 1074282496; // 5000000 (0, 5) = 11
- SBOX[1][100663296] = 1073758208; // 6000000 (0, 6) = 3
- SBOX[1][117440512] = 16; // 7000000 (0, 7) = 4
- SBOX[1][134217728] = 540672; // 8000000 (0, 8) = 9
- SBOX[1][150994944] = 1073758224; // 9000000 (0, 9) = 7
- SBOX[1][167772160] = 1073741824; // a000000 (0, 10) = 2
- SBOX[1][184549376] = 540688; // b000000 (0, 11) = 13
- SBOX[1][201326592] = 524304; // c000000 (0, 12) = 12
- SBOX[1][218103808] = 0; // d000000 (0, 13) = 0
- SBOX[1][234881024] = 16400; // e000000 (0, 14) = 5
- SBOX[1][251658240] = 1074266112; // f000000 (0, 15) = 10
- SBOX[1][8388608] = 1073758208; // 800000 (1, 0) = 3
- SBOX[1][25165824] = 540688; // 1800000 (1, 1) = 13
- SBOX[1][41943040] = 16; // 2800000 (1, 2) = 4
- SBOX[1][58720256] = 1073758224; // 3800000 (1, 3) = 7
- SBOX[1][75497472] = 1074282512; // 4800000 (1, 4) = 15
- SBOX[1][92274688] = 1073741824; // 5800000 (1, 5) = 2
- SBOX[1][109051904] = 524288; // 6800000 (1, 6) = 8
- SBOX[1][125829120] = 1074266128; // 7800000 (1, 7) = 14
- SBOX[1][142606336] = 524304; // 8800000 (1, 8) = 12
- SBOX[1][159383552] = 0; // 9800000 (1, 9) = 0
- SBOX[1][176160768] = 16384; // a800000 (1, 10) = 1
- SBOX[1][192937984] = 1074266112; // b800000 (1, 11) = 10
- SBOX[1][209715200] = 1073741840; // c800000 (1, 12) = 6
- SBOX[1][226492416] = 540672; // d800000 (1, 13) = 9
- SBOX[1][243269632] = 1074282496; // e800000 (1, 14) = 11
- SBOX[1][260046848] = 16400; // f800000 (1, 15) = 5
- SBOX[1][268435456] = 0; // 10000000 (2, 0) = 0
- SBOX[1][285212672] = 1074266128; // 11000000 (2, 1) = 14
- SBOX[1][301989888] = 1073758224; // 12000000 (2, 2) = 7
- SBOX[1][318767104] = 1074282496; // 13000000 (2, 3) = 11
- SBOX[1][335544320] = 1074266112; // 14000000 (2, 4) = 10
- SBOX[1][352321536] = 16; // 15000000 (2, 5) = 4
- SBOX[1][369098752] = 540688; // 16000000 (2, 6) = 13
- SBOX[1][385875968] = 16384; // 17000000 (2, 7) = 1
- SBOX[1][402653184] = 16400; // 18000000 (2, 8) = 5
- SBOX[1][419430400] = 524288; // 19000000 (2, 9) = 8
- SBOX[1][436207616] = 524304; // 1a000000 (2, 10) = 12
- SBOX[1][452984832] = 1073741840; // 1b000000 (2, 11) = 6
- SBOX[1][469762048] = 540672; // 1c000000 (2, 12) = 9
- SBOX[1][486539264] = 1073758208; // 1d000000 (2, 13) = 3
- SBOX[1][503316480] = 1073741824; // 1e000000 (2, 14) = 2
- SBOX[1][520093696] = 1074282512; // 1f000000 (2, 15) = 15
- SBOX[1][276824064] = 540688; // 10800000 (3, 0) = 13
- SBOX[1][293601280] = 524288; // 11800000 (3, 1) = 8
- SBOX[1][310378496] = 1074266112; // 12800000 (3, 2) = 10
- SBOX[1][327155712] = 16384; // 13800000 (3, 3) = 1
- SBOX[1][343932928] = 1073758208; // 14800000 (3, 4) = 3
- SBOX[1][360710144] = 1074282512; // 15800000 (3, 5) = 15
- SBOX[1][377487360] = 16; // 16800000 (3, 6) = 4
- SBOX[1][394264576] = 1073741824; // 17800000 (3, 7) = 2
- SBOX[1][411041792] = 1074282496; // 18800000 (3, 8) = 11
- SBOX[1][427819008] = 1073741840; // 19800000 (3, 9) = 6
- SBOX[1][444596224] = 1073758224; // 1a800000 (3, 10) = 7
- SBOX[1][461373440] = 524304; // 1b800000 (3, 11) = 12
- SBOX[1][478150656] = 0; // 1c800000 (3, 12) = 0
- SBOX[1][494927872] = 16400; // 1d800000 (3, 13) = 5
- SBOX[1][511705088] = 1074266128; // 1e800000 (3, 14) = 14
- SBOX[1][528482304] = 540672; // 1f800000 (3, 15) = 9
- SBOX[2] = new Array();
- SBOX[2][0] = 260; // 0 (0, 0) = 10
- SBOX[2][1048576] = 0; // 100000 (0, 1) = 0
- SBOX[2][2097152] = 67109120; // 200000 (0, 2) = 9
- SBOX[2][3145728] = 65796; // 300000 (0, 3) = 14
- SBOX[2][4194304] = 65540; // 400000 (0, 4) = 6
- SBOX[2][5242880] = 67108868; // 500000 (0, 5) = 3
- SBOX[2][6291456] = 67174660; // 600000 (0, 6) = 15
- SBOX[2][7340032] = 67174400; // 700000 (0, 7) = 5
- SBOX[2][8388608] = 67108864; // 800000 (0, 8) = 1
- SBOX[2][9437184] = 67174656; // 900000 (0, 9) = 13
- SBOX[2][10485760] = 65792; // a00000 (0, 10) = 12
- SBOX[2][11534336] = 67174404; // b00000 (0, 11) = 7
- SBOX[2][12582912] = 67109124; // c00000 (0, 12) = 11
- SBOX[2][13631488] = 65536; // d00000 (0, 13) = 4
- SBOX[2][14680064] = 4; // e00000 (0, 14) = 2
- SBOX[2][15728640] = 256; // f00000 (0, 15) = 8
- SBOX[2][524288] = 67174656; // 80000 (1, 0) = 13
- SBOX[2][1572864] = 67174404; // 180000 (1, 1) = 7
- SBOX[2][2621440] = 0; // 280000 (1, 2) = 0
- SBOX[2][3670016] = 67109120; // 380000 (1, 3) = 9
- SBOX[2][4718592] = 67108868; // 480000 (1, 4) = 3
- SBOX[2][5767168] = 65536; // 580000 (1, 5) = 4
- SBOX[2][6815744] = 65540; // 680000 (1, 6) = 6
- SBOX[2][7864320] = 260; // 780000 (1, 7) = 10
- SBOX[2][8912896] = 4; // 880000 (1, 8) = 2
- SBOX[2][9961472] = 256; // 980000 (1, 9) = 8
- SBOX[2][11010048] = 67174400; // a80000 (1, 10) = 5
- SBOX[2][12058624] = 65796; // b80000 (1, 11) = 14
- SBOX[2][13107200] = 65792; // c80000 (1, 12) = 12
- SBOX[2][14155776] = 67109124; // d80000 (1, 13) = 11
- SBOX[2][15204352] = 67174660; // e80000 (1, 14) = 15
- SBOX[2][16252928] = 67108864; // f80000 (1, 15) = 1
- SBOX[2][16777216] = 67174656; // 1000000 (2, 0) = 13
- SBOX[2][17825792] = 65540; // 1100000 (2, 1) = 6
- SBOX[2][18874368] = 65536; // 1200000 (2, 2) = 4
- SBOX[2][19922944] = 67109120; // 1300000 (2, 3) = 9
- SBOX[2][20971520] = 256; // 1400000 (2, 4) = 8
- SBOX[2][22020096] = 67174660; // 1500000 (2, 5) = 15
- SBOX[2][23068672] = 67108868; // 1600000 (2, 6) = 3
- SBOX[2][24117248] = 0; // 1700000 (2, 7) = 0
- SBOX[2][25165824] = 67109124; // 1800000 (2, 8) = 11
- SBOX[2][26214400] = 67108864; // 1900000 (2, 9) = 1
- SBOX[2][27262976] = 4; // 1a00000 (2, 10) = 2
- SBOX[2][28311552] = 65792; // 1b00000 (2, 11) = 12
- SBOX[2][29360128] = 67174400; // 1c00000 (2, 12) = 5
- SBOX[2][30408704] = 260; // 1d00000 (2, 13) = 10
- SBOX[2][31457280] = 65796; // 1e00000 (2, 14) = 14
- SBOX[2][32505856] = 67174404; // 1f00000 (2, 15) = 7
- SBOX[2][17301504] = 67108864; // 1080000 (3, 0) = 1
- SBOX[2][18350080] = 260; // 1180000 (3, 1) = 10
- SBOX[2][19398656] = 67174656; // 1280000 (3, 2) = 13
- SBOX[2][20447232] = 0; // 1380000 (3, 3) = 0
- SBOX[2][21495808] = 65540; // 1480000 (3, 4) = 6
- SBOX[2][22544384] = 67109120; // 1580000 (3, 5) = 9
- SBOX[2][23592960] = 256; // 1680000 (3, 6) = 8
- SBOX[2][24641536] = 67174404; // 1780000 (3, 7) = 7
- SBOX[2][25690112] = 65536; // 1880000 (3, 8) = 4
- SBOX[2][26738688] = 67174660; // 1980000 (3, 9) = 15
- SBOX[2][27787264] = 65796; // 1a80000 (3, 10) = 14
- SBOX[2][28835840] = 67108868; // 1b80000 (3, 11) = 3
- SBOX[2][29884416] = 67109124; // 1c80000 (3, 12) = 11
- SBOX[2][30932992] = 67174400; // 1d80000 (3, 13) = 5
- SBOX[2][31981568] = 4; // 1e80000 (3, 14) = 2
- SBOX[2][33030144] = 65792; // 1f80000 (3, 15) = 12
- SBOX[3] = new Array();
- SBOX[3][0] = 2151682048; // 0 (0, 0) = 7
- SBOX[3][65536] = 2147487808; // 10000 (0, 1) = 13
- SBOX[3][131072] = 4198464; // 20000 (0, 2) = 14
- SBOX[3][196608] = 2151677952; // 30000 (0, 3) = 3
- SBOX[3][262144] = 0; // 40000 (0, 4) = 0
- SBOX[3][327680] = 4198400; // 50000 (0, 5) = 6
- SBOX[3][393216] = 2147483712; // 60000 (0, 6) = 9
- SBOX[3][458752] = 4194368; // 70000 (0, 7) = 10
- SBOX[3][524288] = 2147483648; // 80000 (0, 8) = 1
- SBOX[3][589824] = 4194304; // 90000 (0, 9) = 2
- SBOX[3][655360] = 64; // a0000 (0, 10) = 8
- SBOX[3][720896] = 2147487744; // b0000 (0, 11) = 5
- SBOX[3][786432] = 2151678016; // c0000 (0, 12) = 11
- SBOX[3][851968] = 4160; // d0000 (0, 13) = 12
- SBOX[3][917504] = 4096; // e0000 (0, 14) = 4
- SBOX[3][983040] = 2151682112; // f0000 (0, 15) = 15
- SBOX[3][32768] = 2147487808; // 8000 (1, 0) = 13
- SBOX[3][98304] = 64; // 18000 (1, 1) = 8
- SBOX[3][163840] = 2151678016; // 28000 (1, 2) = 11
- SBOX[3][229376] = 2147487744; // 38000 (1, 3) = 5
- SBOX[3][294912] = 4198400; // 48000 (1, 4) = 6
- SBOX[3][360448] = 2151682112; // 58000 (1, 5) = 15
- SBOX[3][425984] = 0; // 68000 (1, 6) = 0
- SBOX[3][491520] = 2151677952; // 78000 (1, 7) = 3
- SBOX[3][557056] = 4096; // 88000 (1, 8) = 4
- SBOX[3][622592] = 2151682048; // 98000 (1, 9) = 7
- SBOX[3][688128] = 4194304; // a8000 (1, 10) = 2
- SBOX[3][753664] = 4160; // b8000 (1, 11) = 12
- SBOX[3][819200] = 2147483648; // c8000 (1, 12) = 1
- SBOX[3][884736] = 4194368; // d8000 (1, 13) = 10
- SBOX[3][950272] = 4198464; // e8000 (1, 14) = 14
- SBOX[3][1015808] = 2147483712; // f8000 (1, 15) = 9
- SBOX[3][1048576] = 4194368; // 100000 (2, 0) = 10
- SBOX[3][1114112] = 4198400; // 110000 (2, 1) = 6
- SBOX[3][1179648] = 2147483712; // 120000 (2, 2) = 9
- SBOX[3][1245184] = 0; // 130000 (2, 3) = 0
- SBOX[3][1310720] = 4160; // 140000 (2, 4) = 12
- SBOX[3][1376256] = 2151678016; // 150000 (2, 5) = 11
- SBOX[3][1441792] = 2151682048; // 160000 (2, 6) = 7
- SBOX[3][1507328] = 2147487808; // 170000 (2, 7) = 13
- SBOX[3][1572864] = 2151682112; // 180000 (2, 8) = 15
- SBOX[3][1638400] = 2147483648; // 190000 (2, 9) = 1
- SBOX[3][1703936] = 2151677952; // 1a0000 (2, 10) = 3
- SBOX[3][1769472] = 4198464; // 1b0000 (2, 11) = 14
- SBOX[3][1835008] = 2147487744; // 1c0000 (2, 12) = 5
- SBOX[3][1900544] = 4194304; // 1d0000 (2, 13) = 2
- SBOX[3][1966080] = 64; // 1e0000 (2, 14) = 8
- SBOX[3][2031616] = 4096; // 1f0000 (2, 15) = 4
- SBOX[3][1081344] = 2151677952; // 108000 (3, 0) = 3
- SBOX[3][1146880] = 2151682112; // 118000 (3, 1) = 15
- SBOX[3][1212416] = 0; // 128000 (3, 2) = 0
- SBOX[3][1277952] = 4198400; // 138000 (3, 3) = 6
- SBOX[3][1343488] = 4194368; // 148000 (3, 4) = 10
- SBOX[3][1409024] = 2147483648; // 158000 (3, 5) = 1
- SBOX[3][1474560] = 2147487808; // 168000 (3, 6) = 13
- SBOX[3][1540096] = 64; // 178000 (3, 7) = 8
- SBOX[3][1605632] = 2147483712; // 188000 (3, 8) = 9
- SBOX[3][1671168] = 4096; // 198000 (3, 9) = 4
- SBOX[3][1736704] = 2147487744; // 1a8000 (3, 10) = 5
- SBOX[3][1802240] = 2151678016; // 1b8000 (3, 11) = 11
- SBOX[3][1867776] = 4160; // 1c8000 (3, 12) = 12
- SBOX[3][1933312] = 2151682048; // 1d8000 (3, 13) = 7
- SBOX[3][1998848] = 4194304; // 1e8000 (3, 14) = 2
- SBOX[3][2064384] = 4198464; // 1f8000 (3, 15) = 14
- SBOX[4] = new Array();
- SBOX[4][0] = 128; // 0 (0, 0) = 2
- SBOX[4][4096] = 17039360; // 1000 (0, 1) = 12
- SBOX[4][8192] = 262144; // 2000 (0, 2) = 4
- SBOX[4][12288] = 536870912; // 3000 (0, 3) = 1
- SBOX[4][16384] = 537133184; // 4000 (0, 4) = 7
- SBOX[4][20480] = 16777344; // 5000 (0, 5) = 10
- SBOX[4][24576] = 553648256; // 6000 (0, 6) = 11
- SBOX[4][28672] = 262272; // 7000 (0, 7) = 6
- SBOX[4][32768] = 16777216; // 8000 (0, 8) = 8
- SBOX[4][36864] = 537133056; // 9000 (0, 9) = 5
- SBOX[4][40960] = 536871040; // a000 (0, 10) = 3
- SBOX[4][45056] = 553910400; // b000 (0, 11) = 15
- SBOX[4][49152] = 553910272; // c000 (0, 12) = 13
- SBOX[4][53248] = 0; // d000 (0, 13) = 0
- SBOX[4][57344] = 17039488; // e000 (0, 14) = 14
- SBOX[4][61440] = 553648128; // f000 (0, 15) = 9
- SBOX[4][2048] = 17039488; // 800 (1, 0) = 14
- SBOX[4][6144] = 553648256; // 1800 (1, 1) = 11
- SBOX[4][10240] = 128; // 2800 (1, 2) = 2
- SBOX[4][14336] = 17039360; // 3800 (1, 3) = 12
- SBOX[4][18432] = 262144; // 4800 (1, 4) = 4
- SBOX[4][22528] = 537133184; // 5800 (1, 5) = 7
- SBOX[4][26624] = 553910272; // 6800 (1, 6) = 13
- SBOX[4][30720] = 536870912; // 7800 (1, 7) = 1
- SBOX[4][34816] = 537133056; // 8800 (1, 8) = 5
- SBOX[4][38912] = 0; // 9800 (1, 9) = 0
- SBOX[4][43008] = 553910400; // a800 (1, 10) = 15
- SBOX[4][47104] = 16777344; // b800 (1, 11) = 10
- SBOX[4][51200] = 536871040; // c800 (1, 12) = 3
- SBOX[4][55296] = 553648128; // d800 (1, 13) = 9
- SBOX[4][59392] = 16777216; // e800 (1, 14) = 8
- SBOX[4][63488] = 262272; // f800 (1, 15) = 6
- SBOX[4][65536] = 262144; // 10000 (2, 0) = 4
- SBOX[4][69632] = 128; // 11000 (2, 1) = 2
- SBOX[4][73728] = 536870912; // 12000 (2, 2) = 1
- SBOX[4][77824] = 553648256; // 13000 (2, 3) = 11
- SBOX[4][81920] = 16777344; // 14000 (2, 4) = 10
- SBOX[4][86016] = 553910272; // 15000 (2, 5) = 13
- SBOX[4][90112] = 537133184; // 16000 (2, 6) = 7
- SBOX[4][94208] = 16777216; // 17000 (2, 7) = 8
- SBOX[4][98304] = 553910400; // 18000 (2, 8) = 15
- SBOX[4][102400] = 553648128; // 19000 (2, 9) = 9
- SBOX[4][106496] = 17039360; // 1a000 (2, 10) = 12
- SBOX[4][110592] = 537133056; // 1b000 (2, 11) = 5
- SBOX[4][114688] = 262272; // 1c000 (2, 12) = 6
- SBOX[4][118784] = 536871040; // 1d000 (2, 13) = 3
- SBOX[4][122880] = 0; // 1e000 (2, 14) = 0
- SBOX[4][126976] = 17039488; // 1f000 (2, 15) = 14
- SBOX[4][67584] = 553648256; // 10800 (3, 0) = 11
- SBOX[4][71680] = 16777216; // 11800 (3, 1) = 8
- SBOX[4][75776] = 17039360; // 12800 (3, 2) = 12
- SBOX[4][79872] = 537133184; // 13800 (3, 3) = 7
- SBOX[4][83968] = 536870912; // 14800 (3, 4) = 1
- SBOX[4][88064] = 17039488; // 15800 (3, 5) = 14
- SBOX[4][92160] = 128; // 16800 (3, 6) = 2
- SBOX[4][96256] = 553910272; // 17800 (3, 7) = 13
- SBOX[4][100352] = 262272; // 18800 (3, 8) = 6
- SBOX[4][104448] = 553910400; // 19800 (3, 9) = 15
- SBOX[4][108544] = 0; // 1a800 (3, 10) = 0
- SBOX[4][112640] = 553648128; // 1b800 (3, 11) = 9
- SBOX[4][116736] = 16777344; // 1c800 (3, 12) = 10
- SBOX[4][120832] = 262144; // 1d800 (3, 13) = 4
- SBOX[4][124928] = 537133056; // 1e800 (3, 14) = 5
- SBOX[4][129024] = 536871040; // 1f800 (3, 15) = 3
- SBOX[5] = new Array();
- SBOX[5][0] = 268435464; // 0 (0, 0) = 12
- SBOX[5][256] = 8192; // 100 (0, 1) = 1
- SBOX[5][512] = 270532608; // 200 (0, 2) = 10
- SBOX[5][768] = 270540808; // 300 (0, 3) = 15
- SBOX[5][1024] = 268443648; // 400 (0, 4) = 9
- SBOX[5][1280] = 2097152; // 500 (0, 5) = 2
- SBOX[5][1536] = 2097160; // 600 (0, 6) = 6
- SBOX[5][1792] = 268435456; // 700 (0, 7) = 8
- SBOX[5][2048] = 0; // 800 (0, 8) = 0
- SBOX[5][2304] = 268443656; // 900 (0, 9) = 13
- SBOX[5][2560] = 2105344; // a00 (0, 10) = 3
- SBOX[5][2816] = 8; // b00 (0, 11) = 4
- SBOX[5][3072] = 270532616; // c00 (0, 12) = 14
- SBOX[5][3328] = 2105352; // d00 (0, 13) = 7
- SBOX[5][3584] = 8200; // e00 (0, 14) = 5
- SBOX[5][3840] = 270540800; // f00 (0, 15) = 11
- SBOX[5][128] = 270532608; // 80 (1, 0) = 10
- SBOX[5][384] = 270540808; // 180 (1, 1) = 15
- SBOX[5][640] = 8; // 280 (1, 2) = 4
- SBOX[5][896] = 2097152; // 380 (1, 3) = 2
- SBOX[5][1152] = 2105352; // 480 (1, 4) = 7
- SBOX[5][1408] = 268435464; // 580 (1, 5) = 12
- SBOX[5][1664] = 268443648; // 680 (1, 6) = 9
- SBOX[5][1920] = 8200; // 780 (1, 7) = 5
- SBOX[5][2176] = 2097160; // 880 (1, 8) = 6
- SBOX[5][2432] = 8192; // 980 (1, 9) = 1
- SBOX[5][2688] = 268443656; // a80 (1, 10) = 13
- SBOX[5][2944] = 270532616; // b80 (1, 11) = 14
- SBOX[5][3200] = 0; // c80 (1, 12) = 0
- SBOX[5][3456] = 270540800; // d80 (1, 13) = 11
- SBOX[5][3712] = 2105344; // e80 (1, 14) = 3
- SBOX[5][3968] = 268435456; // f80 (1, 15) = 8
- SBOX[5][4096] = 268443648; // 1000 (2, 0) = 9
- SBOX[5][4352] = 270532616; // 1100 (2, 1) = 14
- SBOX[5][4608] = 270540808; // 1200 (2, 2) = 15
- SBOX[5][4864] = 8200; // 1300 (2, 3) = 5
- SBOX[5][5120] = 2097152; // 1400 (2, 4) = 2
- SBOX[5][5376] = 268435456; // 1500 (2, 5) = 8
- SBOX[5][5632] = 268435464; // 1600 (2, 6) = 12
- SBOX[5][5888] = 2105344; // 1700 (2, 7) = 3
- SBOX[5][6144] = 2105352; // 1800 (2, 8) = 7
- SBOX[5][6400] = 0; // 1900 (2, 9) = 0
- SBOX[5][6656] = 8; // 1a00 (2, 10) = 4
- SBOX[5][6912] = 270532608; // 1b00 (2, 11) = 10
- SBOX[5][7168] = 8192; // 1c00 (2, 12) = 1
- SBOX[5][7424] = 268443656; // 1d00 (2, 13) = 13
- SBOX[5][7680] = 270540800; // 1e00 (2, 14) = 11
- SBOX[5][7936] = 2097160; // 1f00 (2, 15) = 6
- SBOX[5][4224] = 8; // 1080 (3, 0) = 4
- SBOX[5][4480] = 2105344; // 1180 (3, 1) = 3
- SBOX[5][4736] = 2097152; // 1280 (3, 2) = 2
- SBOX[5][4992] = 268435464; // 1380 (3, 3) = 12
- SBOX[5][5248] = 268443648; // 1480 (3, 4) = 9
- SBOX[5][5504] = 8200; // 1580 (3, 5) = 5
- SBOX[5][5760] = 270540808; // 1680 (3, 6) = 15
- SBOX[5][6016] = 270532608; // 1780 (3, 7) = 10
- SBOX[5][6272] = 270540800; // 1880 (3, 8) = 11
- SBOX[5][6528] = 270532616; // 1980 (3, 9) = 14
- SBOX[5][6784] = 8192; // 1a80 (3, 10) = 1
- SBOX[5][7040] = 2105352; // 1b80 (3, 11) = 7
- SBOX[5][7296] = 2097160; // 1c80 (3, 12) = 6
- SBOX[5][7552] = 0; // 1d80 (3, 13) = 0
- SBOX[5][7808] = 268435456; // 1e80 (3, 14) = 8
- SBOX[5][8064] = 268443656; // 1f80 (3, 15) = 13
- SBOX[6] = new Array();
- SBOX[6][0] = 1048576; // 0 (0, 0) = 4
- SBOX[6][16] = 33555457; // 10 (0, 1) = 11
- SBOX[6][32] = 1024; // 20 (0, 2) = 2
- SBOX[6][48] = 1049601; // 30 (0, 3) = 14
- SBOX[6][64] = 34604033; // 40 (0, 4) = 15
- SBOX[6][80] = 0; // 50 (0, 5) = 0
- SBOX[6][96] = 1; // 60 (0, 6) = 8
- SBOX[6][112] = 34603009; // 70 (0, 7) = 13
- SBOX[6][128] = 33555456; // 80 (0, 8) = 3
- SBOX[6][144] = 1048577; // 90 (0, 9) = 12
- SBOX[6][160] = 33554433; // a0 (0, 10) = 9
- SBOX[6][176] = 34604032; // b0 (0, 11) = 7
- SBOX[6][192] = 34603008; // c0 (0, 12) = 5
- SBOX[6][208] = 1025; // d0 (0, 13) = 10
- SBOX[6][224] = 1049600; // e0 (0, 14) = 6
- SBOX[6][240] = 33554432; // f0 (0, 15) = 1
- SBOX[6][8] = 34603009; // 8 (1, 0) = 13
- SBOX[6][24] = 0; // 18 (1, 1) = 0
- SBOX[6][40] = 33555457; // 28 (1, 2) = 11
- SBOX[6][56] = 34604032; // 38 (1, 3) = 7
- SBOX[6][72] = 1048576; // 48 (1, 4) = 4
- SBOX[6][88] = 33554433; // 58 (1, 5) = 9
- SBOX[6][104] = 33554432; // 68 (1, 6) = 1
- SBOX[6][120] = 1025; // 78 (1, 7) = 10
- SBOX[6][136] = 1049601; // 88 (1, 8) = 14
- SBOX[6][152] = 33555456; // 98 (1, 9) = 3
- SBOX[6][168] = 34603008; // a8 (1, 10) = 5
- SBOX[6][184] = 1048577; // b8 (1, 11) = 12
- SBOX[6][200] = 1024; // c8 (1, 12) = 2
- SBOX[6][216] = 34604033; // d8 (1, 13) = 15
- SBOX[6][232] = 1; // e8 (1, 14) = 8
- SBOX[6][248] = 1049600; // f8 (1, 15) = 6
- SBOX[6][256] = 33554432; // 100 (2, 0) = 1
- SBOX[6][272] = 1048576; // 110 (2, 1) = 4
- SBOX[6][288] = 33555457; // 120 (2, 2) = 11
- SBOX[6][304] = 34603009; // 130 (2, 3) = 13
- SBOX[6][320] = 1048577; // 140 (2, 4) = 12
- SBOX[6][336] = 33555456; // 150 (2, 5) = 3
- SBOX[6][352] = 34604032; // 160 (2, 6) = 7
- SBOX[6][368] = 1049601; // 170 (2, 7) = 14
- SBOX[6][384] = 1025; // 180 (2, 8) = 10
- SBOX[6][400] = 34604033; // 190 (2, 9) = 15
- SBOX[6][416] = 1049600; // 1a0 (2, 10) = 6
- SBOX[6][432] = 1; // 1b0 (2, 11) = 8
- SBOX[6][448] = 0; // 1c0 (2, 12) = 0
- SBOX[6][464] = 34603008; // 1d0 (2, 13) = 5
- SBOX[6][480] = 33554433; // 1e0 (2, 14) = 9
- SBOX[6][496] = 1024; // 1f0 (2, 15) = 2
- SBOX[6][264] = 1049600; // 108 (3, 0) = 6
- SBOX[6][280] = 33555457; // 118 (3, 1) = 11
- SBOX[6][296] = 34603009; // 128 (3, 2) = 13
- SBOX[6][312] = 1; // 138 (3, 3) = 8
- SBOX[6][328] = 33554432; // 148 (3, 4) = 1
- SBOX[6][344] = 1048576; // 158 (3, 5) = 4
- SBOX[6][360] = 1025; // 168 (3, 6) = 10
- SBOX[6][376] = 34604032; // 178 (3, 7) = 7
- SBOX[6][392] = 33554433; // 188 (3, 8) = 9
- SBOX[6][408] = 34603008; // 198 (3, 9) = 5
- SBOX[6][424] = 0; // 1a8 (3, 10) = 0
- SBOX[6][440] = 34604033; // 1b8 (3, 11) = 15
- SBOX[6][456] = 1049601; // 1c8 (3, 12) = 14
- SBOX[6][472] = 1024; // 1d8 (3, 13) = 2
- SBOX[6][488] = 33555456; // 1e8 (3, 14) = 3
- SBOX[6][504] = 1048577; // 1f8 (3, 15) = 12
- SBOX[7] = new Array();
- SBOX[7][0] = 134219808; // 0 (0, 0) = 13
- SBOX[7][1] = 131072; // 1 (0, 1) = 2
- SBOX[7][2] = 134217728; // 2 (0, 2) = 8
- SBOX[7][3] = 32; // 3 (0, 3) = 4
- SBOX[7][4] = 131104; // 4 (0, 4) = 6
- SBOX[7][5] = 134350880; // 5 (0, 5) = 15
- SBOX[7][6] = 134350848; // 6 (0, 6) = 11
- SBOX[7][7] = 2048; // 7 (0, 7) = 1
- SBOX[7][8] = 134348800; // 8 (0, 8) = 10
- SBOX[7][9] = 134219776; // 9 (0, 9) = 9
- SBOX[7][10] = 133120; // a (0, 10) = 3
- SBOX[7][11] = 134348832; // b (0, 11) = 14
- SBOX[7][12] = 2080; // c (0, 12) = 5
- SBOX[7][13] = 0; // d (0, 13) = 0
- SBOX[7][14] = 134217760; // e (0, 14) = 12
- SBOX[7][15] = 133152; // f (0, 15) = 7
- SBOX[7][-2147483648] = 2048; // 80000000 (1, 0) = 1
- SBOX[7][-2147483647] = 134350880; // 80000001 (1, 1) = 15
- SBOX[7][-2147483646] = 134219808; // 80000002 (1, 2) = 13
- SBOX[7][-2147483645] = 134217728; // 80000003 (1, 3) = 8
- SBOX[7][-2147483644] = 134348800; // 80000004 (1, 4) = 10
- SBOX[7][-2147483643] = 133120; // 80000005 (1, 5) = 3
- SBOX[7][-2147483642] = 133152; // 80000006 (1, 6) = 7
- SBOX[7][-2147483641] = 32; // 80000007 (1, 7) = 4
- SBOX[7][-2147483640] = 134217760; // 80000008 (1, 8) = 12
- SBOX[7][-2147483639] = 2080; // 80000009 (1, 9) = 5
- SBOX[7][-2147483638] = 131104; // 8000000a (1, 10) = 6
- SBOX[7][-2147483637] = 134350848; // 8000000b (1, 11) = 11
- SBOX[7][-2147483636] = 0; // 8000000c (1, 12) = 0
- SBOX[7][-2147483635] = 134348832; // 8000000d (1, 13) = 14
- SBOX[7][-2147483634] = 134219776; // 8000000e (1, 14) = 9
- SBOX[7][-2147483633] = 131072; // 8000000f (1, 15) = 2
- SBOX[7][16] = 133152; // 10 (2, 0) = 7
- SBOX[7][17] = 134350848; // 11 (2, 1) = 11
- SBOX[7][18] = 32; // 12 (2, 2) = 4
- SBOX[7][19] = 2048; // 13 (2, 3) = 1
- SBOX[7][20] = 134219776; // 14 (2, 4) = 9
- SBOX[7][21] = 134217760; // 15 (2, 5) = 12
- SBOX[7][22] = 134348832; // 16 (2, 6) = 14
- SBOX[7][23] = 131072; // 17 (2, 7) = 2
- SBOX[7][24] = 0; // 18 (2, 8) = 0
- SBOX[7][25] = 131104; // 19 (2, 9) = 6
- SBOX[7][26] = 134348800; // 1a (2, 10) = 10
- SBOX[7][27] = 134219808; // 1b (2, 11) = 13
- SBOX[7][28] = 134350880; // 1c (2, 12) = 15
- SBOX[7][29] = 133120; // 1d (2, 13) = 3
- SBOX[7][30] = 2080; // 1e (2, 14) = 5
- SBOX[7][31] = 134217728; // 1f (2, 15) = 8
- SBOX[7][-2147483632] = 131072; // 80000010 (3, 0) = 2
- SBOX[7][-2147483631] = 2048; // 80000011 (3, 1) = 1
- SBOX[7][-2147483630] = 134348832; // 80000012 (3, 2) = 14
- SBOX[7][-2147483629] = 133152; // 80000013 (3, 3) = 7
- SBOX[7][-2147483628] = 32; // 80000014 (3, 4) = 4
- SBOX[7][-2147483627] = 134348800; // 80000015 (3, 5) = 10
- SBOX[7][-2147483626] = 134217728; // 80000016 (3, 6) = 8
- SBOX[7][-2147483625] = 134219808; // 80000017 (3, 7) = 13
- SBOX[7][-2147483624] = 134350880; // 80000018 (3, 8) = 15
- SBOX[7][-2147483623] = 134217760; // 80000019 (3, 9) = 12
- SBOX[7][-2147483622] = 134219776; // 8000001a (3, 10) = 9
- SBOX[7][-2147483621] = 0; // 8000001b (3, 11) = 0
- SBOX[7][-2147483620] = 133120; // 8000001c (3, 12) = 3
- SBOX[7][-2147483619] = 2080; // 8000001d (3, 13) = 5
- SBOX[7][-2147483618] = 131104; // 8000001e (3, 14) = 6
- SBOX[7][-2147483617] = 134350848; // 8000001f (3, 15) = 11
- State.prototype._exchangeLR = function (v, m) {
- var t = ((this.lhs >> v) ^ this.rhs) & m;
- this.rhs ^= t;
- this.lhs ^= t << v;
- };
- State.prototype._exchangeRL = function (v, m) {
- var t = ((this.rhs >> v) ^ this.lhs) & m;
- this.lhs ^= t;
- this.rhs ^= t << v;
- };
- /**
- * Perform the initial permutation of the input to create the starting state
- * of the algorithm. The initial permutation maps each consecutive bit of
- * the input into a different byte of the state.
- *
- * <pre>
- * The initial permutation is defined to be:
- *
- * 58 50 42 34 26 18 10 2
- * 60 52 44 36 28 20 12 4
- * 62 54 46 38 30 22 14 6
- * 64 56 48 40 32 24 16 8
- * 57 49 41 33 25 17 9 1
- * 59 51 43 35 27 19 11 3
- * 61 53 45 37 29 21 13 5
- * 63 55 47 39 31 23 15 7
- * </pre>
- *
- *
- * @param message
- * The message as an array of unsigned bytes.
- * @param offset
- * The offset into the message that the current 64-bit block
- * begins.
- * @returns the initial engine state
- */
- State.prototype.initialPerm = function (message, offset) {
- var input = message.slice(offset, offset + 8);
- this.lhs = (input[0] << 24) + (input[1] << 16) + (input[2] << 8) + input[3];
- this.rhs = (input[4] << 24) + (input[5] << 16) + (input[6] << 8) + input[7];
- this._exchangeLR(4, 252645135);
- this._exchangeLR(16, 65535);
- this._exchangeRL(2, 858993459);
- this._exchangeRL(8, 16711935);
- this._exchangeLR(1, 1431655765);
- };
- /**
- * Perform one round of the DES algorithm using the given key. A round is
- * defined as:
- *
- * <pre>
- * L&rsquo = R
- * R&rsquo = L ˆ f(R, k)
- * </pre>
- *
- * where f consists of expanding, XORing with the key and contracting back
- * with the SBOXes.
- *
- * Note that the final round is defined slightly differently as:
- *
- * <pre>
- * L&rsquo = L ˆ f(R, k)
- * R&rsquo = R
- * </pre>
- *
- * Therefore in the final round this function produces LHS and RHS the wrong
- * way around.
- *
- * @param k
- * the key
- */
- State.prototype.round = function (k) {
- var r = this.rhs;
- var l = this.lhs;
- var f = 0;
- for (var i = 0; i < 8; i++) {
- var v = (r ^ k[i]) & State.SBOX_MASK[i];
- f += State.SBOX[i][v];
- }
- this.lhs = r;
- this.rhs = l ^ f;
- };
- /**
- * Apply the inverse of the initial permutation.
- *
- * <pre>
- * The inverse is defined to be:
- *
- * 40 8 48 16 56 24 64 32
- * 39 7 47 15 55 23 63 31
- * 38 6 46 14 54 22 62 30
- * 37 5 45 13 53 21 61 29
- * 36 4 44 12 52 20 60 28
- * 35 3 43 11 51 19 59 27
- * 34 2 42 10 50 18 58 26
- * 33 1 41 9 49 17 57 25
- * </pre>
- *
- * @param cipherText
- * @param offset
- */
- State.prototype.finalPerm = function (cipherText, offset) {
- var t = this.lhs;
- this.lhs = this.rhs;
- this.rhs = t;
- this._exchangeLR(1, 1431655765);
- this._exchangeRL(8, 16711935);
- this._exchangeRL(2, 858993459);
- this._exchangeLR(16, 65535);
- this._exchangeLR(4, 252645135);
- cipherText[offset] = (this.lhs >> 24) & 255;
- cipherText[offset + 1] = (this.lhs >> 16) & 255;
- cipherText[offset + 2] = (this.lhs >> 8) & 255;
- cipherText[offset + 3] = this.lhs & 255;
- cipherText[offset + 4] = (this.rhs >> 24) & 255;
- cipherText[offset + 5] = (this.rhs >> 16) & 255;
- cipherText[offset + 6] = (this.rhs >> 8) & 255;
- cipherText[offset + 7] = this.rhs & 255;
- };
- /**
- * DES cipher
- */
- var DES = (C.DES = {
- _blocksize: 2,
- _keyschedule: null,
- _state: new State(),
- _init: function (k) {
- this._keyschedule = new KeySchedule(k);
- },
- encrypt: function (message, password, options) {
- options = options || {};
- // Determine mode
- var mode = options.mode || new C.mode.OFB();
- // Allow mode to override options
- if (mode.fixOptions) {
- mode.fixOptions(options);
- }
- var // Convert to bytes if message is a string
- m = message.constructor == String ? UTF8.stringToBytes(message) : message;
- var // Generate random IV
- iv = options.iv || util.randomBytes(8);
- var // Generate key
- k =
- password.constructor == String
- ? // Derive key from passphrase
- C.PBKDF2(password, iv, 8, {
- asBytes: true
- })
- : // else, assume byte array representing cryptographic key
- password; // Create key schedule
- this._keyschedule = new KeySchedule(k);
- // Encrypt
- mode.encrypt(DES, m, iv);
- // Return ciphertext
- m = options.iv ? m : iv.concat(m);
- return options && options.asBytes ? m : util.bytesToBase64(m);
- },
- _encryptblock: function (message, offset) {
- this._state.initialPerm(message, offset);
- for (var i = 0; i <= 15; i++) {
- this._state.round(this._keyschedule.getKey(i));
- }
- this._state.finalPerm(message, offset);
- },
- decrypt: function (ciphertext, password, options) {
- options = options || {};
- // Determine mode
- var mode = options.mode || new C.mode.OFB();
- // Allow mode to override options
- if (mode.fixOptions) {
- mode.fixOptions(options);
- }
- var // Convert to bytes if ciphertext is a string
- c = ciphertext.constructor == String ? util.base64ToBytes(ciphertext) : ciphertext;
- var // Separate IV and message
- iv = options.iv || c.splice(0, 8);
- var // Generate key
- k =
- password.constructor == String
- ? // Derive key from passphrase
- C.PBKDF2(password, iv, 32, {
- asBytes: true
- })
- : // else, assume byte array representing cryptographic key
- password; // Create key schedule
- this._keyschedule = new KeySchedule(k);
- mode.decrypt(DES, c, iv);
- // Return plaintext
- return options && options.asBytes ? c : UTF8.bytesToString(c);
- },
- _decryptblock: function (message, offset) {
- this._state.initialPerm(message, offset);
- for (var i = 15; i >= 0; i--) {
- this._state.round(this._keyschedule.getKey(i));
- }
- this._state.finalPerm(message, offset);
- }
- });
- })();
|