AES C-代码.doc_第1页
AES C-代码.doc_第2页
AES C-代码.doc_第3页
AES C-代码.doc_第4页
AES C-代码.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/* This is an implementation of the RIJNDAEL cryptosystem for 128 bit plaintext block. This programme only gives the instance of 128 bit key. You can modify a little details to meet your need for 192 or 256 bit key input */#include stdio.htypedef unsigned char u1byte; /* an 8 bit unsigned character type */typedef unsigned long u4byte; /* a 32 bit unsigned integer type */#define LARGE_TABLESu1byte pow_tab256;u1byte log_tab256;u1byte sbx_tab256;u1byte isb_tab256;u4byte rco_tab 10;u4byte ft_tab4256;u4byte it_tab4256;#ifdef LARGE_TABLES u4byte fl_tab4256; u4byte il_tab4256;#endifu4byte tab_gen = 0;u4byte k_len;u4byte e_key60;u4byte d_key60;#define ff_mult(a,b) (a & b ? pow_tab(log_taba + log_tabb) % 255 : 0)#define byte(x,n) (u1byte)(x) (8 * n)#define f_rn(bo, bi, n, k) bon = ft_tab0byte(bin,0) ft_tab1byte(bi(n + 1) & 3,1) ft_tab2byte(bi(n + 2) & 3,2) ft_tab3byte(bi(n + 3) & 3,3) *(k + n)#define i_rn(bo, bi, n, k) bon = it_tab0byte(bin,0) it_tab1byte(bi(n + 3) & 3,1) it_tab2byte(bi(n + 2) & 3,2) it_tab3byte(bi(n + 1) & 3,3) *(k + n)#define rotr(x,n) (x) (int)(n) | (x) (32 - (int)(n)#define rotl(x,n) (x) (32 - (int)(n)#ifdef LARGE_TABLES#define ls_box(x) ( fl_tab0byte(x, 0) fl_tab1byte(x, 1) fl_tab2byte(x, 2) fl_tab3byte(x, 3) )#define f_rl(bo, bi, n, k) bon = fl_tab0byte(bin,0) fl_tab1byte(bi(n + 1) & 3,1) fl_tab2byte(bi(n + 2) & 3,2) fl_tab3byte(bi(n + 3) & 3,3) *(k + n)#define i_rl(bo, bi, n, k) bon = il_tab0byte(bin,0) il_tab1byte(bi(n + 3) & 3,1) il_tab2byte(bi(n + 2) & 3,2) il_tab3byte(bi(n + 1) & 3,3) *(k + n)#else#define ls_box(x) (u4byte)sbx_tabbyte(x, 0) 0) (u4byte)sbx_tabbyte(x, 1) 8) (u4byte)sbx_tabbyte(x, 2) 16) (u4byte)sbx_tabbyte(x, 3) 24)#define f_rl(bo, bi, n, k) bon = (u4byte)sbx_tabbyte(bin,0) rotl(u4byte)sbx_tabbyte(bi(n + 1) & 3,1), 8) rotl(u4byte)sbx_tabbyte(bi(n + 2) & 3,2), 16) rotl(u4byte)sbx_tabbyte(bi(n + 3) & 3,3), 24) *(k + n)#define i_rl(bo, bi, n, k) bon = (u4byte)isb_tabbyte(bin,0) rotl(u4byte)isb_tabbyte(bi(n + 3) & 3,1), 8) rotl(u4byte)isb_tabbyte(bi(n + 2) & 3,2), 16) rotl(u4byte)isb_tabbyte(bi(n + 1) & 3,3), 24) *(k + n)#endifvoid gen_tabs(void) u4byte i, t; u1byte p, q; /* log and power tables for GF(2*8) finite field with */ /* 0x11b as modular polynomial - the simplest prmitive */ /* root is 0x11, used here to generate the tables */ for(i = 0,p = 1; i 256; +i) pow_tabi = (u1byte)p; log_tabp = (u1byte)i; p = p (p 1) (p & 0x80 ? 0x01b : 0); log_tab1 = 0; p = 1; for(i = 0; i 10; +i) rco_tabi = p; p = (p 1) (p & 0x80 ? 0x1b : 0); /* note that the affine byte transformation matrix in */ /* rijndael specification is in big endian format with */ /* bit 0 as the most significant bit. In the remainder */ /* of the specification the bits are numbered from the */ /* least significant end of a byte. */ for(i = 0; i 7) | (q 7) | (q 7) | (q 7) | (q 1); p = q 0x63; sbx_tabi = (u1byte)p; isb_tabp = (u1byte)i; for(i = 0; i 256; +i) p = sbx_tabi;#ifdef LARGE_TABLES t = p; fl_tab0i = t; fl_tab1i = rotl(t, 8); fl_tab2i = rotl(t, 16); fl_tab3i = rotl(t, 24);#endif t = (u4byte)ff_mult(2, p) | (u4byte)p 8) | (u4byte)p 16) | (u4byte)ff_mult(3, p) 24); ft_tab0i = t; ft_tab1i = rotl(t, 8); ft_tab2i = rotl(t, 16); ft_tab3i = rotl(t, 24); p = isb_tabi; #ifdef LARGE_TABLES t = p; il_tab0i = t; il_tab1i = rotl(t, 8); il_tab2i = rotl(t, 16); il_tab3i = rotl(t, 24);#endif t = (u4byte)ff_mult(14, p) | (u4byte)ff_mult( 9, p) 8) | (u4byte)ff_mult(13, p) 16) | (u4byte)ff_mult(11, p) 24); it_tab0i = t; it_tab1i = rotl(t, 8); it_tab2i = rotl(t, 16); it_tab3i = rotl(t, 24); tab_gen = 1;#define star_x(x) (x) & 0x7f7f7f7f) 7) * 0x1b)#define imix_col(y,x) u = star_x(x); v = star_x(u); w = star_x(v); t = w (x); (y) = u v w; (y) = rotr(u t, 8) rotr(v t, 16) rotr(t,24)/* initialise the key schedule from the user supplied key */#define loop4(i) t = ls_box(rotr(t, 8) rco_tabi; t = e_key4 * i; e_key4 * i + 4 = t; t = e_key4 * i + 1; e_key4 * i + 5 = t; t = e_key4 * i + 2; e_key4 * i + 6 = t; t = e_key4 * i + 3; e_key4 * i + 7 = t; #define loop6(i) t = ls_box(rotr(t, 8) rco_tabi; t = e_key6 * i; e_key6 * i + 6 = t; t = e_key6 * i + 1; e_key6 * i + 7 = t; t = e_key6 * i + 2; e_key6 * i + 8 = t; t = e_key6 * i + 3; e_key6 * i + 9 = t; t = e_key6 * i + 4; e_key6 * i + 10 = t; t = e_key6 * i + 5; e_key6 * i + 11 = t; #define loop8(i) t = ls_box(rotr(t, 8) rco_tabi; t = e_key8 * i; e_key8 * i + 8 = t; t = e_key8 * i + 1; e_key8 * i + 9 = t; t = e_key8 * i + 2; e_key8 * i + 10 = t; t = e_key8 * i + 3; e_key8 * i + 11 = t; t = e_key8 * i + 4 ls_box(t); e_key8 * i + 12 = t; t = e_key8 * i + 5; e_key8 * i + 13 = t; t = e_key8 * i + 6; e_key8 * i + 14 = t; t = e_key8 * i + 7; e_key8 * i + 15 = t; void set_key(const u4byte in_key, const u4byte key_len) u4byte i, t, u, v, w; if(!tab_gen) gen_tabs(); k_len = (key_len + 31) / 32; e_key0 = in_key0; e_key1 = in_key1; e_key2 = in_key2; e_key3 = in_key3; switch(k_len) case 4: t = e_key3; for(i = 0; i 10; +i) loop4(i); break; case 6: e_key4 = in_key4; t = e_key5 = in_key5; for(i = 0; i 8; +i) loop6(i); break; case 8: e_key4 = in_key4; e_key5 = in_key5; e_key6 = in_key6; t = e_key7 = in_key7; for(i = 0; i 7; +i) loop8(i); break; d_key0 = e_key0; d_key1 = e_key1; d_key2 = e_key2; d_key3 = e_key3; for(i = 4; i 6) f_nround(b1, b0, kp); f_nround(b0, b1, kp); if(k_len 4) f_nround(b1, b0, kp); f_nround(b0, b1, kp); f_nround(b1, b0, kp); f_nround(b0, b1, kp); f_nround(b1, b0, kp); f_nround(b0, b1, kp); f_nround(b1, b0, kp); f_nround(b0, b1, kp); f_nround(b1, b0, kp); f_nround(b0, b1, kp); f_nround(b1, b0, kp); f_lround(b0, b1, kp); out_blk0 = b00; out_blk1 = b01; out_blk2 = b02; out_blk3 = b03;/* decrypt a block of text */#define i_nround(bo, bi, k) i_rn(bo, bi, 0, k); i_rn(bo, bi, 1, k); i_rn(bo, bi, 2, k); i_rn(bo, bi, 3, k); k -= 4#define i_lround(bo, bi, k) i_rl(bo, bi, 0, k); i_rl(bo, bi, 1, k); i_rl(bo, bi, 2, k); i_rl(bo, bi, 3, k)void decrypt(const u4byte in_blk4, u4byte out_blk4) u4byte b04, b14, *kp; b00 = in_blk0 e_key4 * k_len + 24; b01 = in_blk1 e_key4 * k_len + 25; b02 = in_blk2 e_key4 * k_len + 26; b03 = in_blk3 e_key4 * k_len + 27; kp = d_key + 4 * (k_len + 5); if(k_len 6) i_nround(b1, b0, kp); i_nround(b0, b1, kp); if(k_len 4) i_nround(b1, b0, kp); i_nround(b0, b1, kp); i_nround(b1, b0, kp); i_nround(b0, b1, kp); i_nround(b1, b0, kp); i_nround(b0, b1, kp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论