Chinaunix首页 | 论坛 | 博客
  • 博客访问: 542204
  • 博文数量: 104
  • 博客积分: 4131
  • 博客等级: 上校
  • 技术积分: 1137
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-31 15:05
文章分类

全部博文(104)

文章存档

2011年(13)

2010年(23)

2009年(68)

我的朋友

分类: WINDOWS

2010-06-04 15:53:42

AES.h文件:
#ifndef AES_H
#define AES_H
#include
#include
#include
#define OK 1
#define ERROR -1
#define STATUS int
#define plainfile  "C:/TEMP/cd1.rmvb"
#define encryptfile "C:/TEMP/cd2.rmvb"
#define decryptfile "C:/TEMP/cd3.rmvb"
#define RAM_LEN (1024)
#define bytes2word(b0,b1,b2,b3) ((b0<<24)|(b1<<16)|(b2<<8)|(b3))
typedef unsigned char  u1byte;
typedef unsigned long  u4byte;
#define LARGE_TABLES
u1byte  pow_tab[256];
u1byte  log_tab[256];
u1byte  sbx_tab[256];
u1byte  isb_tab[256];
u4byte  rco_tab[ 10];
u4byte  ft_tab[4][256];
u4byte  it_tab[4][256];
#ifdef  LARGE_TABLES
  u4byte  fl_tab[4][256];
  u4byte  il_tab[4][256];
#endif
u4byte  k_len;
u4byte  e_key[60];
u4byte  d_key[60];
#define ff_mult(a,b)    (a && b ? pow_tab[(log_tab[a] + log_tab[b]) % 255] : 0)
#define byte(x,n)       ((u1byte)((x)>>(8*n)))
#define f_rn(bo, bi, n, k)                          \
    bo[n] =  ft_tab[0][byte(bi[n],0)] ^             \
             ft_tab[1][byte(bi[(n + 1) & 3],1)] ^   \
             ft_tab[2][byte(bi[(n + 2) & 3],2)] ^   \
             ft_tab[3][byte(bi[(n + 3) & 3],3)] ^ *(k + n)
#define i_rn(bo, bi, n, k)                          \
    bo[n] =  it_tab[0][byte(bi[n],0)] ^             \
             it_tab[1][byte(bi[(n + 3) & 3],1)] ^   \
             it_tab[2][byte(bi[(n + 2) & 3],2)] ^   \
             it_tab[3][byte(bi[(n + 1) & 3],3)] ^ *(k + n)
#define rotr(x,n)  (((x) >> ((int)(n))) | ((x) << (32 -(int)(n))))
#define rotl(x,n)  (((x) << ((int)(n))) | ((x) >> (32 -(int)(n))))

#ifdef LARGE_TABLES
#define ls_box(x)                \
    ( fl_tab[0][byte(x, 0)] ^    \
      fl_tab[1][byte(x, 1)] ^    \
      fl_tab[2][byte(x, 2)] ^    \
      fl_tab[3][byte(x, 3)] )
#define f_rl(bo, bi, n, k)                          \
    bo[n] =  fl_tab[0][byte(bi[n],0)] ^             \
             fl_tab[1][byte(bi[(n + 1) & 3],1)] ^   \
             fl_tab[2][byte(bi[(n + 2) & 3],2)] ^   \
             fl_tab[3][byte(bi[(n + 3) & 3],3)] ^ *(k + n)
#define i_rl(bo, bi, n, k)                          \
    bo[n] =  il_tab[0][byte(bi[n],0)] ^             \
             il_tab[1][byte(bi[(n + 3) & 3],1)] ^   \
             il_tab[2][byte(bi[(n + 2) & 3],2)] ^   \
             il_tab[3][byte(bi[(n + 1) & 3],3)] ^ *(k + n)
#else
#define ls_box(x)                            \
    ((u4byte)sbx_tab[byte(x, 0)] <<  0) ^    \
    ((u4byte)sbx_tab[byte(x, 1)] <<  8) ^    \
    ((u4byte)sbx_tab[byte(x, 2)] << 16) ^    \
    ((u4byte)sbx_tab[byte(x, 3)] << 24)
#define f_rl(bo, bi, n, k)                                      \
    bo[n] = (u4byte)sbx_tab[byte(bi[n],0)] ^                    \
        rotl(((u4byte)sbx_tab[byte(bi[(n + 1) & 3],1)]),  8) ^  \
        rotl(((u4byte)sbx_tab[byte(bi[(n + 2) & 3],2)]), 16) ^  \
        rotl(((u4byte)sbx_tab[byte(bi[(n + 3) & 3],3)]), 24) ^ *(k + n)
#define i_rl(bo, bi, n, k)                                      \
    bo[n] = (u4byte)isb_tab[byte(bi[n],0)] ^                    \
        rotl(((u4byte)isb_tab[byte(bi[(n + 3) & 3],1)]),  8) ^  \
        rotl(((u4byte)isb_tab[byte(bi[(n + 2) & 3],2)]), 16) ^  \
        rotl(((u4byte)isb_tab[byte(bi[(n + 1) & 3],3)]), 24) ^ *(k + n)
#endif
#define star_x(x) (((x) & 0x7f7f7f7f) << 1) ^ ((((x) & 0x80808080) >> 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)

#define loop4(i)                                    \
{   t = ls_box(rotr(t,  8)) ^ rco_tab[i];           \
    t ^= e_key[4 * i];     e_key[4 * i + 4] = t;    \
    t ^= e_key[4 * i + 1]; e_key[4 * i + 5] = t;    \
    t ^= e_key[4 * i + 2]; e_key[4 * i + 6] = t;    \
    t ^= e_key[4 * i + 3]; e_key[4 * i + 7] = t;    \
}
#define loop6(i)                                    \
{   t = ls_box(rotr(t,  8)) ^ rco_tab[i];           \
    t ^= e_key[6 * i];     e_key[6 * i + 6] = t;    \
    t ^= e_key[6 * i + 1]; e_key[6 * i + 7] = t;    \
    t ^= e_key[6 * i + 2]; e_key[6 * i + 8] = t;    \
    t ^= e_key[6 * i + 3]; e_key[6 * i + 9] = t;    \
    t ^= e_key[6 * i + 4]; e_key[6 * i + 10] = t;   \
    t ^= e_key[6 * i + 5]; e_key[6 * i + 11] = t;   \
}
#define loop8(i)                                    \
{   t = ls_box(rotr(t,  8)) ^ rco_tab[i];           \
    t ^= e_key[8 * i];     e_key[8 * i + 8] = t;    \
    t ^= e_key[8 * i + 1]; e_key[8 * i + 9] = t;    \
    t ^= e_key[8 * i + 2]; e_key[8 * i + 10] = t;   \
    t ^= e_key[8 * i + 3]; e_key[8 * i + 11] = t;   \
    t  = e_key[8 * i + 4] ^ ls_box(t);              \
    e_key[8 * i + 12] = t;                          \
    t ^= e_key[8 * i + 5]; e_key[8 * i + 13] = t;   \
    t ^= e_key[8 * i + 6]; e_key[8 * i + 14] = t;   \
    t ^= e_key[8 * i + 7]; e_key[8 * i + 15] = t;   \
}
#define f_nround(bo, bi, k) \
    f_rn(bo, bi, 0, k);     \
    f_rn(bo, bi, 1, k);     \
    f_rn(bo, bi, 2, k);     \
    f_rn(bo, bi, 3, k);     \
    k += 4
#define f_lround(bo, bi, k) \
    f_rl(bo, bi, 0, k);     \
    f_rl(bo, bi, 1, k);     \
    f_rl(bo, bi, 2, k);     \
    f_rl(bo, bi, 3, k)
#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)
long get_file_size(char *filename);
void gen_tabs(void);
void set_key(const u4byte in_key[], const u4byte key_len);
void decrypt(const u4byte in_blk[4], u4byte out_blk[4],u4byte  b0[4],u4byte  b1[4]);
void encrypt(const u4byte in_blk[4], u4byte out_blk[4],u4byte  b0[4],u4byte  b1[4]);
void word2bytes(long word,unsigned char* text);
void encryptstart(unsigned char* in, unsigned char* out,int len,u4byte in_blk[4],u4byte out_blk[4],u4byte  b0[4],u4byte  b1[4]);
void decryptstart(unsigned char* in, unsigned char* out,int len,u4byte in_blk[4],u4byte out_blk[4],u4byte  b0[4],u4byte  b1[4]);
void encryptlast(unsigned char* in, unsigned char* out,int len,u4byte in_blk[4],u4byte out_blk[4],u4byte  b0[4],u4byte  b1[4]);
STATUS aesencrypt(char* infile, char* outfile);
STATUS aesdecrypt(char* infile, char* outfile);
#endif
AES.c文件:
#include "AES.h"
u4byte  tab_gen = 0;
long get_file_size(char *filename)
{
 struct stat f_stat;
 if(stat(filename,&f_stat)==-1)
  return -1;
 return f_stat.st_size;
}
void gen_tabs(void)
{  
 u4byte  i, t;
    u1byte  p, q;
    for(i = 0,p = 1; i < 256; ++i)
    {
        pow_tab[i] = (u1byte)p; log_tab[p] = (u1byte)i;
        p = p ^ (p << 1) ^ (p & 0x80 ? 0x01b : 0);
    }
    log_tab[1] = 0; p = 1;
    for(i = 0; i < 10; ++i)
    {
        rco_tab[i] = p;
        p = (p << 1) ^ (p & 0x80 ? 0x1b : 0);
    }
    for(i = 0; i < 256; ++i)
    {  
        p = (i ? pow_tab[255 - log_tab[i]] : 0); q = p;
        q = (q >> 7) | (q << 1); p ^= q;
        q = (q >> 7) | (q << 1); p ^= q;
        q = (q >> 7) | (q << 1); p ^= q;
        q = (q >> 7) | (q << 1); p ^= q ^ 0x63;
        sbx_tab[i] = p; isb_tab[p] = (u1byte)i;
    }
    for(i = 0; i < 256; ++i)
    {
        p = sbx_tab[i];
#ifdef  LARGE_TABLES       
       
        t = p; fl_tab[0][i] = t;
        fl_tab[1][i] = rotl(t,  8);
        fl_tab[2][i] = rotl(t, 16);
        fl_tab[3][i] = rotl(t, 24);
#endif
        t = ((u4byte)ff_mult(2, p)) |
            ((u4byte)p <<  8) |
            ((u4byte)p << 16) |
            ((u4byte)ff_mult(3, p) << 24);
       
        ft_tab[0][i] = t;
        ft_tab[1][i] = rotl(t,  8);
        ft_tab[2][i] = rotl(t, 16);
        ft_tab[3][i] = rotl(t, 24);
        p = isb_tab[i];
#ifdef  LARGE_TABLES       
       
        t = p; il_tab[0][i] = t;
        il_tab[1][i] = rotl(t,  8);
        il_tab[2][i] = rotl(t, 16);
        il_tab[3][i] = 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_tab[0][i] = t;
        it_tab[1][i] = rotl(t,  8);
        it_tab[2][i] = rotl(t, 16);
        it_tab[3][i] = rotl(t, 24);
    }
    tab_gen = 1;
}
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_key[0] = in_key[0];
 e_key[1] = in_key[1];
    e_key[2] = in_key[2];
 e_key[3] = in_key[3];
    switch(k_len)
    {
        case 4: t = e_key[3];
                for(i = 0; i < 10; ++i)
                    loop4(i);
                break;
        case 6: e_key[4] = in_key[4]; t = e_key[5] = in_key[5];
                for(i = 0; i < 8; ++i)
                    loop6(i);
                break;
        case 8: e_key[4] = in_key[4]; e_key[5] = in_key[5];
                e_key[6] = in_key[6]; t = e_key[7] = in_key[7];
                for(i = 0; i < 7; ++i)
                    loop8(i);
                break;
    }
    d_key[0] = e_key[0]; d_key[1] = e_key[1];
    d_key[2] = e_key[2]; d_key[3] = e_key[3];
    for(i = 4; i < 4 * k_len + 24; ++i)
    {
        imix_col(d_key[i], e_key[i]);
    }
   
}
void encrypt(const u4byte in_blk[4], u4byte out_blk[4],u4byte  b0[4],u4byte  b1[4])
{  
 u4byte *kp;
    b0[0] = in_blk[0] ^ e_key[0]; b0[1] = in_blk[1] ^ e_key[1];
    b0[2] = in_blk[2] ^ e_key[2]; b0[3] = in_blk[3] ^ e_key[3];
    kp = e_key + 4;
    if(k_len > 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_blk[0] = b0[0]; out_blk[1] = b0[1];
    out_blk[2] = b0[2]; out_blk[3] = b0[3];
}
void decrypt(const u4byte in_blk[4], u4byte out_blk[4],u4byte  b0[4],u4byte  b1[4])
{  
 u4byte *kp;
    b0[0] = in_blk[0] ^ e_key[4 * k_len + 24];
 b0[1] = in_blk[1] ^ e_key[4 * k_len + 25];
    b0[2] = in_blk[2] ^ e_key[4 * k_len + 26];
 b0[3] = in_blk[3] ^ e_key[4 * 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);
    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_lround(b0, b1, kp);
    out_blk[0] = b0[0]; out_blk[1] = b0[1];
    out_blk[2] = b0[2]; out_blk[3] = b0[3];
}
void word2bytes(long word,unsigned char* text)
{
 *text=(unsigned char)((word&0xff000000)>>24);
 *(text+1)=(unsigned char)((word&0x00ff0000)>>16);
 *(text+2)=(unsigned char)((word&0x0000ff00)>>8);
 *(text+3)=(unsigned char)(word&0x000000ff);
}
void encryptstart(unsigned char* in, unsigned char* out,int len,u4byte in_blk[4],u4byte out_blk[4],u4byte  b0[4],u4byte  b1[4])
{
 int offset1=0;
 int offset2=0;
 int i,j;
 for(i=0;i<(len/16);i++)
 {
  for(j=0;j<4;j++)
  {
   in_blk[j]=bytes2word(*(in+offset1+0+4*j),*(in+offset1+1+4*j),*(in+offset1+2+4*j),*(in+offset1+3+4*j));
  }
  encrypt(in_blk, out_blk,b0,b1);
  for(j=0;j<4;j++)
  {
   word2bytes(out_blk[j],out+offset2);
   offset2+=4;
  }
  offset1+=16;
 }
}
void decryptstart(unsigned char* in, unsigned char* out,int len,u4byte in_blk[4],u4byte out_blk[4],u4byte  b0[4],u4byte  b1[4])
{
 int offset1=0;
 int offset2=0;
 int i,j;
 for(i=0;i<(len/16);i++)
 {
  for(j=0;j<4;j++)
  {
   in_blk[j]=bytes2word(*(in+offset1+0+4*j),*(in+offset1+1+4*j),*(in+offset1+2+4*j),*(in+offset1+3+4*j));
  }
  decrypt(in_blk, out_blk,b0,b1);
  for(j=0;j<4;j++)
  {
   word2bytes(out_blk[j],out+offset2);
   offset2+=4;
  }
  offset1+=16;
 }
}
void encryptlast(unsigned char* in, unsigned char* out,int len,u4byte in_blk[4],u4byte out_blk[4],u4byte  b0[4],u4byte  b1[4])
{
 int offset1=0;
 int offset2=0;
 int i,j,k;
 for(i=0;i<((len+16)/16)-1;i++)
 {
  for(k=0;k<4;k++)
  {
   in_blk[k]=bytes2word(*(in+offset1+0+4*k),*(in+offset1+1+4*k),*(in+offset1+2+4*k),*(in+offset1+3+4*k));
  }
  encrypt(in_blk, out_blk,b0,b1);
  for(j=0;j<4;j++)
  {
   word2bytes(out_blk[j],out+offset2);
   offset2+=4;
  }
  offset1+=16;
 }
 if(len%16)
 {
  for(i=0;i<(len-len/16*16)/4;i++)
  {
   in_blk[i]=bytes2word(*(in+offset1+0+4*i),*(in+offset1+1+4*i),*(in+offset1+2+4*i),*(in+offset1+3+4*i));
  }
  j=i;
  for(;i<4;i++)
   in_blk[i]=0x00000000;
  for(k=0;k  {
   in_blk[j]=in_blk[j]|(*(in+offset1+4*j+k)<<((3-k)*8));
  }  
  encrypt(in_blk, out_blk,b0,b1);
  for(j=0;j<4;j++)
  {
   word2bytes(out_blk[j],out+offset2);
   offset2+=4;
  }
 }
}
STATUS aesencrypt(char* infile, char* outfile)
{
 FILE* infd,*outfd;
 int size;
 u4byte in_blk[4],out_blk[4],b0[4],b1[4];
 long filelen=get_file_size(infile);
 unsigned char* inbuf;
 unsigned char* outbuf;
 printf("filelen = %d\n",filelen);
 if((infd=fopen(infile,"rb+"))==NULL)
  return (ERROR);
 if((outfd=fopen(outfile,"wb+"))==NULL)
  return (ERROR);
 inbuf=(unsigned char *)malloc(RAM_LEN+16);
 outbuf=(unsigned char *)malloc(RAM_LEN+16);
 while(filelen>=RAM_LEN)
 {
  if(fread(inbuf,RAM_LEN,1,infd)==ERROR)
  {
   fclose(infd);
   return (ERROR);
  }
  encryptstart(inbuf, outbuf, RAM_LEN,in_blk,out_blk,b0,b1);
  if(fwrite(outbuf,RAM_LEN,1,outfd)==ERROR)
  {
   fclose(outfd);
   return (ERROR);
  }
  filelen=filelen-RAM_LEN;
 }
 size=filelen;
 if(filelen {
  if(fread(inbuf,filelen,1,infd)==ERROR)
  {
   fclose(infd);
   return (ERROR);
  }
  encryptlast(inbuf, outbuf, filelen,in_blk,out_blk,b0,b1);
  filelen=(filelen%16!=0)?(filelen+16-(filelen%16)):filelen;
  if(fwrite(outbuf,filelen,1,outfd)==ERROR)
  {
   fclose(outfd);
   return (ERROR);
  }
  *(inbuf+15)=16-(size%16);
  encryptstart(inbuf, outbuf, 16,in_blk,out_blk,b0,b1);
  if(fwrite(outbuf,16,1,outfd)==ERROR)
  {
   fclose(outfd);
   return (ERROR);
  }
 }
 fclose(infd);
 fclose(outfd);
 free(inbuf);
 free(outbuf);
 return OK;
}
STATUS aesdecrypt(char* infile, char* outfile)
{
 FILE* infd,*outfd;
 int offset=0;
 u4byte in_blk[4],out_blk[4],b0[4],b1[4];
 unsigned char end[16];
 long filelen=get_file_size(infile);
 unsigned char* inbuf;
 unsigned char* outbuf;
 printf("filelen = %d\n",filelen);
 if((infd=fopen(infile,"rb+"))==NULL)
  return (ERROR);
 if((outfd=fopen(outfile,"wb+"))==NULL)
  return (ERROR);
 inbuf=(unsigned char *)malloc(RAM_LEN+16);
 outbuf=(unsigned char *)malloc(RAM_LEN+16);
 
 while(filelen>RAM_LEN+16)
 {
  if(fread(inbuf,RAM_LEN,1,infd)==ERROR)
  {
   fclose(infd);
   return (ERROR);
  }
  decryptstart(inbuf, outbuf, RAM_LEN,in_blk,out_blk,b0,b1);
  if(fwrite(outbuf,RAM_LEN,1,outfd)==ERROR)
  {
   fclose(outfd);
   return (ERROR);
  }
  filelen=filelen-RAM_LEN;
 }
 
 if(filelen>RAM_LEN)
 {
  if(fread(inbuf,RAM_LEN,1,infd)==ERROR)
  {
   fclose(infd);
   return (ERROR);
  }
  decryptstart(inbuf, outbuf, RAM_LEN,in_blk,out_blk,b0,b1);
  if(fread(inbuf,16,1,infd)==ERROR)
  {
   fclose(infd);
   return (ERROR);
  }
  decryptstart(inbuf, end, 16,in_blk,out_blk,b0,b1);
  if(fwrite(outbuf,RAM_LEN-*(end+15),1,outfd)==ERROR)
  {
   fclose(outfd);
   return (ERROR);
  }
 }
 else
 {
  if(fread(inbuf,filelen,1,infd)==ERROR)
  {
   fclose(infd);
   return (ERROR);
  }
  decryptstart(inbuf, outbuf, filelen,in_blk,out_blk,b0,b1);
  if(fwrite(outbuf,filelen-16-*(outbuf+filelen-1),1,outfd)==ERROR)
  {
   fclose(outfd);
   return (ERROR);
  }
 }
 fclose(infd);
 fclose(outfd);
 free(inbuf);
 free(outbuf);
 return OK;
}
aestest.c测试文件:
#include "AES.h"
void main()
{
 u4byte in_key[4] = {0x11111111,0x22222222,0x33333333,0x44444444};
 set_key(in_key, 128);
 aesencrypt(plainfile, encryptfile);
 aesdecrypt(encryptfile, decryptfile);
}
阅读(3213) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~