优化AES加密算法的策略与实现-实现AES算法加速

摘要

高级加密标准(AES)由于其高效性和安全性广泛应用于数据加密。然而,在处理大规模数据时,进一步提升其性能仍然至关重要。本文探讨了三种优化AES算法的技术——空间换时间、预计算、以及减少内循环嵌套,详细阐述了这些策略的实现原理和具体代码,以期在保证加密强度的同时,显著提升加密处理速度。

引言

AES算法作为一种对称密钥加密技术,已成为现代数字加密通信的核心技术之一。尽管AES在设计时已考虑到了高效性,但随着技术的发展和数据量的增加,原有实现在某些情况下可能无法满足高效处理的需求。本研究通过实施空间换时间、预计算、以及减少内循环嵌套三种优化策略,对AES加密性能进行了优化。

方法

空间换时间

该策略通过增加额外的内存使用,以存储预计算的数据,从而减少实时计算的需要。在AES加密过程中,最显著的应用是S盒的查表操作。S盒操作是字节代替步骤中的核心,通过预先计算256个可能的输出值并将它们存储在查找表中,可以显著减少加密时的计算量。

unsigned __int8 S[256] = {
    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
    /* ... 省略中间部分 ... */
    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a
};

通过预先计算并存储每个字节的替换值,可以在加密过程中快速查找并替换,大幅度提升加密速度。

预计算

预计算主要应用于AES的列混合(MixColumns)步骤。通过预先计算各种可能的列混合结果并存储于查找表中,可以将复杂的多次乘法和加法运算转换为简单的查表操作。此外,密钥扩展过程中的每个轮密钥也可通过预计算方式提前生成并存储,以降低每次加密操作的处理时间。

unsigned int S1[256] = { /* 预先计算的变换值 */ };
unsigned int S2[256] = { /* 预先计算的变换值 */ };
unsigned int S3[256] = { /* 预先计算的变换值 */ };
unsigned int S4[256] = { /* 预先计算的变换值 */ };

这些查表分别对应AES列混合中的每种可能变换,使得每次变换操作只需四次查表和一次异或操作,大大提高了速度。

减少内循环嵌套

通过优化算法结构,减少循环中的计算步骤和条件判断,可有效减轻处理器负担。在AES实现中,优化数据路径和减少每轮中的冗余操作,如不必要的数据拷贝和变量更新,是提升效率的关键。为了减少内循环嵌套,我们可以通过引入临时变量来减少赋值操作,并通过预先计算减少不必要的计算量。

unsigned __int32 e, f, g, h;
/* 初始化e, f, g, h,减少每轮中的赋值操作 */
e = S1[a >> 24] ^ S2[(unsigned __int8)(b >> 16)] ^ S3[(unsigned __int8)(c >> 8)] ^ S4[(unsigned __int8)d] ^ k5;
f = S1[b >> 24] ^ S2[(unsigned __int8)(c >> 16)] ^ S3[(unsigned __int8)(d >> 8)] ^ S4[(unsigned __int8)a] ^ k6;
g = S1[c >> 24] ^ S2[(unsigned __int8)(d >> 16)] ^ S3[(unsigned __int8)(a >> 8)] ^ S4[(unsigned __int8)b] ^ k7;
h = S1[d >> 24] ^ S2[(unsigned __int8)(a >> 16)] ^ S3[(unsigned __int8)(b >> 8)] ^ S4[(unsigned __int8)c] ^ k8;

通过这种方式,可以减少每轮运算中的计算量,从而提高整体加密速度。

具体实现代码

下面是一个完整的优化AES加密实现示例,展示了上述三种优化策略如何在实际代码中应用:

//空间换时间;预计算;减少内循环嵌套; 
#include<stdio.h>
#include<time.h>
int main()
{
	/*
	字节代替变换由两个可逆变换符合而成,将每一个字节变换为有限域GF(2^8)中的乘法逆
	再对其结果用GF(2)上的仿射变换(+【11000110】)。因为输入为256规模故可以制作一
	个256规模的表,每次字节代替变换转换为一次查表,从而提高了加密速度。 
	*/
	unsigned	__int8 S[256]={
			0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,
			0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,
			0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,
			0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,
			0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,
			0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,
			0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,
			0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,
			0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,
			0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,
			0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,
			0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,
			0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,
			0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,
			0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,
			0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16
			};
	/*
	\02 03 01 01\	\a\		\02*a+03*b+01*c+01*d\	\02*a\	\03*b\	\01*c\	\01*d\	\02\	\03\	\01\	\01\
	\01 02 03 01\	\b\		\01*a+02*b+03*c+01*d\	\01*a\	\02*b\	\03*c\	\01*d\	\01\	\02\	\03\	\01\
	\01 01 02 03\*	\c\= 	\01*a+01*b+02*c+03*d\=	\01*a\+	\01*b\+	\02*c\+	\03*d\=	\01\*a+	\01\*b+	\02\*c+	\03\*d
	\03 01 01 02\	\d\		\03*a+01*b+01*c+02*d\	\03*a\	\01*d\	\01*c\	\02*d\	\03\	\01\	\01\	\02\
	
	列混合变换可以看作一个矩阵与明文块进行乘法运算,而对于每一列明文的变换可以看作a,b,c,d分别与变换矩阵的
	对应的一列进行乘法运算后在相加。又因为每一个字为8bit,故可将上面每一列的乘法做成一个查询表,每个乘法
	变为一次查表。因此,每一列明文的加密可以看作四次查表,从而大大提高了加密的速度。 
	*/
	unsigned 	int S1[256]={0xc66363a5,0xf87c7c84,0xee777799,0xf67b7b8d,0xfff2f20d,0xd66b6bbd,0xde6f6fb1,0x91c5c554,0x60303050,0x02010103,0xce6767a9,0x562b2b7d,0xe7fefe19,0xb5d7d762,0x4dababe6,0xec76769a,0x8fcaca45,0x1f82829d,0x89c9c940,0xfa7d7d87,0xeffafa15,0xb25959eb,0x8e4747c9,0xfbf0f00b,0x41adadec,0xb3d4d467,0x5fa2a2fd,0x45afafea,0x239c9cbf,0x53a4a4f7,0xe4727296,0x9bc0c05b,0x75b7b7c2,0xe1fdfd1c,0x3d9393ae,0x4c26266a,0x6c36365a,0x7e3f3f41,0xf5f7f702,0x83cccc4f,0x6834345c,0x51a5a5f4,0xd1e5e534,0xf9f1f108,0xe2717193,0xabd8d873,0x62313153,0x2a15153f,0x0804040c,0x95c7c752,0x46232365,0x9dc3c35e,0x30181828,0x379696a1,0x0a05050f,0x2f9a9ab5,0x0e070709,0x24121236,0x1b80809b,0xdfe2e23d,0xcdebeb26,0x4e272769,0x7fb2b2cd,0xea75759f,0x1209091b,0x1d83839e,0x582c2c74,0x341a1a2e,0x361b1b2d,0xdc6e6eb2,0xb45a5aee,0x5ba0a0fb,0xa45252f6,0x763b3b4d,0xb7d6d661,0x7db3b3ce,0x5229297b,0xdde3e33e,0x5e2f2f71,0x13848497,0xa65353f5,0xb9d1d168,0x00000000,0xc1eded2c,0x40202060,0xe3fcfc1f,0x79b1b1c8,0xb65b5bed,0xd46a6abe,0x8dcbcb46,0x67bebed9,0x7239394b,0x944a4ade,0x984c4cd4,0xb05858e8,0x85cfcf4a,0xbbd0d06b,0xc5efef2a,0x4faaaae5,0xedfbfb16,0x864343c5,0x9a4d4dd7,0x66333355,0x11858594,0x8a4545cf,0xe9f9f910,0x04020206,0xfe7f7f81,0xa05050f0,0x783c3c44,0x259f9fba,0x4ba8a8e3,0xa25151f3,0x5da3a3fe,0x804040c0,0x058f8f8a,0x3f9292ad,0x219d9dbc,0x70383848,0xf1f5f504,0x63bcbcdf,0x77b6b6c1,0xafdada75,0x42212163,0x20101030,0xe5ffff1a,0xfdf3f30e,0xbfd2d26d,0x81cdcd4c,0x180c0c14,0x26131335,0xc3ecec2f,0xbe5f5fe1,0x359797a2,0x884444cc,0x2e171739,0x93c4c457,0x55a7a7f2,0xfc7e7e82,0x7a3d3d47,0xc86464ac,0xba5d5de7,0x3219192b,0xe6737395,0xc06060a0,0x19818198,0x9e4f4fd1,0xa3dcdc7f,0x44222266,0x542a2a7e,0x3b9090ab,0x0b888883,0x8c4646ca,0xc7eeee29,0x6bb8b8d3,0x2814143c,0xa7dede79,0xbc5e5ee2,0x160b0b1d,0xaddbdb76,0xdbe0e03b,0x64323256,0x743a3a4e,0x140a0a1e,0x924949db,0x0c06060a,0x4824246c,0xb85c5ce4,0x9fc2c25d,0xbdd3d36e,0x43acacef,0xc46262a6,0x399191a8,0x319595a4,0xd3e4e437,0xf279798b,0xd5e7e732,0x8bc8c843,0x6e373759,0xda6d6db7,0x018d8d8c,0xb1d5d564,0x9c4e4ed2,0x49a9a9e0,0xd86c6cb4,0xac5656fa,0xf3f4f407,0xcfeaea25,0xca6565af,0xf47a7a8e,0x47aeaee9,0x10080818,0x6fbabad5,0xf0787888,0x4a25256f,0x5c2e2e72,0x381c1c24,0x57a6a6f1,0x73b4b4c7,0x97c6c651,0xcbe8e823,0xa1dddd7c,0xe874749c,0x3e1f1f21,0x964b4bdd,0x61bdbddc,0x0d8b8b86,0x0f8a8a85,0xe0707090,0x7c3e3e42,0x71b5b5c4,0xcc6666aa,0x904848d8,0x06030305,0xf7f6f601,0x1c0e0e12,0xc26161a3,0x6a35355f,0xae5757f9,0x69b9b9d0,0x17868691,0x99c1c158,0x3a1d1d27,0x279e9eb9,0xd9e1e138,0xebf8f813,0x2b9898b3,0x22111133,0xd26969bb,0xa9d9d970,0x078e8e89,0x339494a7,0x2d9b9bb6,0x3c1e1e22,0x15878792,0xc9e9e920,0x87cece49,0xaa5555ff,0x50282878,0xa5dfdf7a,0x038c8c8f,0x59a1a1f8,0x09898980,0x1a0d0d17,0x65bfbfda,0xd7e6e631,0x844242c6,0xd06868b8,0x824141c3,0x299999b0,0x5a2d2d77,0x1e0f0f11,0x7bb0b0cb,0xa85454fc,0x6dbbbbd6,0x2c16163a
	};
	/*
	\02\
	\01\
	\01\*a,0=<a<=255,S1[i]=02*i\01*i\01*i\03*i,*表示字节乘法 
	\03\
	*/
	unsigned	int S2[256]={0xa5c66363,0x84f87c7c,0x99ee7777,0x8df67b7b,0x0dfff2f2,0xbdd66b6b,0xb1de6f6f,0x5491c5c5,0x50603030,0x03020101,0xa9ce6767,0x7d562b2b,0x19e7fefe,0x62b5d7d7,0xe64dabab,0x9aec7676,0x458fcaca,0x9d1f8282,0x4089c9c9,0x87fa7d7d,0x15effafa,0xebb25959,0xc98e4747,0x0bfbf0f0,0xec41adad,0x67b3d4d4,0xfd5fa2a2,0xea45afaf,0xbf239c9c,0xf753a4a4,0x96e47272,0x5b9bc0c0,0xc275b7b7,0x1ce1fdfd,0xae3d9393,0x6a4c2626,0x5a6c3636,0x417e3f3f,0x02f5f7f7,0x4f83cccc,0x5c683434,0xf451a5a5,0x34d1e5e5,0x08f9f1f1,0x93e27171,0x73abd8d8,0x53623131,0x3f2a1515,0x0c080404,0x5295c7c7,0x65462323,0x5e9dc3c3,0x28301818,0xa1379696,0x0f0a0505,0xb52f9a9a,0x090e0707,0x36241212,0x9b1b8080,0x3ddfe2e2,0x26cdebeb,0x694e2727,0xcd7fb2b2,0x9fea7575,0x1b120909,0x9e1d8383,0x74582c2c,0x2e341a1a,0x2d361b1b,0xb2dc6e6e,0xeeb45a5a,0xfb5ba0a0,0xf6a45252,0x4d763b3b,0x61b7d6d6,0xce7db3b3,0x7b522929,0x3edde3e3,0x715e2f2f,0x97138484,0xf5a65353,0x68b9d1d1,0x00000000,0x2cc1eded,0x60402020,0x1fe3fcfc,0xc879b1b1,0xedb65b5b,0xbed46a6a,0x468dcbcb,0xd967bebe,0x4b723939,0xde944a4a,0xd4984c4c,0xe8b05858,0x4a85cfcf,0x6bbbd0d0,0x2ac5efef,0xe54faaaa,0x16edfbfb,0xc5864343,0xd79a4d4d,0x55663333,0x94118585,0xcf8a4545,0x10e9f9f9,0x06040202,0x81fe7f7f,0xf0a05050,0x44783c3c,0xba259f9f,0xe34ba8a8,0xf3a25151,0xfe5da3a3,0xc0804040,0x8a058f8f,0xad3f9292,0xbc219d9d,0x48703838,0x04f1f5f5,0xdf63bcbc,0xc177b6b6,0x75afdada,0x63422121,0x30201010,0x1ae5ffff,0x0efdf3f3,0x6dbfd2d2,0x4c81cdcd,0x14180c0c,0x35261313,0x2fc3ecec,0xe1be5f5f,0xa2359797,0xcc884444,0x392e1717,0x5793c4c4,0xf255a7a7,0x82fc7e7e,0x477a3d3d,0xacc86464,0xe7ba5d5d,0x2b321919,0x95e67373,0xa0c06060,0x98198181,0xd19e4f4f,0x7fa3dcdc,0x66442222,0x7e542a2a,0xab3b9090,0x830b8888,0xca8c4646,0x29c7eeee,0xd36bb8b8,0x3c281414,0x79a7dede,0xe2bc5e5e,0x1d160b0b,0x76addbdb,0x3bdbe0e0,0x56643232,0x4e743a3a,0x1e140a0a,0xdb924949,0x0a0c0606,0x6c482424,0xe4b85c5c,0x5d9fc2c2,0x6ebdd3d3,0xef43acac,0xa6c46262,0xa8399191,0xa4319595,0x37d3e4e4,0x8bf27979,0x32d5e7e7,0x438bc8c8,0x596e3737,0xb7da6d6d,0x8c018d8d,0x64b1d5d5,0xd29c4e4e,0xe049a9a9,0xb4d86c6c,0xfaac5656,0x07f3f4f4,0x25cfeaea,0xafca6565,0x8ef47a7a,0xe947aeae,0x18100808,0xd56fbaba,0x88f07878,0x6f4a2525,0x725c2e2e,0x24381c1c,0xf157a6a6,0xc773b4b4,0x5197c6c6,0x23cbe8e8,0x7ca1dddd,0x9ce87474,0x213e1f1f,0xdd964b4b,0xdc61bdbd,0x860d8b8b,0x850f8a8a,0x90e07070,0x427c3e3e,0xc471b5b5,0xaacc6666,0xd8904848,0x05060303,0x01f7f6f6,0x121c0e0e,0xa3c26161,0x5f6a3535,0xf9ae5757,0xd069b9b9,0x91178686,0x5899c1c1,0x273a1d1d,0xb9279e9e,0x38d9e1e1,0x13ebf8f8,0xb32b9898,0x33221111,0xbbd26969,0x70a9d9d9,0x89078e8e,0xa7339494,0xb62d9b9b,0x223c1e1e,0x92158787,0x20c9e9e9,0x4987cece,0xffaa5555,0x78502828,0x7aa5dfdf,0x8f038c8c,0xf859a1a1,0x80098989,0x171a0d0d,0xda65bfbf,0x31d7e6e6,0xc6844242,0xb8d06868,0xc3824141,0xb0299999,0x775a2d2d,0x111e0f0f,0xcb7bb0b0,0xfca85454,0xd66dbbbb,0x3a2c1616
	};
	/*
	\03\
	\02\
	\01\*b,0=<b<=255,S2[i]=03*i\02*i\01*i\01*i,*表示字节乘法 
	\01\
	*/
	unsigned	int S3[256]={0x63a5c663,0x7c84f87c,0x7799ee77,0x7b8df67b,0xf20dfff2,0x6bbdd66b,0x6fb1de6f,0xc55491c5,0x30506030,0x01030201,0x67a9ce67,0x2b7d562b,0xfe19e7fe,0xd762b5d7,0xabe64dab,0x769aec76,0xca458fca,0x829d1f82,0xc94089c9,0x7d87fa7d,0xfa15effa,0x59ebb259,0x47c98e47,0xf00bfbf0,0xadec41ad,0xd467b3d4,0xa2fd5fa2,0xafea45af,0x9cbf239c,0xa4f753a4,0x7296e472,0xc05b9bc0,0xb7c275b7,0xfd1ce1fd,0x93ae3d93,0x266a4c26,0x365a6c36,0x3f417e3f,0xf702f5f7,0xcc4f83cc,0x345c6834,0xa5f451a5,0xe534d1e5,0xf108f9f1,0x7193e271,0xd873abd8,0x31536231,0x153f2a15,0x040c0804,0xc75295c7,0x23654623,0xc35e9dc3,0x18283018,0x96a13796,0x050f0a05,0x9ab52f9a,0x07090e07,0x12362412,0x809b1b80,0xe23ddfe2,0xeb26cdeb,0x27694e27,0xb2cd7fb2,0x759fea75,0x091b1209,0x839e1d83,0x2c74582c,0x1a2e341a,0x1b2d361b,0x6eb2dc6e,0x5aeeb45a,0xa0fb5ba0,0x52f6a452,0x3b4d763b,0xd661b7d6,0xb3ce7db3,0x297b5229,0xe33edde3,0x2f715e2f,0x84971384,0x53f5a653,0xd168b9d1,0x00000000,0xed2cc1ed,0x20604020,0xfc1fe3fc,0xb1c879b1,0x5bedb65b,0x6abed46a,0xcb468dcb,0xbed967be,0x394b7239,0x4ade944a,0x4cd4984c,0x58e8b058,0xcf4a85cf,0xd06bbbd0,0xef2ac5ef,0xaae54faa,0xfb16edfb,0x43c58643,0x4dd79a4d,0x33556633,0x85941185,0x45cf8a45,0xf910e9f9,0x02060402,0x7f81fe7f,0x50f0a050,0x3c44783c,0x9fba259f,0xa8e34ba8,0x51f3a251,0xa3fe5da3,0x40c08040,0x8f8a058f,0x92ad3f92,0x9dbc219d,0x38487038,0xf504f1f5,0xbcdf63bc,0xb6c177b6,0xda75afda,0x21634221,0x10302010,0xff1ae5ff,0xf30efdf3,0xd26dbfd2,0xcd4c81cd,0x0c14180c,0x13352613,0xec2fc3ec,0x5fe1be5f,0x97a23597,0x44cc8844,0x17392e17,0xc45793c4,0xa7f255a7,0x7e82fc7e,0x3d477a3d,0x64acc864,0x5de7ba5d,0x192b3219,0x7395e673,0x60a0c060,0x81981981,0x4fd19e4f,0xdc7fa3dc,0x22664422,0x2a7e542a,0x90ab3b90,0x88830b88,0x46ca8c46,0xee29c7ee,0xb8d36bb8,0x143c2814,0xde79a7de,0x5ee2bc5e,0x0b1d160b,0xdb76addb,0xe03bdbe0,0x32566432,0x3a4e743a,0x0a1e140a,0x49db9249,0x060a0c06,0x246c4824,0x5ce4b85c,0xc25d9fc2,0xd36ebdd3,0xacef43ac,0x62a6c462,0x91a83991,0x95a43195,0xe437d3e4,0x798bf279,0xe732d5e7,0xc8438bc8,0x37596e37,0x6db7da6d,0x8d8c018d,0xd564b1d5,0x4ed29c4e,0xa9e049a9,0x6cb4d86c,0x56faac56,0xf407f3f4,0xea25cfea,0x65afca65,0x7a8ef47a,0xaee947ae,0x08181008,0xbad56fba,0x7888f078,0x256f4a25,0x2e725c2e,0x1c24381c,0xa6f157a6,0xb4c773b4,0xc65197c6,0xe823cbe8,0xdd7ca1dd,0x749ce874,0x1f213e1f,0x4bdd964b,0xbddc61bd,0x8b860d8b,0x8a850f8a,0x7090e070,0x3e427c3e,0xb5c471b5,0x66aacc66,0x48d89048,0x03050603,0xf601f7f6,0x0e121c0e,0x61a3c261,0x355f6a35,0x57f9ae57,0xb9d069b9,0x86911786,0xc15899c1,0x1d273a1d,0x9eb9279e,0xe138d9e1,0xf813ebf8,0x98b32b98,0x11332211,0x69bbd269,0xd970a9d9,0x8e89078e,0x94a73394,0x9bb62d9b,0x1e223c1e,0x87921587,0xe920c9e9,0xce4987ce,0x55ffaa55,0x28785028,0xdf7aa5df,0x8c8f038c,0xa1f859a1,0x89800989,0x0d171a0d,0xbfda65bf,0xe631d7e6,0x42c68442,0x68b8d068,0x41c38241,0x99b02999,0x2d775a2d,0x0f111e0f,0xb0cb7bb0,0x54fca854,0xbbd66dbb,0x163a2c16
	};
	/*
	\01\
	\03\
	\02\*c,0=<c<=255,S3[i]=01*i\03*i\02*i\01*i,*表示字节乘法 
	\01\
	*/
	unsigned	int S4[256]={0x6363a5c6,0x7c7c84f8,0x777799ee,0x7b7b8df6,0xf2f20dff,0x6b6bbdd6,0x6f6fb1de,0xc5c55491,0x30305060,0x01010302,0x6767a9ce,0x2b2b7d56,0xfefe19e7,0xd7d762b5,0xababe64d,0x76769aec,0xcaca458f,0x82829d1f,0xc9c94089,0x7d7d87fa,0xfafa15ef,0x5959ebb2,0x4747c98e,0xf0f00bfb,0xadadec41,0xd4d467b3,0xa2a2fd5f,0xafafea45,0x9c9cbf23,0xa4a4f753,0x727296e4,0xc0c05b9b,0xb7b7c275,0xfdfd1ce1,0x9393ae3d,0x26266a4c,0x36365a6c,0x3f3f417e,0xf7f702f5,0xcccc4f83,0x34345c68,0xa5a5f451,0xe5e534d1,0xf1f108f9,0x717193e2,0xd8d873ab,0x31315362,0x15153f2a,0x04040c08,0xc7c75295,0x23236546,0xc3c35e9d,0x18182830,0x9696a137,0x05050f0a,0x9a9ab52f,0x0707090e,0x12123624,0x80809b1b,0xe2e23ddf,0xebeb26cd,0x2727694e,0xb2b2cd7f,0x75759fea,0x09091b12,0x83839e1d,0x2c2c7458,0x1a1a2e34,0x1b1b2d36,0x6e6eb2dc,0x5a5aeeb4,0xa0a0fb5b,0x5252f6a4,0x3b3b4d76,0xd6d661b7,0xb3b3ce7d,0x29297b52,0xe3e33edd,0x2f2f715e,0x84849713,0x5353f5a6,0xd1d168b9,0x00000000,0xeded2cc1,0x20206040,0xfcfc1fe3,0xb1b1c879,0x5b5bedb6,0x6a6abed4,0xcbcb468d,0xbebed967,0x39394b72,0x4a4ade94,0x4c4cd498,0x5858e8b0,0xcfcf4a85,0xd0d06bbb,0xefef2ac5,0xaaaae54f,0xfbfb16ed,0x4343c586,0x4d4dd79a,0x33335566,0x85859411,0x4545cf8a,0xf9f910e9,0x02020604,0x7f7f81fe,0x5050f0a0,0x3c3c4478,0x9f9fba25,0xa8a8e34b,0x5151f3a2,0xa3a3fe5d,0x4040c080,0x8f8f8a05,0x9292ad3f,0x9d9dbc21,0x38384870,0xf5f504f1,0xbcbcdf63,0xb6b6c177,0xdada75af,0x21216342,0x10103020,0xffff1ae5,0xf3f30efd,0xd2d26dbf,0xcdcd4c81,0x0c0c1418,0x13133526,0xecec2fc3,0x5f5fe1be,0x9797a235,0x4444cc88,0x1717392e,0xc4c45793,0xa7a7f255,0x7e7e82fc,0x3d3d477a,0x6464acc8,0x5d5de7ba,0x19192b32,0x737395e6,0x6060a0c0,0x81819819,0x4f4fd19e,0xdcdc7fa3,0x22226644,0x2a2a7e54,0x9090ab3b,0x8888830b,0x4646ca8c,0xeeee29c7,0xb8b8d36b,0x14143c28,0xdede79a7,0x5e5ee2bc,0x0b0b1d16,0xdbdb76ad,0xe0e03bdb,0x32325664,0x3a3a4e74,0x0a0a1e14,0x4949db92,0x06060a0c,0x24246c48,0x5c5ce4b8,0xc2c25d9f,0xd3d36ebd,0xacacef43,0x6262a6c4,0x9191a839,0x9595a431,0xe4e437d3,0x79798bf2,0xe7e732d5,0xc8c8438b,0x3737596e,0x6d6db7da,0x8d8d8c01,0xd5d564b1,0x4e4ed29c,0xa9a9e049,0x6c6cb4d8,0x5656faac,0xf4f407f3,0xeaea25cf,0x6565afca,0x7a7a8ef4,0xaeaee947,0x08081810,0xbabad56f,0x787888f0,0x25256f4a,0x2e2e725c,0x1c1c2438,0xa6a6f157,0xb4b4c773,0xc6c65197,0xe8e823cb,0xdddd7ca1,0x74749ce8,0x1f1f213e,0x4b4bdd96,0xbdbddc61,0x8b8b860d,0x8a8a850f,0x707090e0,0x3e3e427c,0xb5b5c471,0x6666aacc,0x4848d890,0x03030506,0xf6f601f7,0x0e0e121c,0x6161a3c2,0x35355f6a,0x5757f9ae,0xb9b9d069,0x86869117,0xc1c15899,0x1d1d273a,0x9e9eb927,0xe1e138d9,0xf8f813eb,0x9898b32b,0x11113322,0x6969bbd2,0xd9d970a9,0x8e8e8907,0x9494a733,0x9b9bb62d,0x1e1e223c,0x87879215,0xe9e920c9,0xcece4987,0x5555ffaa,0x28287850,0xdfdf7aa5,0x8c8c8f03,0xa1a1f859,0x89898009,0x0d0d171a,0xbfbfda65,0xe6e631d7,0x4242c684,0x6868b8d0,0x4141c382,0x9999b029,0x2d2d775a,0x0f0f111e,0xb0b0cb7b,0x5454fca8,0xbbbbd66d,0x16163a2c
	};
	/*
	\01\
	\01\
	\03\*d,0=<d<=255,S4[i]=01*i\01*i\03*i\02*i ,*表示字节乘法
	\02\
	*/
	unsigned int a=0x0,b=0x0,c=0x0,d=0x0;
	/*
	a,b,c,d分别代表明文块的一列的联合,如a=a_00\a_10\a_20\a_30 
	\a_00 b_01 c_02 d_03\
	\a_10 b_11 c_12 d_13\
	\a_20 b_21 c_22 d_23\
	\a_30 b_31 c_32 d_33\
	*/
	unsigned __int32 e,f,g,h;
	/*
	e,f,g,h的定义同上面的a,b,c,d;在此处定义e,f,g,h是为了减少每轮圈函数中的赋值操作,从而提高程序的运行速度 
	*/
	int i,j,t,p;
	/*ki为32比特,表示一列的密钥的联合,如k1=k_00\k_10\k_20\k_30,这样是为了在圈密钥参与时减少异或运算的次数 
	\k_00 k_01 k_02 k_03\
	\k_10 k_11 k_12 k_13\
	\k_20 k_21 k_22 k_23\
	\k_30 k_31 k_32 k_33\
	
	*/
	
	unsigned __int32 k1=0x0,k2=0x0,k3=0x0,k4=0x0,
				 k5,k6,k7,k8,
				 k9,k10,k11,k12,
				 k13,k14,k15,k16,
				 k17,k18,k19,k20,
				 k21,k22,k23,k24,
				 k25,k26,k27,k28,
				 k29,k30,k31,k32,
				 k33,k34,k35,k36,
				 k37,k38,k39,k40,
				 k41,k42,k43,k44;
	/*
	imod4=0时
	k_i=(k_(i-4) )+S(R(K_(i-1))+Rcon[i/4])  ps:+为mod2加 
	imod4!=0时
	k_i=k_(i-1)+k_(i-4)  					ps: +为mod2加 
	因为本程序i从1开始计数,故上述判断条件变为(i-1)mod4是否等于0 ,Rcon[i/4]变为Rcon[(i-1)/4] 
	*/
	a=0x3243f6a8;
	b=0x885a308d;
	c=0x313198a2;
	d=0xe0370734;
	k1=0x2b7e1516;
	k2=0x28aed2a6;
	k3=0xabf71588;
	k4=0x09cf4f3c; 
	p=50000;
	//scanf("%d",&p); 
	k5=k1^(S[k4>>24]^((S[(unsigned __int8)(k4>>16)]^0x01)<<24))^(S[(unsigned __int8)(k4>>8)]<<16)^(S[(unsigned __int8)k4]<<8);
	//(5-1)mod4=0,所以 k_5=k1+S(k_4)+ Rcon[1],因为Rcon[i]=0xab000000,故只需将Rcon[i]与 S(k_4)中最高一个字节进行运算
	// 对S(R(a,b,c,d))=(S(b),S(c),S(d),S(a))=(S1[b],S2[c].S3[d],S4[a]),直接在赋值过程体现,不需要进行专门的移位变换 
	k6=k2^k5;
	k7=k3^k6;
	k8=k4^k7;
	k9=k5^(S[k8>>24]^((S[(unsigned __int8)(k8>>16)]^0x02)<<24)^(S[(unsigned __int8)(k8>>8)]<<16)^(S[(unsigned __int8)k8]<<8));
	k10=k6^k9;
	k11=k7^k10;
	k12=k8^k11;
	k13=k9^(S[k12>>24]^((S[(unsigned __int8)(k12>>16)]^0x04)<<24)^(S[(unsigned __int8)(k12>>8)]<<16)^(S[(unsigned __int8)k12]<<8));
	k14=k10^k13;
	k15=k11^k14;
	k16=k12^k15;
	k17=k13^(S[k16>>24]^((S[(unsigned __int8)(k16>>16)]^0x08)<<24)^(S[(unsigned __int8)(k16>>8)]<<16)^(S[(unsigned __int8)k16]<<8));
	k18=k14^k17;
	k19=k15^k18;
	k20=k16^k19;
	k21=k17^(S[k20>>24]^((S[(unsigned __int8)(k20>>16)]^0x10)<<24)^(S[(unsigned __int8)(k20>>8)]<<16)^(S[(unsigned __int8)k20]<<8));
	k22=k18^k21;
	k23=k19^k22;
	k24=k20^k23;
	k25=k21^(S[k24>>24]^((S[(unsigned __int8)(k24>>16)]^0x20)<<24)^(S[(unsigned __int8)(k24>>8)]<<16)^(S[(unsigned __int8)k24]<<8));
	k26=k22^k25;
	k27=k23^k26;
	k28=k24^k27;
	k29=k25^(S[k28>>24]^((S[(unsigned __int8)(k28>>16)]^0x40)<<24)^(S[(unsigned __int8)(k28>>8)]<<16)^(S[(unsigned __int8)k28]<<8));
	k30=k26^k29;
	k31=k27^k30;
	k32=k28^k31;
	k33=k29^(S[k32>>24]^((S[(unsigned __int8)(k32>>16)]^0x80)<<24)^(S[(unsigned __int8)(k32>>8)]<<16)^(S[(unsigned __int8)k32]<<8));
	k34=k30^k33;
	k35=k31^k34;
	k36=k32^k35;
	k37=k33^(S[k36>>24]^((S[(unsigned __int8)(k36>>16)]^0x1b)<<24)^(S[(unsigned __int8)(k36>>8)]<<16)^(S[(unsigned __int8)k36]<<8));
	k38=k34^k37;
	k39=k35^k38;
	k40=k36^k39;
	k41=k37^(S[k40>>24]^((S[(unsigned __int8)(k40>>16)]^0x36)<<24)^(S[(unsigned __int8)(k40>>8)]<<16)^(S[(unsigned __int8)k40]<<8));
	k42=k38^k41;
	k43=k39^k42;
	k44=k40^k43;
	clock_t start,end;
	start=clock();
	for(i=0;i<p;i++)
	{
	a^=k1;	b^=k2;	c^=k3;	d^=k4;
	/*
	\a_00+k_00 b_01+k_01 c_02+k_02 d_03+k_03\	\\a_00\	\k_00\\\...\
	\a_10+k_10 b_11+k_11 c_12+k_12 d_13+k_13\	\\a_10\	\k_10\\\...\
	\a_20+k_20 b_21+k_21 c_22+k_22 d_23+k_23\=	\\a_20\+\k_20\\\...\=(a^k1)\(b^k2)\(c^k3)\(d^k4)
	\a_30+k_30 b_31+k_31 c_32+k_32 d_33+k_33\	\\a_30\	\k_30\\\...\
	*/
	//第一圈
	e=S1[a>>24]^S2[(unsigned __int8)(b>>16)]^S3[(unsigned __int8)(c>>8)]^S4[(unsigned __int8)d]^k5;
	f=S1[b>>24]^S2[(unsigned __int8)(c>>16)]^S3[(unsigned __int8)(d>>8)]^S4[(unsigned __int8)a]^k6;
	g=S1[c>>24]^S2[(unsigned __int8)(d>>16)]^S3[(unsigned __int8)(a>>8)]^S4[(unsigned __int8)b]^k7;
	h=S1[d>>24]^S2[(unsigned __int8)(a>>16)]^S3[(unsigned __int8)(b>>8)]^S4[(unsigned __int8)c]^k8;
	/*
		\a_00 b_01 c_02 d_03\		\a_00 b_01 c_02 d_03\	\a_00 b_01 c_02 d_03\	
		\a_10 b_11 c_12 d_13\		\a_10 b_11 c_12 d_13\	\b_11 c_12 d_13 a_10\	
	CRS	\a_20 b_21 c_22 d_23\ =CSR 	\a_20 b_21 c_22 d_23\=CS\c_22 d_23 a_20 b_21\=	(S1[a_00]+S2[b_11]+S3[c_22]+S4[d_33])\(S1[b_01]+S2[c_12]+S3[d_23]+S4[a_30])...
		\a_30 b_31 c_32 d_33\		\a_30 b_31 c_32 d_33\	\d_33 a_30 b_31 c_32\	
	取0xabcdefgh中的第i个字节,可以通过移位与与运算得到,例如:(0xabcdefgh>>24)&0xff,对于&0xff,我采取了(unsigned __int8)取代,
	将一次与运算换成截取操作,加快运算速度.并且对于移位变换可以直接体现在赋值过程中,减少不必要的操作,提高加密速度。 
	*/
	//第二圈
	a=S1[e>>24]^S2[(unsigned __int8)(f>>16)]^S3[(unsigned __int8)(g>>8)]^S4[(unsigned __int8)h]^k9;
	b=S1[f>>24]^S2[(unsigned __int8)(g>>16)]^S3[(unsigned __int8)(h>>8)]^S4[(unsigned __int8)e]^k10;
	c=S1[g>>24]^S2[(unsigned __int8)(h>>16)]^S3[(unsigned __int8)(e>>8)]^S4[(unsigned __int8)f]^k11;
	d=S1[h>>24]^S2[(unsigned __int8)(e>>16)]^S3[(unsigned __int8)(f>>8)]^S4[(unsigned __int8)g]^k12;
	//第三圈
	e=S1[a>>24]^S2[(unsigned __int8)(b>>16)]^S3[(unsigned __int8)(c>>8)]^S4[(unsigned __int8)d]^k13;
	f=S1[b>>24]^S2[(unsigned __int8)(c>>16)]^S3[(unsigned __int8)(d>>8)]^S4[(unsigned __int8)a]^k14;
	g=S1[c>>24]^S2[(unsigned __int8)(d>>16)]^S3[(unsigned __int8)(a>>8)]^S4[(unsigned __int8)b]^k15;
	h=S1[d>>24]^S2[(unsigned __int8)(a>>16)]^S3[(unsigned __int8)(b>>8)]^S4[(unsigned __int8)c]^k16;
	//第四圈
	a=S1[e>>24]^S2[(unsigned __int8)(f>>16)]^S3[(unsigned __int8)(g>>8)]^S4[(unsigned __int8)h]^k17;
	b=S1[f>>24]^S2[(unsigned __int8)(g>>16)]^S3[(unsigned __int8)(h>>8)]^S4[(unsigned __int8)e]^k18;
	c=S1[g>>24]^S2[(unsigned __int8)(h>>16)]^S3[(unsigned __int8)(e>>8)]^S4[(unsigned __int8)f]^k19;
	d=S1[h>>24]^S2[(unsigned __int8)(e>>16)]^S3[(unsigned __int8)(f>>8)]^S4[(unsigned __int8)g]^k20;
	//第五圈
	e=S1[a>>24]^S2[(unsigned __int8)(b>>16)]^S3[(unsigned __int8)(c>>8)]^S4[(unsigned __int8)d]^k21;
	f=S1[b>>24]^S2[(unsigned __int8)(c>>16)]^S3[(unsigned __int8)(d>>8)]^S4[(unsigned __int8)a]^k22;
	g=S1[c>>24]^S2[(unsigned __int8)(d>>16)]^S3[(unsigned __int8)(a>>8)]^S4[(unsigned __int8)b]^k23;
	h=S1[d>>24]^S2[(unsigned __int8)(a>>16)]^S3[(unsigned __int8)(b>>8)]^S4[(unsigned __int8)c]^k24;
	//第六圈
	a=S1[e>>24]^S2[(unsigned __int8)(f>>16)]^S3[(unsigned __int8)(g>>8)]^S4[(unsigned __int8)h]^k25;
	b=S1[f>>24]^S2[(unsigned __int8)(g>>16)]^S3[(unsigned __int8)(h>>8)]^S4[(unsigned __int8)e]^k26;
	c=S1[g>>24]^S2[(unsigned __int8)(h>>16)]^S3[(unsigned __int8)(e>>8)]^S4[(unsigned __int8)f]^k27;
	d=S1[h>>24]^S2[(unsigned __int8)(e>>16)]^S3[(unsigned __int8)(f>>8)]^S4[(unsigned __int8)g]^k28;
	//第七圈
	e=S1[a>>24]^S2[(unsigned __int8)(b>>16)]^S3[(unsigned __int8)(c>>8)]^S4[(unsigned __int8)d]^k29;
	f=S1[b>>24]^S2[(unsigned __int8)(c>>16)]^S3[(unsigned __int8)(d>>8)]^S4[(unsigned __int8)a]^k30;
	g=S1[c>>24]^S2[(unsigned __int8)(d>>16)]^S3[(unsigned __int8)(a>>8)]^S4[(unsigned __int8)b]^k31;
	h=S1[d>>24]^S2[(unsigned __int8)(a>>16)]^S3[(unsigned __int8)(b>>8)]^S4[(unsigned __int8)c]^k32;
	//第八圈
	a=S1[e>>24]^S2[(unsigned __int8)(f>>16)]^S3[(unsigned __int8)(g>>8)]^S4[(unsigned __int8)h]^k33;
	b=S1[f>>24]^S2[(unsigned __int8)(g>>16)]^S3[(unsigned __int8)(h>>8)]^S4[(unsigned __int8)e]^k34;
	c=S1[g>>24]^S2[(unsigned __int8)(h>>16)]^S3[(unsigned __int8)(e>>8)]^S4[(unsigned __int8)f]^k35;
	d=S1[h>>24]^S2[(unsigned __int8)(e>>16)]^S3[(unsigned __int8)(f>>8)]^S4[(unsigned __int8)g]^k36;
	//第九圈
	e=S1[a>>24]^S2[(unsigned __int8)(b>>16)]^S3[(unsigned __int8)(c>>8)]^S4[(unsigned __int8)d]^k37;
	f=S1[b>>24]^S2[(unsigned __int8)(c>>16)]^S3[(unsigned __int8)(d>>8)]^S4[(unsigned __int8)a]^k38;
	g=S1[c>>24]^S2[(unsigned __int8)(d>>16)]^S3[(unsigned __int8)(a>>8)]^S4[(unsigned __int8)b]^k39;
	h=S1[d>>24]^S2[(unsigned __int8)(a>>16)]^S3[(unsigned __int8)(b>>8)]^S4[(unsigned __int8)c]^k40;
	//第十圈
	a=(S[e>>24]<<24)^(S[(unsigned __int8)(f>>16)]<<16)^(S[(unsigned __int8)(g>>8)]<<8)^S[(unsigned __int8)h]^k41;
	b=(S[f>>24]<<24)^(S[(unsigned __int8)(g>>16)]<<16)^(S[(unsigned __int8)(h>>8)]<<8)^S[(unsigned __int8)e]^k42;
	c=(S[g>>24]<<24)^(S[(unsigned __int8)(h>>16)]<<16)^(S[(unsigned __int8)(e>>8)]<<8)^S[(unsigned __int8)f]^k43;
	d=(S[h>>24]<<24)^(S[(unsigned __int8)(e>>16)]<<16)^(S[(unsigned __int8)(f>>8)]<<8)^S[(unsigned __int8)g]^k44; 
		}
	end=clock();
	if(p>=1)
	{
	//printf("负载运算时间%f秒\n",(double)(end-start)/CLOCKS_PER_SEC);
	printf("最终加密速度%fM/s  \n",(i*128/1024/1024)/((double)(end-start)/CLOCKS_PER_SEC));
	}
	else
	printf("加密结果为:\n");  
//	printf("%2x %2x %2x %2x\n%2x %2x %2x %2x\n%2x %2x %2x %2x\n%2x %2x %2x %2x\n",e>>24,f>>24,g>>24,h>>24,e>>16&0xff,f>>16&0xff,g>>16&0xff,h>>16&0xff,e>>8&0xff,f>>8&0xff,g>>8&0xff,h>>8&0xff,e&0xff,f&0xff,g&0xff,h&0xff);
	printf("\n%2x %2x %2x %2x\n%2x %2x %2x %2x\n%2x %2x %2x %2x\n%2x %2x %2x %2x\n",a>>24,b>>24,c>>24,d>>24,a>>16&0xff,b>>16&0xff,c>>16&0xff,d>>16&0xff,a>>8&0xff,b>>8&0xff,c>>8&0xff,d>>8&0xff,a&0xff,b&0xff,c&0xff,d&0xff);
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值