1/** 2 * @class Blowfish 3 * @description 4 * ШиÑÑаÑоÑ/деÑиÑÑаÑоÑ. ÐлгоÑиÑм Blowfish 5 * 6 * в Ñежиме ecb: иÑÑ Ð¾Ð´Ð½Ð°Ñ ÑÑÑока ÑазбиваеÑÑÑ Ð½Ð° 8-байÑнÑе блоки, каждÑй блок 7 * ÑиÑÑÑеÑÑÑ. ÐÑли ÑÐ°Ð·Ð¼ÐµÑ Ð±Ð»Ð¾ÐºÐ° менее 8 байÑ, Ñо дополнÑем его до 8 Ð±Ð°Ð¹Ñ Ð½ÑлÑми. 8 * в Ñежиме cbc: пеÑвÑй блок оÑкÑÑÑого ÑекÑÑа, из 8 байÑ, пеÑед ÑиÑÑованием побиÑово 9 * ÑкладÑваеÑÑÑ Ð¿Ð¾ модÑÐ»Ñ 2 (опеÑаÑÐ¸Ñ XOR) Ñ Ð²ÐµÐºÑоÑом иниÑиализаÑии; 10 * поÑледÑÑÑие блоки оÑкÑÑÑого ÑекÑÑа побиÑового ÑкладÑваÑÑÑÑ (XOR) Ñ Ð¿ÑедÑдÑÑим ÑезÑлÑÑаÑом 11 * ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñле ÑÑого заÑиÑÑовÑваÑÑÑÑ. 12 * 13 * ÐодÑобнее о ÑÐµÐ¶Ð¸Ð¼Ð°Ñ ÑиÑÑованиÑ: 14 * http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B6%D0%B8%D0%BC_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F 15 * 16 * @example 17 * // ÐÑÐ¸Ð¼ÐµÑ 1: Ñежим ECB, по ÑмолÑÐ°Ð½Ð¸Ñ 18 * var bf = new Blowfish("secret key"); 19 * var encrypted = bf.encrypt("конÑиденÑиалÑное ÑообÑение"); 20 * var decrypted = bf.decrypt(encrypted); 21 * 22 * // ÐÑÐ¸Ð¼ÐµÑ 2: Ñежим CBC (лÑÑÑе Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ð¸Ð½Ð½ÑÑ ÑообÑений, более 1kb): 23 * var bf = new Blowfish("key", "cbc"); 24 * var encrypted = bf.encrypt("secret message", "cbcvecto"); 25 * var decrypted = bf.decrypt(encrypted, "cbcvecto"); 26 * 27 * //Ð Ñежиме CBC векÑÐ¾Ñ Ð¸Ð½Ð¸ÑаилазиаÑии iv ÑÑо дополниÑелÑнÑй паÑолÑ. 28 * 29 * // ÐÑÐ¸Ð¼ÐµÑ 3: 30 * // ÐоÑле ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑÑаеÑÑÑ Ð±Ð¸Ð½Ð°ÑÐ½Ð°Ñ ÑÑÑока. ЧÑÐ¾Ð±Ñ Ð¿ÐµÑедаÑÑ 31 * // заÑиÑÑованное ÑообÑение в Ñл.пиÑÑме нÑжно закодиÑоваÑÑ Ð±Ð¸Ð½Ð°ÑнÑÑ 32 * // ÑÑÑÐ¾ÐºÑ Ð² base64 33 * var bf = new Blowfish("key"); 34 * 35 * // ÐÐ»Ñ ÑдобÑÑва вклÑÑил, в ÑÑÐ¾Ñ ÐºÐ»Ð°ÑÑ Ð¼ÐµÑÐ¾Ð´Ñ base64Encode и base64Decode 36 * 37 * // ШиÑÑование 38 * var encrypted = bf.base64Encode(bf.encrypt("secret message")); 39 * 40 * // РаÑÑиÑÑование 41 * var encrypted = bf.base64Decode(encrypted); 42 * var decrypted = bf.decrypt(encrypted); 43 * 44 * @param {string} key паÑÐ¾Ð»Ñ (Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð»Ð¸Ð½Ð½Ð¾Ð¹ до 56 байÑ) 45 * @param {string} [mode] Ñежим ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ 46 * @author Alexandr Gorlov <[email protected]> 47 */ 48var Blowfish = function(key, mode) { 49 50 // иниÑиализаÑÐ¸Ñ Ð¿Ð°ÑÐ¾Ð»Ñ 51 this.key = key; 52 53 // иниÑиализаÑÐ¸Ñ Ñежима ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ 54 if (mode === "ecb" || mode === "cbc") { 55 this.mode = mode; 56 } 57 58 // иниÑиализаÑÐ¸Ñ Ð¼Ð°ÑÑивов Ñ ÐºÐ¾Ð´Ð°Ð¼Ð¸ Ñимволов (пÑавда ведÑ?) 59 this.sBox0 = Blowfish.sBox0.slice(); 60 this.sBox1 = Blowfish.sBox1.slice(); 61 this.sBox2 = Blowfish.sBox2.slice(); 62 this.sBox3 = Blowfish.sBox3.slice(); 63 this.pArray = Blowfish.pArray.slice(); 64 65 // иниÑиализаÑÐ¸Ñ ÑиÑÑа 66 this.generateSubkeys(key); 67}; 68 69Blowfish.prototype = { 70 71 /** 72 * @type {Array} 73 */ 74 sBox0: null, 75 76 /** 77 * @type {Array} 78 */ 79 sBox1: null, 80 81 /** 82 * @type {Array} 83 */ 84 sBox2: null, 85 86 /** 87 * @type {Array} 88 */ 89 sBox3: null, 90 91 /** 92 * @type {Array} 93 */ 94 pArray: null, 95 96 /** 97 * ÐаÑÐ¾Ð»Ñ 98 * @type {string} 99 */ 100 key: null, 101 102 /** 103 * Режим ÑиÑÑованиÑ: ecb|cbc; по ÑмолÑаниÑ: ecb 104 * @type {string} 105 */ 106 mode: "ecb", 107 108 /** 109 * ÐекÑÐ¾Ñ Ð¸Ð½Ð¸ÑиализаÑии Ð´Ð»Ñ Ñежима cbc 110 * @type {string} 111 */ 112 iv: "abc12345", 113 114 /** 115 * ÐÐ°Ð±Ð¾Ñ Ñимволов Ð´Ð»Ñ base64 116 * @type {string} 117 */ 118 keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", 119 120 /** 121 * ШиÑÑÑÐµÑ ÑÑÑÐ¾ÐºÑ 122 * @param {string} string ÑиÑÑÑÐµÐ¼Ð°Ñ ÑÑÑока 123 * @param {string} iv пÑоизволÑÐ½Ð°Ñ 8байÑÐ½Ð°Ñ ÑÑÑока - векÑÐ¾Ñ Ð¸Ð½Ð¸ÑиализаÑии; 124 * иÑполÑзÑеÑÑÑ ÑолÑко в Ñежиме CBC 125 * @throws {Error} ÐºÐ¸Ð´Ð°ÐµÑ Ð¸ÑклÑÑение пÑи неизвеÑÑном Ñежиме ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ 126 * @return {string} заÑиÑÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока 127 */ 128 encrypt: function(string, iv) { 129 if (this.mode === "ecb") { 130 return this.encryptECB(string); 131 } 132 133 if (this.mode === "cbc") { 134 return this.encryptCBC(string, iv); 135 } 136 137 throw new Error("ÐеизвеÑÑнÑй Ñежим ÑиÑÑованиÑ."); 138 }, 139 140 /** 141 * РаÑÑиÑÑовÑÐ²Ð°ÐµÑ ÑÑÑÐ¾ÐºÑ 142 * @param {string} string заÑиÑÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока 143 * @param {string} iv пÑоизволÑÐ½Ð°Ñ 8байÑÐ½Ð°Ñ ÑÑÑока - векÑÐ¾Ñ Ð¸Ð½Ð¸ÑиализаÑии 144 * (должен бÑÑÑ ÑоÑже, ÑÑо и пÑи ÑиÑÑовании) иÑполÑзÑеÑÑÑ 145 * ÑолÑко в Ñежиме CBC 146 * @throws {Error} ÐºÐ¸Ð´Ð°ÐµÑ Ð¸ÑклÑÑение пÑи неизвеÑÑном Ñежиме ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ 147 * @return {string} ÑаÑÑиÑÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока 148 */ 149 decrypt: function(string, iv) { 150 if (this.mode === "ecb") { 151 return this.decryptECB(string); 152 } 153 154 if (this.mode === "cbc") { 155 return this.decryptCBC(string, iv); 156 } 157 158 throw new Error("ÐеизвеÑÑнÑй Ñежим ÑиÑÑованиÑ."); 159 }, 160 161 /** 162 * ШиÑÑÑÐµÑ Ð² Ñежиме ECB 163 * (пÑиваÑнÑй меÑод) 164 * @param {string} string ÑиÑÑÑÐµÐ¼Ð°Ñ ÑÑÑока 165 * @return {string} заÑиÑÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока 166 */ 167 encryptECB: function(string) { 168 string = this.utf8Decode(string); 169 var blocks = Math.ceil(string.length/8); 170 171 //1. ÑазбиÑÑ ÑÑÑÐ¾ÐºÑ Ð½Ð° 8-байÑнÑе блок-и 172 //2. ÑазбиÑÑ 8байÑнÑе блоки на 32-биÑнÑе паÑÑ xL, xR 173 //3. заÑиÑÑоваÑÑ Ð²Ñе блоки 174 //4. пÑеобÑазоваÑÑ ÑезÑлÑÑÐ°Ñ Ð² ÑÑÑÐ¾ÐºÑ 175 176 var encryptedString = ""; 177 for (var i = 0; i < blocks; i++) { 178 var block = string.substr(i * 8, 8); 179 if (block.length < 8) { 180 var count = 8 - block.length; 181 while (0 < count--) { 182 block += "\0"; 183 } 184 } 185 186 var xL, xR; 187 //[xL, xR] = this.split64by32(block); не ÑабоÑÐ°ÐµÑ Ð² IE, Chrome 188 var xLxR = this.split64by32(block); 189 xL = xLxR[0]; 190 xR = xLxR[1]; 191 192 //[xL, xR] = this.encipher(xL, xR); не ÑабоÑÐ°ÐµÑ Ð² IE, Chrome 193 xLxR = this.encipher(xL, xR); 194 xL = xLxR[0]; 195 xR = xLxR[1]; 196 encryptedString += this.num2block32(xL) + this.num2block32(xR); 197 } 198 199 return encryptedString; 200 }, 201 202 /** 203 * ШиÑÑÑÐµÑ Ð² Ñежиме CBC 204 * (пÑиваÑнÑй меÑод) 205 * @param {string} string ÑиÑÑÑÐµÐ¼Ð°Ñ ÑÑÑока 206 * @param {string} iv 8-байÑÐ½Ð°Ñ ÑÑÑока - векÑÐ¾Ñ Ð¸Ð½Ð¸ÑиализаÑии 207 * @return {string} заÑиÑÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока 208 */ 209 encryptCBC: function(string, iv) { 210 string = this.utf8Decode(string); 211 var blocks = Math.ceil(string.length/8); 212 213 //1. ÑазбиÑÑ ÑÑÑÐ¾ÐºÑ Ð½Ð° 8-байÑнÑе блок-и 214 //2. ÑазбиÑÑ 8байÑнÑе блоки на 32-биÑнÑе паÑÑ xL, xR 215 //3. заÑиÑÑоваÑÑ Ð²Ñе блоки 216 //4. пÑеобÑазоваÑÑ ÑезÑлÑÑÐ°Ñ Ð² ÑÑÑÐ¾ÐºÑ 217 218 var ivL, ivR, ivLivR; 219 //[ivL, ivR] = this.split64by32(iv);
220 ivLivR = this.split64by32(iv); 221 ivL = ivLivR[0]; 222 ivR = ivLivR[1]; 223 224 var encryptedString = ""; 225 for (var i = 0; i < blocks; i++) { 226 var block = string.substr(i * 8, 8); 227 if (block.length < 8) { 228 var count = 8 - block.length; 229 while (0 < count--) { 230 block += "\0"; 231 } 232 } 233 234 var xL, xR, xLxR; 235 xLxR = this.split64by32(block); 236 xL = xLxR[0]; 237 xR = xLxR[1]; 238 239 xL = this.xor(xL, ivL); 240 xR = this.xor(xR, ivR); 241 242 xLxR = this.encipher(xL, xR); 243 xL = xLxR[0]; 244 xR = xLxR[1]; 245// ivL = xL; - не иÑполÑзÑеÑÑÑ 246// ivR = xR; - не иÑполÑзÑеÑÑÑ 247 //[ivL, ivR] = [xL, xR]; 248 encryptedString += this.num2block32(xL) + this.num2block32(xR); 249 } 250 251 return encryptedString; 252 }, 253 254 /** 255 * РаÑÑиÑÑоваÑÑ Ð² Ñежиме ECB 256 * (пÑиваÑнÑй меÑод) 257 * @param {string} string ÑиÑÑÑÐµÐ¼Ð°Ñ ÑÑÑока 258 * @throws {Error} ÐºÐ¸Ð´Ð°ÐµÑ Ð¸ÑклÑÑение еÑли заÑиÑÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока повÑеждена 259 * @return {string} заÑиÑÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока 260 */ 261 decryptECB: function(string) { 262 var blocks = Math.ceil(string.length/8); 263 264 var decryptedString = ""; 265 for (var i = 0; i < blocks; i++) { 266 var block = string.substr(i * 8, 8); 267 if (block.length < 8) { 268 throw new Error("ÐаÑиÑÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока повÑеждена: длинна заÑиÑÑованной ÑÑÑоки должна бÑÑÑ ÐºÑаÑна 8 баÑйÑам."); 269 } 270 var xL, xR, xLxR; 271 272 xLxR = this.split64by32(block); 273 xL = xLxR[0]; 274 xR = xLxR[1]; 275 276 xLxR = this.decipher(xL, xR); 277 xL = xLxR[0]; 278 xR = xLxR[1]; 279 280 decryptedString += this.num2block32(xL) + this.num2block32(xR); 281 } 282 283 decryptedString = this.utf8Encode(decryptedString); 284 return decryptedString; 285 }, 286 287 /** 288 * ШиÑÑÑÐµÑ Ð² Ñежиме CBC 289 * (пÑиваÑнÑй меÑод) 290 * @param {string} string заÑиÑÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока 291 * @param {string} iv 8-байÑÐ½Ð°Ñ ÑÑÑока - векÑÐ¾Ñ Ð¸Ð½Ð¸ÑиализаÑии 292 * @throws {Error} ÐºÐ¸Ð´Ð°ÐµÑ Ð¸ÑклÑÑение еÑли заÑиÑÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока повÑеждена 293 * @return {string} ÑаÑÑиÑÑÐ¾Ð²Ð°Ð½Ð°Ñ ÑÑÑока 294 */ 295 decryptCBC: function(string, iv) { 296 297 var blocks = Math.ceil(string.length/8); 298 299 var ivL, ivR, ivLtmp, ivRtmp, ivLivR; 300 301 ivLivR = this.split64by32(iv); 302 ivL = ivLivR[0]; 303 ivR = ivLivR[1]; 304 305 var decryptedString = ""; 306 for (var i = 0; i < blocks; i++) { 307 var block = string.substr(i * 8, 8); 308 if (block.length < 8) { 309 throw new Error("ÐаÑиÑÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑÑÑока повÑеждена: длинна заÑиÑÑованной ÑÑÑоки должна бÑÑÑ ÐºÑаÑна 8 байÑам."); 310 } 311 var xL, xR, xLxR; 312 xLxR = this.split64by32(block); 313 xL = xLxR[0]; 314 xR = xLxR[1]; 315 316 ivLtmp = xL; 317 ivRtmp = xR; 318 319 xLxR = this.decipher(xL, xR); 320 xL = xLxR[0]; 321 xR = xLxR[1]; 322 323 xL = this.xor(xL, ivL); 324 xR = this.xor(xR, ivR); 325 326 ivL = ivLtmp; 327 ivR = ivRtmp; 328 decryptedString += this.num2block32(xL) + this.num2block32(xR); 329 } 330 331 decryptedString = this.utf8Encode(decryptedString); 332 return decryptedString; 333 }, 334 335 /** 336 * ФÑнкÑÐ¸Ñ F 337 * Function F looks like this: 338 * Divide xL into four eight-bit quarters: a, b, c, and d. 339 * Then, F(xL) = ((S1,a + S2,b mod 232) XOR S3,c) + S4,d mod 232. 340 * F(0xFFFFFF) 341 * ((S1[255] + S2[255]) XOR S3[255]) + S4[255] 342 * ((0x6e85076a + 0xdb83adf7) ^ 0x406000e0) + 0x3ac372e6 343 * @param {int32} xL 32биÑное знаÑение 344 */ 345 F: function(xL) { 346 var a = xL >>> 24; 347 var b = xL << 8 >>> 24; 348 var c = xL << 16 >>> 24; 349 var d = xL << 24 >>> 24; 350 351 var res = this.addMod32(this.sBox0[a], this.sBox1[b]); 352 res = this.xor(res, this.sBox2[c]); 353 res = this.addMod32(res, this.sBox3[d]); 354 return res; 355 }, 356 357 /** 358 * ШиÑÑÑÐµÑ ÑÑÑÐ¾ÐºÑ Ð¸Ð· 8 Ð±Ð°Ð¹Ñ (один блок) 359 * Encryption and Decryption: 360 * Blowfish has 16 rounds. The input is a 64-bit data element, x. 361 * Divide x into two 32-bit halves: xL, xR. Then, for i = 1 to 16: 362 * xL = xL XOR Pi 363 * xR = F(xL) XOR xR 364 * Swap xL and xR 365 * After the sixteenth round, swap xL and xR again to undo the last swap. 366 * Then, xR = xR XOR P17 and xL = xL XOR P18. Finally, recombine xL and xR 367 * to get the ciphertext. 368 * Function F looks like this: 369 * Divide xL into four eight-bit quarters: a, b, c, and d. 370 * Then, F(xL) = ((S1,a + S2,b mod 232) XOR S3,c) + S4,d mod 232. 371 * Decryption is exactly the same as encryption, except that P1, P2,..., P18 372 * are used in the reverse order. 373 * @param {int32} xL пеÑвÑе 4 Ñимвола в виде ÑиÑла 32биÑного беззнакового 374 * @param {int32} xR оÑÑавÑиеÑÑ 4 Ñимвола в виде ÑиÑла 32биÑного беззнакового 375 * @return {Array} заÑиÑÑованнÑй 8-байÑнÑй блок в виде паÑÑ 32биÑнÑÑ ÑиÑел [xL, xR] 376 */ 377 encipher: function(xL, xR) { 378 var tmp; 379 for (var i = 0; i < 16; i++) { 380 xL = this.xor(xL, this.pArray[i]); 381 xR = this.xor(this.F(xL), xR); 382 tmp = xL; 383 xL = xR; 384 xR = tmp; 385 } 386 387 tmp = xL; 388 xL = xR; 389 xR = tmp; 390 391 xR = this.xor(xR, this.pArray[16]); 392 xL = this.xor(xL, this.pArray[17]); 393 394 return [xL, xR]; 395 }, 396 397 /** 398 * ?? 399 * @param {int32} xL 400 * @param {int32} xR 401 * @return {Array} 402 */ 403 decipher: function(xL, xR) { 404 var tmp; 405 406 xL = this.xor(xL, this.pArray[17]); 407 xR = this.xor(xR, this.pArray[16]); 408 409 tmp = xL; 410 xL = xR; 411 xR = tmp; 412 413 for (var i = 15; i >= 0; i--) { 414 tmp = xL; 415 xL = xR; 416 xR = tmp; 417 xR = this.xor(this.F(xL), xR); 418 xL = this.xor(xL, this.pArray[i]); 419 } 420 421 return [xL, xR]; 422 }, 423 424 /** 425 * ÐенеÑаÑÐ¸Ñ ÐºÐ»ÑÑей (subkeys) 426 * Generating the Subkeys: 427 * The subkeys are calculated using the Blowfish algorithm: 428 * 1. Initialize first the P-array and then the four S-boxes, in order, 429 * with a fixed string. This string consists of the hexadecimal digits 430 * of pi (less the initial 3): P1 = 0x243f6a88, P2 = 0x85a308d3, 431 * P3 = 0x13198a2e, P4 = 0x03707344, etc. 432 * 2. XOR P1 with the first 32 bits of the key, XOR P2 with the second 32-bits 433 * of the key, and so on for all bits of the key (possibly up to P14). 434 * Repeatedly cycle through the key bits until the entire P-array has 435 * been XORed with key bits. (For every short key, there is at least one 436 * equivalent longer key; for example, if A is a 64-bit key, then AA, 437 * AAA, etc., are equivalent keys.) 438 * 3. Encrypt the all-zero string with the Blowfish algorithm, using the
439 * subkeys described in steps (1) and (2). 440 * 4. Replace P1 and P2 with the output of step (3). 441 * 5. Encrypt the output of step (3) using the Blowfish algorithm with the 442 * modified subkeys. 443 * 6. Replace P3 and P4 with the output of step (5). 444 * 7. Continue the process, replacing all entries of the P array, and then all 445 * four S-boxes in order, with the output of the continuously changing 446 * Blowfish algorithm. 447 * In total, 521 iterations are required to generate all required subkeys. 448 * Applications can store the subkeys rather than execute this derivation 449 * process multiple times. 450 * 451 * Ðолго пÑÑалÑÑ Ð¿Ð¾Ð½ÑÑÑ Ð¿ÑавилÑнÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð³ÐµÐ½ÐµÑаÑии клÑÑей, 452 * в иÑоге поÑмоÑÑел как Ñделано в PHP ÑеализаÑии Crypt_Blowfish (PEAR) 453 * и ÑазобÑалÑÑ. 454 * @param {string} key клÑÑ 455 */ 456 generateSubkeys: function(key) { 457 var data = 0; 458 var k = 0; 459 var i, j; 460 461 for (i = 0; i < 18; i++) { 462 for (j = 4; j > 0; j--) {
463 data = this.fixNegative(data << 8 | key.charCodeAt(k)); 464 k = (k + 1) % key.length; 465 } 466 this.pArray[i] = this.xor(this.pArray[i], data); 467 data = 0; 468 } 469 470 //var block64 = num2block32(0) + num2block32(0); 471 var block64 = [0, 0]; 472 for (i = 0; i < 18; i += 2) { 473 block64 = this.encipher(block64[0], block64[1]); 474 this.pArray[i] = block64[0]; 475 this.pArray[i + 1] = block64[1]; 476 } 477 478 for (i = 0; i < 256; i += 2) { 479 block64 = this.encipher(block64[0], block64[1]); 480 this.sBox0[i] = block64[0]; 481 this.sBox0[i + 1] = block64[1]; 482 } 483 484 for (i = 0; i < 256; i += 2) { 485 block64 = this.encipher(block64[0], block64[1]); 486 this.sBox1[i] = block64[0]; 487 this.sBox1[i + 1] = block64[1]; 488 } 489 490 for (i = 0; i < 256; i += 2) { 491 block64 = this.encipher(block64[0], block64[1]); 492 this.sBox2[i] = block64[0]; 493 this.sBox2[i + 1] = block64[1]; 494 } 495 496 for (i = 0; i < 256; i += 2) { 497 block64 = this.encipher(block64[0], block64[1]); 498 this.sBox3[i] = block64[0]; 499 this.sBox3[i + 1] = block64[1]; 500 } 501 502 }, 503 504 /** 505 * ÐÑеобÑазÑÐµÑ 4Ñ Ð±Ð°Ð¹ÑнÑÑ ÑÑÑокÑ, в 32биÑное Ñелое ÑиÑло 506 * @param {string} block32 507 * @return {int} 508 */ 509 block32toNum: function(block32) { 510 return this.fixNegative( 511 block32.charCodeAt(0) << 24 | 512 block32.charCodeAt(1) << 16 | 513 block32.charCodeAt(2) << 8 | 514 block32.charCodeAt(3) 515 ); 516 }, 517 518 /** 519 * ÐÑеобÑазÑÐµÑ 32биÑное ÑиÑло в ÑÑÑÐ¾ÐºÑ (4 байÑа) 520 * @param {int} num 32 биÑное ÑиÑло 521 * @return {string} 4Ñ -байÑÐ½Ð°Ñ ÑÑÑока 522 */ 523 num2block32: function(num) { 524 return String.fromCharCode(num >>> 24) + 525 String.fromCharCode(num << 8 >>> 24) + 526 String.fromCharCode(num << 16 >>> 24) + 527 String.fromCharCode(num << 24 >>> 24); 528 }, 529 530 /** 531 * ÐпеÑаÑÐ¸Ñ XOR 532 * @param {int} a 533 * @param {int} b 534 * @return {int} 535 */ 536 xor: function(a, b) { 537 return this.fixNegative(a ^ b); 538 }, 539 540 /** 541 * Сложение по модÑÐ»Ñ 2^32 542 * СкладÑваем 2 ÑиÑла и оÑÑбÑаÑÑваем вÑе ÑазÑÑÐ´Ñ Ð±Ð¾Ð»ÑÑе 32 543 * @param {int} a 544 * @param {int} b 545 * @return {int} 546 */ 547 addMod32: function(a, b) { 548 return this.fixNegative((a + b) | 0); // | 0 пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº 32биÑÐ½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ 549 }, 550 551 /** 552 * ÐÑеобÑазование signed int в unsigned int 553 * поÑле побиÑовÑÑ Ð¾Ð¿ÐµÑаÑий javascript возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°ÐºÐ¾Ð²Ð¾Ðµ ÑиÑло 554 * However, for octet-data processing (eg, network stream, etc), usually 555 * want the "unsigned int" representation. This can be accomplished by 556 * adding a ">>> 0" (zero-fill right-shift) operator which internally tells 557 * Javascript to treat this as unsigned. 558 * @param {int} number Ñелое ÑиÑло Ñо знаком 559 * @return {int} Ñелое ÑиÑло без знака 560 */ 561 fixNegative: function(number) { 562 return number >>> 0; 563 }, 564 565 /** 566 * Разделим 64 биÑнÑй блок на два 32-биÑнÑÑ 567 * @param {string} block64 блок, ÑоÑÑоÑÑий из 64 Ð±Ð¸Ñ (8 байÑ) 568 * @return {Array} [xL, xR] 569 */ 570 split64by32: function (block64) { 571 var xL = block64.substring(0, 4); 572 var xR = block64.substring(4, 8); 573 574 return [this.block32toNum(xL) , this.block32toNum(xR)]; 575 }, 576 577 /** 578 * ÐÑеобÑазÑÐµÑ ÑÑÑÐ¾ÐºÑ Ð² поÑледоваÑелÑноÑÑÑ Ð±Ð°Ð¹Ñов utf8 579 * на один Ñимвол Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑÐ¸Ñ Ð¾Ð´Ð¸ÑÑÑ Ð±Ð¾Ð»ÑÑе одного байÑа 580 * ÐзÑл ÑÑÐ¾Ñ Ð¼ÐµÑод из библиоÑеки base64: 581 * http://www.webtoolkit.info/javascript-base64.html 582 */ 583 utf8Decode: function(string) { 584 var utftext = ""; 585 for (var n = 0; n < string.length; n++) { 586 var c = string.charCodeAt(n); 587 if (c < 128) { 588 utftext += String.fromCharCode(c); 589 } else if (c > 127 && c < 2048) { 590 utftext += String.fromCharCode(c >> 6 | 192); 591 utftext += String.fromCharCode(c & 63 | 128); 592 } else { 593 utftext += String.fromCharCode(c >> 12 | 224); 594 utftext += String.fromCharCode(c >> 6 & 63 | 128); 595 utftext += String.fromCharCode(c & 63 | 128); 596 } 597 } 598 return utftext; 599 }, 600 601 /** 602 * ÐÑеобÑазÑÐµÑ Ð±Ð°Ð¹ÑовÑÑ-ÑÑÑÐ¾ÐºÑ utf8 в ÑÑÑÐ¾ÐºÑ javascript 603 */ 604 utf8Encode: function (utftext) { 605 var string = ""; 606 var i = 0; 607 var c = 0; 608 var c1 = 0; 609 var c2 = 0; 610 611 while ( i < utftext.length ) { 612 613 c = utftext.charCodeAt(i); 614 615 if (c < 128) {
616 string += String.fromCharCode(c); 617 i++; 618 } else if((c > 191) && (c < 224)) { 619 c1 = utftext.charCodeAt(i+1); 620 string += String.fromCharCode(((c & 31) << 6) | (c1 & 63)); 621 i += 2; 622 } else { 623 c1 = utftext.charCodeAt(i+1); 624 c2 = utftext.charCodeAt(i+2); 625 string += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63)); 626 i += 3; 627 } 628 629 } 630 631 return string; 632 }, 633 634 /** 635 * ÐодиÑÑÐµÑ ÑÑÑÐ¾ÐºÑ Ð² base64 636 * @param {string} input 637 * @return {string} 638 */ 639 base64Encode : function (input) { 640 var output = ""; 641 var chr1, chr2, chr3, enc1, enc2, enc3, enc4; 642 var i = 0; 643 644 //input = this.utf8Encode(input); 645 646 while (i < input.length) { 647 chr1 = input.charCodeAt(i++); 648 chr2 = input.charCodeAt(i++); 649 chr3 = input.charCodeAt(i++); 650 651 enc1 = chr1 >> 2; 652 enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 653 enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 654 enc4 = chr3 & 63; 655 656 if (isNaN(chr2)) { 657 enc3 = enc4 = 64; 658 } else if (isNaN(chr3)) { 659 enc4 = 64; 660 } 661 662 output = output + 663 this.keyStr.charAt(enc1) + this.keyStr.charAt(enc2) + 664 this.keyStr.charAt(enc3) + this.keyStr.charAt(enc4); 665 } 666 667 return output; 668 }, 669 670 /** 671 * РаÑкодиÑÑÐµÑ ÑÑÑÐ¾ÐºÑ Ð¸Ð· base64 672 * @param {string} input 673 * @return {string} 674 */ 675 base64Decode : function (input) { 676 var output = ""; 677 var chr1, chr2, chr3; 678 var enc1, enc2, enc3, enc4; 679 var i = 0; 680 681 input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 682 683 while (i < input.length) { 684 685 enc1 = this.keyStr.indexOf(input.charAt(i++)); 686 enc2 = this.keyStr.indexOf(input.charAt(i++)); 687 enc3 = this.keyStr.indexOf(input.charAt(i++)); 688 enc4 = this.keyStr.indexOf(input.charAt(i++)); 689 690 chr1 = (enc1 << 2) | (enc2 >> 4); 691 chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 692 chr3 = ((enc3 & 3) << 6) | enc4; 693 694 output = output + String.fromCharCode(chr1); 695 696 if (enc3 != 64) { 697 output = output + String.fromCharCode(chr2); 698 } 699 if (enc4 != 64) { 700 output = output + String.fromCharCode(chr3); 701 } 702 703 } 704 705 //output = this.utf8Decode(output); 706 707 return output; 708 }, 709 710 /** 711 * УдалÑÐµÑ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ \0 в конÑе ÑÑÑоки 712 * @param {string} input 713 * @return {string} 714 */ 715 trimZeros: function(input) { 716 return input.replace(/\0+$/g, ""); 717 } 718} 719 720/** 721 * @static 722 * @type {Array} 723 */ 724Blowfish.pArray = [ 725 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 726 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 727 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b 728]; 729 730/** 731 * @static 732 * @type {Array} 733 */ 734Blowfish.sBox0 = [ 735 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 736 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 737 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658, 738 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 739 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 740 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 741 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, 742 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 743 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 744 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 745 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, 746 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, 747 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 748 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 749 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, 750 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 751 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 752 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 753 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 754 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 755 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 756 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 757 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a,
758 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 759 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 760 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 761 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, 762 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 763 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 764 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 765 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, 766 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 767 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 768 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 769 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, 770 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 771 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 772 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 773 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9, 774 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 775 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 776 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 777 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a 778]; 779 780/** 781 * @static 782 * @type {Array} 783 */ 784Blowfish.sBox1 = [ 785 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 786 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 787 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 788 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 789 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 790 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 791 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 792 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 793 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 794 0xc8b57634, 0x9af3dda7, 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 795 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 796 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 797 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 798 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 799 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 800 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 801 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 802 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 803 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 804 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 805 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 806 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 807 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 808 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 809 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 810 0x0334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 811 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 812 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 813 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 814 0x11ed935f, 0x16681281, 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 815 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 816 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 817 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 818 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 819 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 820 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 821 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 822 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 823 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 824 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 825 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 826 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 827 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 828]; 829 830/** 831 * @static 832 * @type {Array} 833 */ 834Blowfish.sBox2 = [ 835 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 836 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
837 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, 838 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, 839 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 840 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 841 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 842 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 843 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 844 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 845 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, 846 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 847 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 848 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 849 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, 850 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, 851 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 852 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 853 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0x0a476341, 0x992eff74, 854 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 855 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 856 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 857 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, 858 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 859 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 860 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 861 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 862 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 863 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 864 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 865 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 866 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 867 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 868 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 869 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, 870 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, 871 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 872 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 873 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, 874 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 875 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 876 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 877 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 878]; 879 880/** 881 * @static 882 * @type {Array} 883 */ 884Blowfish.sBox3 = [
vendor: 3,157 bytes, lines 884-927
884 885 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 886 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 887 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, 888 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 889 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 890 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 891 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, 892 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 893 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 894 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 895 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 896 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 897 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 898 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 899 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, 900 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 901 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 902 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 903 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd, 904 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 905 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 906 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 907 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, 908 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, 909 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 910 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 911 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, 912 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 913 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 914 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 915 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 916 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 917 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 918 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 919 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, 920 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 921 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 922 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 923 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, 924 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 925 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 926 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 927 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
927 928];
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.