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

📄 aeskey.as

📁 As3 Crypto is a cryptography library written in Actionscript 3 that provides several common algorith
💻 AS
📖 第 1 页 / 共 2 页
字号:
			keyLength = key.length;
			this.key = new ByteArray;
			this.key.writeBytes(key);
			expandKey();
		}
		
		// produce Nb bytes for each round
		private function expandKey():void {
			var tmp0:uint, tmp1:uint, tmp2:uint, tmp3:uint, tmp4:uint;
			var idx:uint;
			var Nk:uint = key.length/4;
			Nr = Nk+6;
			
			for( idx = Nk; idx < Nb * (Nr + 1); idx++ ) {
				tmp0 = key[4*idx - 4];
				tmp1 = key[4*idx - 3];
				tmp2 = key[4*idx - 2];
				tmp3 = key[4*idx - 1];
				if( !(idx % Nk) ) {
					tmp4 = tmp3;
					tmp3 = Sbox[tmp0];
					tmp0 = Sbox[tmp1] ^ Rcon[idx/Nk];
					tmp1 = Sbox[tmp2];
					tmp2 = Sbox[tmp4];
				} else if( Nk > 6 && idx % Nk == 4 ) {
					tmp0 = Sbox[tmp0];
					tmp1 = Sbox[tmp1];
					tmp2 = Sbox[tmp2];
					tmp3 = Sbox[tmp3];
				}
		
				key[4*idx+0] = key[4*idx - 4*Nk + 0] ^ tmp0;
				key[4*idx+1] = key[4*idx - 4*Nk + 1] ^ tmp1;
				key[4*idx+2] = key[4*idx - 4*Nk + 2] ^ tmp2;
				key[4*idx+3] = key[4*idx - 4*Nk + 3] ^ tmp3;
			}
		}


		public function getBlockSize():uint
		{
			return 16;
		}
		
		// encrypt one 128 bit block
		public function encrypt(block:ByteArray, index:uint=0):void
		{
			var round:uint;
			state.position=0;
			state.writeBytes(block, index, Nb*4);

			addRoundKey(key, 0);
			for ( round = 1; round < Nr + 1; round++ ) {
				if (round < Nr) {
					mixSubColumns();
				} else {
					shiftRows();
				}
				addRoundKey(key, round * Nb * 4);
			}

			block.position=index;
			block.writeBytes(state);
		}
		
		public function decrypt(block:ByteArray, index:uint=0):void
		{
			var round:uint;
			state.position=0;
			state.writeBytes(block, index, Nb*4);

			addRoundKey(key, Nr*Nb*4);
			invShiftRows();
			for( round = Nr; round--; )
			{
				addRoundKey( key, round*Nb*4);
				if (round) {
					invMixSubColumns();
				}
			}
			
			block.position=index;
			block.writeBytes(state);
		}
		
		public function dispose():void {
			var i:uint;
			var r:Random = new Random;
			for (i=0;i<key.length;i++) {
				key[i] = r.nextByte();
			}
			Nr = r.nextByte();
			for (i=0;i<state.length;i++) {
				state[i] = r.nextByte();
			}
			for (i=0;i<tmp.length;i++) {
				tmp[i] = r.nextByte();
			}
			key.length=0;
			keyLength=0;
			state.length=0;
			tmp.length=0;
			key = null;
			state = null;
			tmp = null;
			Nr = 0;
			Memory.gc();
		}

		// exchanges columns in each of 4 rows
		// row0 - unchanged, row1- shifted left 1, 
		// row2 - shifted left 2 and row3 - shifted left 3
		protected function shiftRows():void
		{
			var tmp:uint;
		
			// just substitute row 0
			state[0] = Sbox[state[0]]; state[4] = Sbox[state[4]];
			state[8] = Sbox[state[8]]; state[12] = Sbox[state[12]];
		
			// rotate row 1
			tmp = Sbox[state[1]]; state[1] = Sbox[state[5]];
			state[5] = Sbox[state[9]]; state[9] = Sbox[state[13]]; state[13] = tmp;
		
			// rotate row 2
			tmp = Sbox[state[2]]; state[2] = Sbox[state[10]]; state[10] = tmp;
			tmp = Sbox[state[6]]; state[6] = Sbox[state[14]]; state[14] = tmp;
		
			// rotate row 3
			tmp = Sbox[state[15]]; state[15] = Sbox[state[11]];
			state[11] = Sbox[state[7]]; state[7] = Sbox[state[3]]; state[3] = tmp;
		}
		
		// restores columns in each of 4 rows
		// row0 - unchanged, row1- shifted right 1, 
		// row2 - shifted right 2 and row3 - shifted right 3
		protected function invShiftRows ():void
		{
			var tmp:uint;
		
			// restore row 0
			state[0] = InvSbox[state[0]]; state[4] = InvSbox[state[4]];
			state[8] = InvSbox[state[8]]; state[12] = InvSbox[state[12]];
		
			// restore row 1
			tmp = InvSbox[state[13]]; state[13] = InvSbox[state[9]];
			state[9] = InvSbox[state[5]]; state[5] = InvSbox[state[1]]; state[1] = tmp;
		
			// restore row 2
			tmp = InvSbox[state[2]]; state[2] = InvSbox[state[10]]; state[10] = tmp;
			tmp = InvSbox[state[6]]; state[6] = InvSbox[state[14]]; state[14] = tmp;
		
			// restore row 3
			tmp = InvSbox[state[3]]; state[3] = InvSbox[state[7]];
			state[7] = InvSbox[state[11]]; state[11] = InvSbox[state[15]]; state[15] = tmp;
		}
		
		// recombine and mix each row in a column
		protected function mixSubColumns ():void
		{
			tmp.length=0;
		
			// mixing column 0
			tmp[0] = Xtime2Sbox[state[0]] ^ Xtime3Sbox[state[5]] ^ Sbox[state[10]] ^ Sbox[state[15]];
			tmp[1] = Sbox[state[0]] ^ Xtime2Sbox[state[5]] ^ Xtime3Sbox[state[10]] ^ Sbox[state[15]];
			tmp[2] = Sbox[state[0]] ^ Sbox[state[5]] ^ Xtime2Sbox[state[10]] ^ Xtime3Sbox[state[15]];
			tmp[3] = Xtime3Sbox[state[0]] ^ Sbox[state[5]] ^ Sbox[state[10]] ^ Xtime2Sbox[state[15]];
		
			// mixing column 1
			tmp[4] = Xtime2Sbox[state[4]] ^ Xtime3Sbox[state[9]] ^ Sbox[state[14]] ^ Sbox[state[3]];
			tmp[5] = Sbox[state[4]] ^ Xtime2Sbox[state[9]] ^ Xtime3Sbox[state[14]] ^ Sbox[state[3]];
			tmp[6] = Sbox[state[4]] ^ Sbox[state[9]] ^ Xtime2Sbox[state[14]] ^ Xtime3Sbox[state[3]];
			tmp[7] = Xtime3Sbox[state[4]] ^ Sbox[state[9]] ^ Sbox[state[14]] ^ Xtime2Sbox[state[3]];
		
			// mixing column 2
			tmp[8] = Xtime2Sbox[state[8]] ^ Xtime3Sbox[state[13]] ^ Sbox[state[2]] ^ Sbox[state[7]];
			tmp[9] = Sbox[state[8]] ^ Xtime2Sbox[state[13]] ^ Xtime3Sbox[state[2]] ^ Sbox[state[7]];
			tmp[10]  = Sbox[state[8]] ^ Sbox[state[13]] ^ Xtime2Sbox[state[2]] ^ Xtime3Sbox[state[7]];
			tmp[11]  = Xtime3Sbox[state[8]] ^ Sbox[state[13]] ^ Sbox[state[2]] ^ Xtime2Sbox[state[7]];
		
			// mixing column 3
			tmp[12] = Xtime2Sbox[state[12]] ^ Xtime3Sbox[state[1]] ^ Sbox[state[6]] ^ Sbox[state[11]];
			tmp[13] = Sbox[state[12]] ^ Xtime2Sbox[state[1]] ^ Xtime3Sbox[state[6]] ^ Sbox[state[11]];
			tmp[14] = Sbox[state[12]] ^ Sbox[state[1]] ^ Xtime2Sbox[state[6]] ^ Xtime3Sbox[state[11]];
			tmp[15] = Xtime3Sbox[state[12]] ^ Sbox[state[1]] ^ Sbox[state[6]] ^ Xtime2Sbox[state[11]];
		
			state.position=0;
			state.writeBytes(tmp, 0, Nb*4);
		}
		
		// restore and un-mix each row in a column
		protected function invMixSubColumns ():void
		{
			tmp.length=0;
			var i:uint;
		
			// restore column 0
			tmp[0] = XtimeE[state[0]] ^ XtimeB[state[1]] ^ XtimeD[state[2]] ^ Xtime9[state[3]];
			tmp[5] = Xtime9[state[0]] ^ XtimeE[state[1]] ^ XtimeB[state[2]] ^ XtimeD[state[3]];
			tmp[10] = XtimeD[state[0]] ^ Xtime9[state[1]] ^ XtimeE[state[2]] ^ XtimeB[state[3]];
			tmp[15] = XtimeB[state[0]] ^ XtimeD[state[1]] ^ Xtime9[state[2]] ^ XtimeE[state[3]];
		
			// restore column 1
			tmp[4] = XtimeE[state[4]] ^ XtimeB[state[5]] ^ XtimeD[state[6]] ^ Xtime9[state[7]];
			tmp[9] = Xtime9[state[4]] ^ XtimeE[state[5]] ^ XtimeB[state[6]] ^ XtimeD[state[7]];
			tmp[14] = XtimeD[state[4]] ^ Xtime9[state[5]] ^ XtimeE[state[6]] ^ XtimeB[state[7]];
			tmp[3] = XtimeB[state[4]] ^ XtimeD[state[5]] ^ Xtime9[state[6]] ^ XtimeE[state[7]];
		
			// restore column 2
			tmp[8] = XtimeE[state[8]] ^ XtimeB[state[9]] ^ XtimeD[state[10]] ^ Xtime9[state[11]];
			tmp[13] = Xtime9[state[8]] ^ XtimeE[state[9]] ^ XtimeB[state[10]] ^ XtimeD[state[11]];
			tmp[2]  = XtimeD[state[8]] ^ Xtime9[state[9]] ^ XtimeE[state[10]] ^ XtimeB[state[11]];
			tmp[7]  = XtimeB[state[8]] ^ XtimeD[state[9]] ^ Xtime9[state[10]] ^ XtimeE[state[11]];
		
			// restore column 3
			tmp[12] = XtimeE[state[12]] ^ XtimeB[state[13]] ^ XtimeD[state[14]] ^ Xtime9[state[15]];
			tmp[1] = Xtime9[state[12]] ^ XtimeE[state[13]] ^ XtimeB[state[14]] ^ XtimeD[state[15]];
			tmp[6] = XtimeD[state[12]] ^ Xtime9[state[13]] ^ XtimeE[state[14]] ^ XtimeB[state[15]];
			tmp[11] = XtimeB[state[12]] ^ XtimeD[state[13]] ^ Xtime9[state[14]] ^ XtimeE[state[15]];
		
			for( i=0; i < 4 * Nb; i++ )
				state[i] = InvSbox[tmp[i]];
		}
		
		// encrypt/decrypt columns of the key
		protected function addRoundKey (key:ByteArray, offset:uint):void
		{
			var idx:uint;
		
			for( idx = 0; idx < 16; idx++ )
				state[idx] ^= key[idx+offset];
		}

		public function toString():String {
			return "aes"+(8*keyLength);
		}
	}
}

⌨️ 快捷键说明

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