⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _crypto.js

📁 这是一个ajax的例子大家好好的看看就是一个鱼眼的效果
💻 JS
📖 第 1 页 / 共 2 页
字号:
			// a[n] ^ b[n] is a•{03} in GF(2^8)			s[0][c] = b[0] ^ a[1] ^ b[1] ^ a[2] ^ a[3]; // 2*a0 + 3*a1 + a2 + a3			s[1][c] = a[0] ^ b[1] ^ a[2] ^ b[2] ^ a[3]; // a0 * 2*a1 + 3*a2 + a3			s[2][c] = a[0] ^ a[1] ^ b[2] ^ a[3] ^ b[3]; // a0 + a1 + 2*a2 + 3*a3			s[3][c] = a[0] ^ b[0] ^ a[1] ^ a[2] ^ b[3]; // 3*a0 + a1 + a2 + 2*a3		  }		  return s;		}		function AddRoundKey(state, w, rnd, Nb) {  // xor Round Key into state S [§5.1.4]		  for (var r=0; r<4; r++) {			for (var c=0; c<Nb; c++) state[r][c] ^= w[rnd*4+c][r];		  }		  return state;		}		function KeyExpansion(key) {  // generate Key Schedule (byte-array Nr+1 x Nb) from Key [§5.2]		  var Nb = 4;			 // block size (in words): no of columns in state (fixed at 4 for AES)		  var Nk = key.length/4	 // key length (in words): 4/6/8 for 128/192/256-bit keys		  var Nr = Nk + 6;		 // no of rounds: 10/12/14 for 128/192/256-bit keys		  var w = new Array(Nb*(Nr+1));		  var temp = new Array(4);		  for (var i=0; i<Nk; i++) {			var r = [key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]];			w[i] = r;		  }		  for (var i=Nk; i<(Nb*(Nr+1)); i++) {			w[i] = new Array(4);			for (var t=0; t<4; t++) temp[t] = w[i-1][t];			if (i % Nk == 0) {			  temp = SubWord(RotWord(temp));			  for (var t=0; t<4; t++) temp[t] ^= Rcon[i/Nk][t];			} else if (Nk > 6 && i%Nk == 4) {			  temp = SubWord(temp);			}			for (var t=0; t<4; t++) w[i][t] = w[i-Nk][t] ^ temp[t];		  }		  return w;		}		function SubWord(w) {	 // apply SBox to 4-byte word w		  for (var i=0; i<4; i++) w[i] = Sbox[w[i]];		  return w;		}		function RotWord(w) {	 // rotate 4-byte word w left by one byte		  w[4] = w[0];		  for (var i=0; i<4; i++) w[i] = w[i+1];		  return w;		}		/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */		/* 		 * Use AES to encrypt 'plaintext' with 'password' using 'nBits' key, in 'Counter' mode of operation		 *							 - see http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf		 *	 for each block		 *	 - outputblock = cipher(counter, key)		 *	 - cipherblock = plaintext xor outputblock		 */		function AESEncryptCtr(plaintext, password, nBits) {		  if (!(nBits==128 || nBits==192 || nBits==256)) return '';	 // standard allows 128/192/256 bit keys			  // for this example script, generate the key by applying Cipher to 1st 16/24/32 chars of password; 		  // for real-world applications, a more secure approach would be to hash the password e.g. with SHA-1		  var nBytes = nBits/8;	 // no bytes in key		  var pwBytes = new Array(nBytes);		  for (var i=0; i<nBytes; i++) pwBytes[i] = password.charCodeAt(i) & 0xff;		  var key = Cipher(pwBytes, KeyExpansion(pwBytes));		  key = key.concat(key.slice(0, nBytes-16));  // key is now 16/24/32 bytes long		  // initialise counter block (NIST SP800-38A §B.2): millisecond time-stamp for nonce in 1st 8 bytes,		  // block counter in 2nd 8 bytes		  var blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES		  var counterBlock = new Array(blockSize);	// block size fixed at 16 bytes / 128 bits (Nb=4) for AES		  var nonce = (new Date()).getTime();  // milliseconds since 1-Jan-1970		  // encode nonce in two stages to cater for JavaScript 32-bit limit on bitwise ops		  for (var i=0; i<4; i++) counterBlock[i] = (nonce >>> i*8) & 0xff;		  for (var i=0; i<4; i++) counterBlock[i+4] = (nonce/0x100000000 >>> i*8) & 0xff; 		  // generate key schedule - an expansion of the key into distinct Key Rounds for each round		  var keySchedule = KeyExpansion(key);		  var blockCount = Math.ceil(plaintext.length/blockSize);		  var ciphertext = new Array(blockCount);  // ciphertext as array of strings  		  for (var b=0; b<blockCount; b++) {			// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)			// again done in two stages for 32-bit ops			for (var c=0; c<4; c++) counterBlock[15-c] = (b >>> c*8) & 0xff;			for (var c=0; c<4; c++) counterBlock[15-c-4] = (b/0x100000000 >>> c*8)			var cipherCntr = Cipher(counterBlock, keySchedule);	 // -- encrypt counter block --				// calculate length of final block:			var blockLength = b<blockCount-1 ? blockSize : (plaintext.length-1)%blockSize+1;			var ct = '';			for (var i=0; i<blockLength; i++) {	 // -- xor plaintext with ciphered counter byte-by-byte --			  var plaintextByte = plaintext.charCodeAt(b*blockSize+i);			  var cipherByte = plaintextByte ^ cipherCntr[i];			  ct += String.fromCharCode(cipherByte);			}			// ct is now ciphertext for this block			ciphertext[b] = escCtrlChars(ct);  // escape troublesome characters in ciphertext		  }		  // convert the nonce to a string to go on the front of the ciphertext		  var ctrTxt = '';		  for (var i=0; i<8; i++) ctrTxt += String.fromCharCode(counterBlock[i]);		  ctrTxt = escCtrlChars(ctrTxt);		  // use '-' to separate blocks, use Array.join to concatenate arrays of strings for efficiency		  return ctrTxt + '-' + ciphertext.join('-');		}		/* 		 * Use AES to decrypt 'ciphertext' with 'password' using 'nBits' key, in Counter mode of operation		 *		 *	 for each block		 *	 - outputblock = cipher(counter, key)		 *	 - cipherblock = plaintext xor outputblock		 */		function AESDecryptCtr(ciphertext, password, nBits) {		  if (!(nBits==128 || nBits==192 || nBits==256)) return '';	 // standard allows 128/192/256 bit keys		  var nBytes = nBits/8;	 // no bytes in key		  var pwBytes = new Array(nBytes);		  for (var i=0; i<nBytes; i++) pwBytes[i] = password.charCodeAt(i) & 0xff;		  var pwKeySchedule = KeyExpansion(pwBytes);		  var key = Cipher(pwBytes, pwKeySchedule);		  key = key.concat(key.slice(0, nBytes-16));  // key is now 16/24/32 bytes long		  var keySchedule = KeyExpansion(key);		  ciphertext = ciphertext.split('-');  // split ciphertext into array of block-length strings 		  // recover nonce from 1st element of ciphertext		  var blockSize = 16;  // block size fixed at 16 bytes / 128 bits (Nb=4) for AES		  var counterBlock = new Array(blockSize);		  var ctrTxt = unescCtrlChars(ciphertext[0]);		  for (var i=0; i<8; i++) counterBlock[i] = ctrTxt.charCodeAt(i);		  var plaintext = new Array(ciphertext.length-1);		  for (var b=1; b<ciphertext.length; b++) {			// set counter (block #) in last 8 bytes of counter block (leaving nonce in 1st 8 bytes)			for (var c=0; c<4; c++) counterBlock[15-c] = ((b-1) >>> c*8) & 0xff;			for (var c=0; c<4; c++) counterBlock[15-c-4] = ((b/0x100000000-1) >>> c*8) & 0xff;			var cipherCntr = Cipher(counterBlock, keySchedule);	 // encrypt counter block			ciphertext[b] = unescCtrlChars(ciphertext[b]);			var pt = '';			for (var i=0; i<ciphertext[b].length; i++) {			  // -- xor plaintext with ciphered counter byte-by-byte --			  var ciphertextByte = ciphertext[b].charCodeAt(i);			  var plaintextByte = ciphertextByte ^ cipherCntr[i];			  pt += String.fromCharCode(plaintextByte);			}			// pt is now plaintext for this block			plaintext[b-1] = pt;  // b-1 'cos no initial nonce block in plaintext		  }		  return plaintext.join('');		}		/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */		function escCtrlChars(str) {  // escape control chars which might cause problems handling ciphertext		  return str.replace(/[\0\t\n\v\f\r\xa0!-]/g, function(c) { return '!' + c.charCodeAt(0) + '!'; });		}  // \xa0 to cater for bug in Firefox; include '-' to leave it free for use as a block marker		function unescCtrlChars(str) {	// unescape potentially problematic control characters		  return str.replace(/!\d\d?\d?!/g, function(c) { return String.fromCharCode(c.slice(1,-1)); });		}		/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */				function encrypt(plaintext, password){			return AESEncryptCtr(plaintext, password, 256);		}		function decrypt(ciphertext, password){				return AESDecryptCtr(ciphertext, password, 256);		}				/* End AES Implementation */				var cmd = msg.substr(0,4);		var arg = msg.substr(5);		if(cmd == "encr"){			arg = eval("(" + arg + ")");			var plaintext = arg.plaintext;			var password = arg.password;			var results = encrypt(plaintext, password);			gearsWorkerPool.sendMessage(String(results), sender);		}else if(cmd == "decr"){			arg = eval("(" + arg + ")");			var ciphertext = arg.ciphertext;			var password = arg.password;			var results = decrypt(ciphertext, password);			gearsWorkerPool.sendMessage(String(results), sender);		}	}});}

⌨️ 快捷键说明

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