aesc语言
1. 求纯C语言的加密解密算法编码(AES、DES。。。。。。)
请选择参考资料的网页
BeeCrypt 是一个包含高度优化的C语言加密库,包括MD5,SHA-等多种加密解密算法,该库是通用函数库,并与任何版权无关。符合GNU开放源码要求
点击下列连接可以直接下载源代码
http://prdownloads.sourceforge.net/beecrypt/beecrypt-4.1.2.tar.gz?download
2. 谁知道哪里有AES算法加密,解密c++/C语言代码
推荐用java,因为有现成的class给你用。。。如果用C++有好多东西需要自己写。可能java里面20行能搞定加密和解密的所有步骤,如果C++自己把所有算法加上各种数据类型转换之类的,无法估计多多少倍的代码了。前提还是你已经会写如果做密钥。
3. 求AES算法加密C语言完整程序
恰好我有。能运行的,C语言的。
#include <string.h>
#include "aes.h"
#include "commonage.h"
#define byte unsigned char 
#define BPOLY 0x1b //!< Lower 8 bits of (x^8+x^4+x^3+x+1), ie. (x^4+x^3+x+1).
#define BLOCKSIZE 16 //!< Block size in number of bytes.
#define KEYBITS 128 //!< Use AES128.
#define ROUNDS 10 //!< Number of rounds.
#define KEYLENGTH 16 //!< Key length in number of bytes.
byte xdata block1[ 256 ]; //!< Workspace 1.
byte xdata block2[ 256 ]; //!< Worksapce 2.
byte xdata * powTbl; //!< Final location of exponentiation lookup table.
byte xdata * logTbl; //!< Final location of logarithm lookup table.
byte xdata * sBox; //!< Final location of s-box.
byte xdata * sBoxInv; //!< Final location of inverse s-box.
byte xdata * expandedKey; //!< Final location of expanded key.
void CalcPowLog( byte * powTbl, byte * logTbl )
{
        byte xdata i = 0;
        byte xdata t = 1;
        do {
  // Use 0x03 as root for exponentiation and logarithms.
         powTbl[i] = t;
         logTbl[t] = i;
         i++;
  // Muliply t by 3 in GF(2^8).
         t ^= (t << 1) ^ (t & 0x80 ? BPOLY : 0);
        } while( t != 1 ); // Cyclic properties ensure that i < 255.
        
        powTbl[255] = powTbl[0]; // 255 = '-0', 254 = -1, etc.
}
void CalcSBox( byte * sBox )
{
        byte xdata i, rot;
        byte xdata temp;
     byte xdata result;
 // Fill all entries of sBox[].
 i = 0;
 do {
                // Inverse in GF(2^8).
                if( i > 0 ) {
                 temp = powTbl[ 255 - logTbl[i] ];
         } else {
                  temp = 0;
  }
                // Affine transformation in GF(2).
                result = temp ^ 0x63; // Start with adding a vector in GF(2).
                for( rot = 0; rot < 4; rot++ ) {
                        // Rotate left.
   temp = (temp<<1) | (temp>>7);
   // Add rotated byte in GF(2).
   result ^= temp;
  }
   
  // Put result in table.
                sBox[i] = result;
 } while( ++i != 0 );
} 
void CalcSBoxInv( byte * sBox, byte * sBoxInv )
{
 byte xdata i = 0;
 byte xdata j = 0;
 // Iterate through all elements in sBoxInv using  i.
 do {
  // Search through sBox using j.
  cleardog();
  do {
   // Check if current j is the inverse of current i.
   if( sBox[ j ] == i ) {
    // If so, set sBoxInc and indicate search finished.
    sBoxInv[ i ] = j;
    j = 255;
   }
  } while( ++j != 0 );
 } while( ++i != 0 );
}
void CycleLeft( byte * row )
{
 // Cycle 4 bytes in an array left once.
 byte xdata temp = row[0];
 row[0] = row[1];
 row[1] = row[2];
 row[2] = row[3];
 row[3] = temp;
}
void InvMixColumn( byte * column )
{
 byte xdata r0, r1, r2, r3;
 r0 = column[1] ^ column[2] ^ column[3];
 r1 = column[0] ^ column[2] ^ column[3];
 r2 = column[0] ^ column[1] ^ column[3];
 r3 = column[0] ^ column[1] ^ column[2];
  column[0] = (column[0] << 1) ^ (column[0] & 0x80 ? BPOLY : 0);
  column[1] = (column[1] << 1) ^ (column[1] & 0x80 ? BPOLY : 0);
    column[2] = (column[2] << 1) ^ (column[2] & 0x80 ? BPOLY : 0);
    column[3] = (column[3] << 1) ^ (column[3] & 0x80 ? BPOLY : 0);
 r0 ^= column[0] ^ column[1];
 r1 ^= column[1] ^ column[2];
 r2 ^= column[2] ^ column[3];
 r3 ^= column[0] ^ column[3];
    column[0] = (column[0] << 1) ^ (column[0] & 0x80 ? BPOLY : 0);
    column[1] = (column[1] << 1) ^ (column[1] & 0x80 ? BPOLY : 0);
    column[2] = (column[2] << 1) ^ (column[2] & 0x80 ? BPOLY : 0);
    column[3] = (column[3] << 1) ^ (column[3] & 0x80 ? BPOLY : 0);
 r0 ^= column[0] ^ column[2];
 r1 ^= column[1] ^ column[3];
 r2 ^= column[0] ^ column[2];
 r3 ^= column[1] ^ column[3];
    column[0] = (column[0] << 1) ^ (column[0] & 0x80 ? BPOLY : 0);
    column[1] = (column[1] << 1) ^ (column[1] & 0x80 ? BPOLY : 0);
    column[2] = (column[2] << 1) ^ (column[2] & 0x80 ? BPOLY : 0);
    column[3] = (column[3] << 1) ^ (column[3] & 0x80 ? BPOLY : 0);
 column[0] ^= column[1] ^ column[2] ^ column[3];
 r0 ^= column[0];
 r1 ^= column[0];
 r2 ^= column[0];
 r3 ^= column[0];
 column[0] = r0;
 column[1] = r1;
 column[2] = r2;
 column[3] = r3;
}
byte Multiply( unsigned char num, unsigned char factor )
{
 byte mask = 1;
 byte result = 0;
 while( mask != 0 ) {
  // Check bit of factor given by mask.
  if( mask & factor ) {
   // Add current multiple of num in GF(2).
   result ^= num;
  }
  // Shift mask to indicate next bit.
  mask <<= 1;
  // Double num.
         num = (num << 1) ^ (num & 0x80 ? BPOLY : 0);
 }
 return result;
}
byte DotProct( unsigned char * vector1, unsigned char * vector2 )
{
 byte result = 0;
 result ^= Multiply( *vector1++, *vector2++ );
 result ^= Multiply( *vector1++, *vector2++ );
 result ^= Multiply( *vector1++, *vector2++ );
 result ^= Multiply( *vector1  , *vector2   );
 return result;
}
void MixColumn( byte * column )
{
 byte xdata row[8] = {
  0x02, 0x03, 0x01, 0x01,
  0x02, 0x03, 0x01, 0x01
 }; // Prepare first row of matrix twice, to eliminate need for cycling.
 byte xdata result[4];
 
 // Take dot procts of each matrix row and the column vector.
 result[0] = DotProct( row+0, column );
 result[1] = DotProct( row+3, column );
 result[2] = DotProct( row+2, column );
 result[3] = DotProct( row+1, column );
 // Copy temporary result to original column.
 column[0] = result[0];
 column[1] = result[1];
 column[2] = result[2];
 column[3] = result[3];
}
void SubBytes( byte * bytes, byte count )
{
 do {
  *bytes = sBox[ *bytes ]; // Substitute every byte in state.
  bytes++;
 } while( --count );
}
void InvSubBytesAndXOR( byte * bytes, byte * key, byte count )
{
 do {
//  *bytes = sBoxInv[ *bytes ] ^ *key; // Inverse substitute every byte in state and add key.
  *bytes = block2[ *bytes ] ^ *key; // Use block2 directly. Increases speed.
  bytes++;
  key++;
 } while( --count );
}
void InvShiftRows( byte * state )
{
 byte temp;
 // Note: State is arranged column by column.
 // Cycle second row right one time.
 temp = state[ 1 + 3*4 ];
 state[ 1 + 3*4 ] = state[ 1 + 2*4 ];
 state[ 1 + 2*4 ] = state[ 1 + 1*4 ];
 state[ 1 + 1*4 ] = state[ 1 + 0*4 ];
 state[ 1 + 0*4 ] = temp;
 // Cycle third row right two times.
 temp = state[ 2 + 0*4 ];
 state[ 2 + 0*4 ] = state[ 2 + 2*4 ];
 state[ 2 + 2*4 ] = temp;
 temp = state[ 2 + 1*4 ];
 state[ 2 + 1*4 ] = state[ 2 + 3*4 ];
 state[ 2 + 3*4 ] = temp;
 // Cycle fourth row right three times, ie. left once.
 temp = state[ 3 + 0*4 ];
 state[ 3 + 0*4 ] = state[ 3 + 1*4 ];
 state[ 3 + 1*4 ] = state[ 3 + 2*4 ];
 state[ 3 + 2*4 ] = state[ 3 + 3*4 ];
 state[ 3 + 3*4 ] = temp;
}
void ShiftRows( byte * state )
{
 byte temp;
 // Note: State is arranged column by column.
 // Cycle second row left one time.
 temp = state[ 1 + 0*4 ];
 state[ 1 + 0*4 ] = state[ 1 + 1*4 ];
 state[ 1 + 1*4 ] = state[ 1 + 2*4 ];
 state[ 1 + 2*4 ] = state[ 1 + 3*4 ];
 state[ 1 + 3*4 ] = temp;
 // Cycle third row left two times.
 temp = state[ 2 + 0*4 ];
 state[ 2 + 0*4 ] = state[ 2 + 2*4 ];
 state[ 2 + 2*4 ] = temp;
 temp = state[ 2 + 1*4 ];
 state[ 2 + 1*4 ] = state[ 2 + 3*4 ];
 state[ 2 + 3*4 ] = temp;
 // Cycle fourth row left three times, ie. right once.
 temp = state[ 3 + 3*4 ];
 state[ 3 + 3*4 ] = state[ 3 + 2*4 ];
 state[ 3 + 2*4 ] = state[ 3 + 1*4 ];
 state[ 3 + 1*4 ] = state[ 3 + 0*4 ];
 state[ 3 + 0*4 ] = temp;
}
void InvMixColumns( byte * state )
{
 InvMixColumn( state + 0*4 );
 InvMixColumn( state + 1*4 );
 InvMixColumn( state + 2*4 );
 InvMixColumn( state + 3*4 );
}
void MixColumns( byte * state )
{
 MixColumn( state + 0*4 );
 MixColumn( state + 1*4 );
 MixColumn( state + 2*4 );
 MixColumn( state + 3*4 );
}
void XORBytes( byte * bytes1, byte * bytes2, byte count )
{
 do {
  *bytes1 ^= *bytes2; // Add in GF(2), ie. XOR.
  bytes1++;
  bytes2++;
 } while( --count );
}
void CopyBytes( byte * to, byte * from, byte count )
{
 do {
  *to = *from;
  to++;
  from++;
 } while( --count );
}
void KeyExpansion( byte * expandedKey )
{
 byte xdata temp[4];
 byte i;
 byte xdata Rcon[4] = { 0x01, 0x00, 0x00, 0x00 }; // Round constant.
 
 unsigned char xdata *key;
 unsigned char xdata a[16];
 key=a;
 //以下为加解密密码,共16字节。可以选择任意值
 key[0]=0x30;
 key[1]=0x30;
 key[2]=0x30;
 key[3]=0x30;
 key[4]=0x30;
 key[5]=0x30;
 key[6]=0x30;
 key[7]=0x30;
 key[8]=0x30;
 key[9]=0x30;
 key[10]=0x30;
 key[11]=0x30;
 key[12]=0x30;
 key[13]=0x30;
 key[14]=0x30;
 key[15]=0x30;
 ////////////////////////////////////////////
 // Copy key to start of expanded key.
 i = KEYLENGTH;
 do {
  *expandedKey = *key;
  expandedKey++;
  key++;
 } while( --i );
 // Prepare last 4 bytes of key in temp.
 expandedKey -= 4;
 temp[0] = *(expandedKey++);
 temp[1] = *(expandedKey++);
 temp[2] = *(expandedKey++);
 temp[3] = *(expandedKey++);
 // Expand key.
 i = KEYLENGTH;
 while( i < BLOCKSIZE*(ROUNDS+1) ) {
  // Are we at the start of a multiple of the key size?
  if( (i % KEYLENGTH) == 0 ) {
   CycleLeft( temp ); // Cycle left once.
   SubBytes( temp, 4 ); // Substitute each byte.
   XORBytes( temp, Rcon, 4 ); // Add constant in GF(2).
   *Rcon = (*Rcon << 1) ^ (*Rcon & 0x80 ? BPOLY : 0);
  }
  // Keysize larger than 24 bytes, ie. larger that 192 bits?
  #if KEYLENGTH > 24
  // Are we right past a block size?
  else if( (i % KEYLENGTH) == BLOCKSIZE ) {
   SubBytes( temp, 4 ); // Substitute each byte.
  }
  #endif
  // Add bytes in GF(2) one KEYLENGTH away.
  XORBytes( temp, expandedKey - KEYLENGTH, 4 );
  // Copy result to current 4 bytes.
  *(expandedKey++) = temp[ 0 ];
  *(expandedKey++) = temp[ 1 ];
  *(expandedKey++) = temp[ 2 ];
  *(expandedKey++) = temp[ 3 ];
  i += 4; // Next 4 bytes.
 } 
}
void InvCipher( byte * block, byte * expandedKey )
{
 byte round = ROUNDS-1;
 expandedKey += BLOCKSIZE * ROUNDS;
 XORBytes( block, expandedKey, 16 );
 expandedKey -= BLOCKSIZE;
 do {
  InvShiftRows( block );
  InvSubBytesAndXOR( block, expandedKey, 16 );
  expandedKey -= BLOCKSIZE;
  InvMixColumns( block );
 } while( --round );
 InvShiftRows( block );
 InvSubBytesAndXOR( block, expandedKey, 16 );
}
void Cipher( byte * block, byte * expandedKey )    //完成一个块(16字节,128bit)的加密
{
 byte round = ROUNDS-1;
 XORBytes( block, expandedKey, 16 );
 expandedKey += BLOCKSIZE;
 do {
  SubBytes( block, 16 );
  ShiftRows( block );
  MixColumns( block );
  XORBytes( block, expandedKey, 16 );
  expandedKey += BLOCKSIZE;
 } while( --round );
 SubBytes( block, 16 );
 ShiftRows( block );
 XORBytes( block, expandedKey, 16 );
}
void aesInit( unsigned char * tempbuf )
{
 powTbl = block1;
 logTbl = block2;
 CalcPowLog( powTbl, logTbl );
 sBox = tempbuf;
 CalcSBox( sBox );
 expandedKey = block1;  //至此block1用来存贮密码表
 KeyExpansion( expandedKey );
 
 sBoxInv = block2; // Must be block2. block2至此开始只用来存贮SBOXINV
 CalcSBoxInv( sBox, sBoxInv );
} 
//对一个16字节块解密,参数buffer是解密密缓存,chainBlock是要解密的块
void aesDecrypt( unsigned char * buffer, unsigned char * chainBlock )
{
 //byte xdata temp[ BLOCKSIZE ];
 //CopyBytes( temp, buffer, BLOCKSIZE );
 CopyBytes(buffer,chainBlock,BLOCKSIZE);
 InvCipher( buffer, expandedKey );
 //XORBytes( buffer, chainBlock, BLOCKSIZE );
 CopyBytes( chainBlock, buffer, BLOCKSIZE );
}
//对一个16字节块完成加密,参数buffer是加密缓存,chainBlock是要加密的块
void aesEncrypt( unsigned char * buffer, unsigned char * chainBlock )
{
 CopyBytes( buffer, chainBlock, BLOCKSIZE );
 //XORBytes( buffer, chainBlock, BLOCKSIZE );
 Cipher( buffer, expandedKey );
 CopyBytes( chainBlock, buffer, BLOCKSIZE );
}
//加解密函数,参数为加解密标志,要加解密的数据缓存起始指针,要加解密的数据长度(如果解密运算,必须是16的整数倍。)
unsigned char aesBlockDecrypt(bit Direct,unsigned char *ChiperDataBuf,unsigned char DataLen)
{
    unsigned char xdata i;
 unsigned char xdata Blocks;
 unsigned char xdata sBoxbuf[256];
 unsigned char xdata tempbuf[16];
 unsigned long int xdata OrignLen=0; //未加密数据的原始长度
 if(Direct==0)
 {
    *((unsigned char *)&OrignLen+3)=ChiperDataBuf[0];
    *((unsigned char *)&OrignLen+2)=ChiperDataBuf[1];
    *((unsigned char *)&OrignLen+1)=ChiperDataBuf[2];
    *((unsigned char *)&OrignLen)=ChiperDataBuf[3];
    DataLen=DataLen-4;
 }
 else
 {
    memmove(ChiperDataBuf+4,ChiperDataBuf,DataLen);
    OrignLen=DataLen;
    ChiperDataBuf[0]=OrignLen;
    ChiperDataBuf[1]=OrignLen>>8;
    ChiperDataBuf[2]=OrignLen>>16;
    ChiperDataBuf[3]=OrignLen>>24;
 }
 cleardog();
 aesInit(sBoxbuf);   //初始化
 if(Direct==0)    //解密
 {
    Blocks=DataLen/16;
    for(i=0;i<Blocks;i++)
    {
         cleardog();
   aesDecrypt(tempbuf,ChiperDataBuf+4+16*i);
    }
    memmove(ChiperDataBuf,ChiperDataBuf+4,OrignLen);
    cleardog();
    return(OrignLen);
 }
 else    //加密
 {
     if(DataLen%16!=0)
    {  
        Blocks=DataLen/16+1;
        //memset(ChiperDataBuf+4+Blocks*16-(DataLen%16),0x00,DataLen%16); //不足16字节的块补零处理
    }
     else
    {
        Blocks=DataLen/16;
    }
     for(i=0;i<Blocks;i++)
    {
         cleardog();
   aesEncrypt(tempbuf,ChiperDataBuf+4+16*i);
    }
    cleardog();
    return(Blocks*16+4);
 }
 
}
//#endif
以上是C文件。以下是头文件
#ifndef AES_H
#define AES_H
extern void aesInit( unsigned char * tempbuf );
extern void aesDecrypt(unsigned char *buffer, unsigned char *chainBlock);
extern void aesEncrypt( unsigned char * buffer, unsigned char * chainBlock );
extern void aesInit( unsigned char * tempbuf );
extern void aesDecrypt( unsigned char * buffer, unsigned char * chainBlock );
extern void aesEncrypt( unsigned char * buffer, unsigned char * chainBlock );
extern unsigned char aesBlockDecrypt(bit Direct,unsigned char *ChiperDataBuf,unsigned char DataLen);
#endif // AES_H
这是我根据网上程序改写的。只支持128位加解密。没有使用占内存很多的查表法。故运算速度会稍慢。
4. 求C语言的AES加密代码 能用的贴出来吧 给满分
#include "stdio.h"
#include "memory.h"
#include "time.h"
#include "stdlib.h"
  
#define PLAIN_FILE_OPEN_ERROR -1
#define KEY_FILE_OPEN_ERROR -2
#define CIPHER_FILE_OPEN_ERROR -3
#define OK 1 
typedef char ElemType; 
 /*初始置换表IP*/
int IP_Table[64] = {  57,49,41,33,25,17,9,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7,
56,48,40,32,24,16,8,0,
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6}; 
/*逆初始置换表IP^-1*/
int IP_1_Table[64] = {39,7,47,15,55,23,63,31,
  38,6,46,14,54,22,62,30,
  37,5,45,13,53,21,61,29,
  36,4,44,12,52,20,60,28,
  35,3,43,11,51,19,59,27,
  34,2,42,10,50,18,58,26,
  33,1,41,9,49,17,57,25,
  32,0,40,8,48,16,56,24};
  
/*扩充置换表E*/
int E_Table[48] = {31, 0, 1, 2, 3, 4,
3,  4, 5, 6, 7, 8,
7,  8,9,10,11,12,
11,12,13,14,15,16,
15,16,17,18,19,20,
19,20,21,22,23,24,
23,24,25,26,27,28,
27,28,29,30,31, 0};
  
/*置换函数P*/
int P_Table[32] = {15,6,19,20,28,11,27,16,
0,14,22,25,4,17,30,9,
1,7,23,13,31,26,2,8,
18,12,29,5,21,10,3,24};
  
/*S盒*/
int S[8][4][16] =
/*S1*/
{{{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},
  {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},
 {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},
 {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}},
 /*S2*/
  {{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},
  {3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},
  {0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},
  {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}},
  /*S3*/
  {{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},
  {13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},
 {13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},
  {1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}},
  /*S4*/
  {{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},
  {13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},
  {10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},
  {3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}},
  /*S5*/
  {{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},
  {14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},
  {4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},
  {11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}},
  /*S6*/
  {{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},
  {10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},
  {9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},
  {4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}},
  /*S7*/
  {{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},
  {13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},
  {1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},
  {6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}},
  /*S8*/
  {{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},
  {1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},
  {7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},
  {2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}}};
/*置换选择1*/
int PC_1[56] = {56,48,40,32,24,16,8,
  0,57,49,41,33,25,17,
  9,1,58,50,42,34,26,
  18,10,2,59,51,43,35,
  62,54,46,38,30,22,14,
  6,61,53,45,37,29,21,
  13,5,60,52,44,36,28,
  20,12,4,27,19,11,3};
  
/*置换选择2*/
int PC_2[48] = {13,16,10,23,0,4,2,27,
  14,5,20,9,22,18,11,3,
  25,7,15,6,26,19,12,1,
  40,51,30,36,46,54,29,39,
  50,44,32,46,43,48,38,55,
  33,52,45,41,49,35,28,31};
  
/*对左移次数的规定*/
int MOVE_TIMES[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};  
int ByteToBit(ElemType ch,ElemType bit[8]);
int BitToByte(ElemType bit[8],ElemType *ch);
int Char8ToBit64(ElemType ch[8],ElemType bit[64]);
int Bit64ToChar8(ElemType bit[64],ElemType ch[8]);
int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]);
int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]);
int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]);
int DES_ROL(ElemType data[56], int time);
int DES_IP_Transform(ElemType data[64]);
int DES_IP_1_Transform(ElemType data[64]);
int DES_E_Transform(ElemType data[48]);
int DES_P_Transform(ElemType data[32]);
int DES_SBOX(ElemType data[48]);
int DES_XOR(ElemType R[48], ElemType L[48],int count);
int DES_Swap(ElemType left[32],ElemType right[32]);
int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]);
int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48], ElemType plainBlock[8]);
int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile);
int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile);  
/*字节转换成二进制*/
int ByteToBit(ElemType ch, ElemType bit[8]){
 int cnt;
 for(cnt = 0;cnt < 8; cnt++){
  *(bit+cnt) = (ch>>cnt)&1;
 }
 return 0;
}
  
/*二进制转换成字节*/
int BitToByte(ElemType bit[8],ElemType *ch){
 int cnt;
 for(cnt = 0;cnt < 8; cnt++){
  *ch |= *(bit + cnt)<<cnt;
 }
 return 0;
}
  
/*将长度为8的字符串转为二进制位串*/
int Char8ToBit64(ElemType ch[8],ElemType bit[64]){
 int cnt;
 for(cnt = 0; cnt < 8; cnt++){  
  ByteToBit(*(ch+cnt),bit+(cnt<<3));
 }
 return 0;
}
  
/*将二进制位串转为长度为8的字符串*/
int Bit64ToChar8(ElemType bit[64],ElemType ch[8]){
 int cnt;
 memset(ch,0,8);
 for(cnt = 0; cnt < 8; cnt++){
  BitToByte(bit+(cnt<<3),ch+cnt);
 }
 return 0;
}
  
/*生成子密钥*/
int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]){
 ElemType temp[56];
 int cnt;
 DES_PC1_Transform(key,temp);/*PC1置换*/
 for(cnt = 0; cnt < 16; cnt++){/*16轮跌代,产生16个子密钥*/
  DES_ROL(temp,MOVE_TIMES[cnt]);/*循环左移*/
  DES_PC2_Transform(temp,subKeys[cnt]);/*PC2置换,产生子密钥*/
 }
 return 0;
}
  
/*密钥置换1*/
int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]){
 int cnt; 
 for(cnt = 0; cnt < 56; cnt++){
  tempbts[cnt] = key[PC_1[cnt]];
 }
 return 0;
}
  
/*密钥置换2*/
int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]){
 int cnt;
 for(cnt = 0; cnt < 48; cnt++){
  tempbts[cnt] = key[PC_2[cnt]];
 }
 return 0;
}
  
/*循环左移*/
int DES_ROL(ElemType data[56], int time){
 ElemType temp[56];
  
 /*保存将要循环移动到右边的位*/
 memcpy(temp,data,time);
 memcpy(temp+time,data+28,time);
 
 /*前28位移动*/
 memcpy(data,data+time,28-time);
 memcpy(data+28-time,temp,time);
  
 /*后28位移动*/
 memcpy(data+28,data+28+time,28-time);
 memcpy(data+56-time,temp+time,time); 
  
 return 0;
}
  
/*IP置换*/
int DES_IP_Transform(ElemType data[64]){
 int cnt;
 ElemType temp[64];
 for(cnt = 0; cnt < 64; cnt++){
  temp[cnt] = data[IP_Table[cnt]];
 }
 memcpy(data,temp,64);
 return 0;
}
  
/*IP逆置换*/
int DES_IP_1_Transform(ElemType data[64]){
 int cnt;
 ElemType temp[64];
 for(cnt = 0; cnt < 64; cnt++){
  temp[cnt] = data[IP_1_Table[cnt]];
 }
 memcpy(data,temp,64);
 return 0;
}
  
/*扩展置换*/
int DES_E_Transform(ElemType data[48]){
 int cnt;
 ElemType temp[48];
 for(cnt = 0; cnt < 48; cnt++){
  temp[cnt] = data[E_Table[cnt]];
 }
 memcpy(data,temp,48);
 return 0;
}
  
/*P置换*/
int DES_P_Transform(ElemType data[32]){
 int cnt;
 ElemType temp[32];
 for(cnt = 0; cnt < 32; cnt++){
  temp[cnt] = data[P_Table[cnt]];
 }
 memcpy(data,temp,32);
 return 0;
}
  
/*异或*/
int DES_XOR(ElemType R[48], ElemType L[48] ,int count){
 int cnt;
 for(cnt = 0; cnt < count; cnt++){
  R[cnt] ^= L[cnt];
 }
 return 0;
}
  
/*S盒置换*/
int DES_SBOX(ElemType data[48]){
 int cnt;
 int line,row,output;
 int cur1,cur2;
 for(cnt = 0; cnt < 8; cnt++){
  cur1 = cnt*6;
  cur2 = cnt<<2;
  
  /*计算在S盒中的行与列*/
  line = (data[cur1]<<1) + data[cur1+5];
  row = (data[cur1+1]<<3) + (data[cur1+2]<<2)
+ (data[cur1+3]<<1) + data[cur1+4];
  output = S[cnt][line][row];
  
  /*化为2进制*/
  data[cur2] = (output&0X08)>>3;
  data[cur2+1] = (output&0X04)>>2;
  data[cur2+2] = (output&0X02)>>1;
  data[cur2+3] = output&0x01;
 }
 return 0;
}
  
/*交换*/
int DES_Swap(ElemType left[32], ElemType right[32]){
 ElemType temp[32];
 memcpy(temp,left,32);
 memcpy(left,right,32);  
 memcpy(right,temp,32);
 return 0;
}
  
/*加密单个分组*/
int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]){
 ElemType plainBits[64];
 ElemType Right[48];
 int cnt;
  
 Char8ToBit64(plainBlock,plainBits);  
 /*初始置换(IP置换)*/
 DES_IP_Transform(plainBits);
  
 /*16轮迭代*/
 for(cnt = 0; cnt < 16; cnt++){ 
  memcpy(Right,plainBits+32,32);
  /*将右半部分进行扩展置换,从32位扩展到48位*/
  DES_E_Transform(Right);
  /*将右半部分与子密钥进行异或操作*/
  DES_XOR(Right,subKeys[cnt],48); 
  /*异或结果进入S盒,输出32位结果*/
  DES_SBOX(Right);
  /*P置换*/
  DES_P_Transform(Right);
  /*将明文左半部分与右半部分进行异或*/
  DES_XOR(plainBits,Right,32);
  if(cnt != 15){
/*最终完成左右部的交换*/
DES_Swap(plainBits,plainBits+32);
  }
 }
 /*逆初始置换(IP^1置换)*/
 DES_IP_1_Transform(plainBits);
 Bit64ToChar8(plainBits,cipherBlock);
 return 0;
}
  
/*解密单个分组*/
int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48],ElemType plainBlock[8]){
 ElemType cipherBits[64];
 ElemType Right[48];
 int cnt;
  
 Char8ToBit64(cipherBlock,cipherBits); 
 /*初始置换(IP置换)*/
 DES_IP_Transform(cipherBits);
 
 /*16轮迭代*/
 for(cnt = 15; cnt >= 0; cnt--){
  memcpy(Right,cipherBits+32,32);
  /*将右半部分进行扩展置换,从32位扩展到48位*/
  DES_E_Transform(Right);
  /*将右半部分与子密钥进行异或操作*/
  DES_XOR(Right,subKeys[cnt],48);  
  /*异或结果进入S盒,输出32位结果*/
  DES_SBOX(Right);
  /*P置换*/
  DES_P_Transform(Right);  
  /*将明文左半部分与右半部分进行异或*/
  DES_XOR(cipherBits,Right,32);
  if(cnt != 0){
/*最终完成左右部的交换*/
DES_Swap(cipherBits,cipherBits+32);
  }
 }
 /*逆初始置换(IP^1置换)*/
 DES_IP_1_Transform(cipherBits);
 Bit64ToChar8(cipherBits,plainBlock);
 return 0;
}
  
/*加密文件*/
int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile){
 FILE *plain,*cipher;
 int count;
 ElemType plainBlock[8],cipherBlock[8],keyBlock[8];
 ElemType bKey[64];
 ElemType subKeys[16][48];
 if((plain = fopen(plainFile,"rb")) == NULL){
  return PLAIN_FILE_OPEN_ERROR;
 }
 if((cipher = fopen(cipherFile,"wb")) == NULL){
  return CIPHER_FILE_OPEN_ERROR;
 }
 /*设置密钥*/
 memcpy(keyBlock,keyStr,8);
 /*将密钥转换为二进制流*/
 Char8ToBit64(keyBlock,bKey);
 /*生成子密钥*/
 DES_MakeSubKeys(bKey,subKeys);
 
 while(!feof(plain)){
  /*每次读8个字节,并返回成功读取的字节数*/
  if((count = fread(plainBlock,sizeof(char),8,plain)) == 8){
DES_EncryptBlock(plainBlock,subKeys,cipherBlock);
fwrite(cipherBlock,sizeof(char),8,cipher);  
  }
 }
 if(count){
  /*填充*/
  memset(plainBlock + count,'\0',7 - count);
  /*最后一个字符保存包括最后一个字符在内的所填充的字符数量*/
  plainBlock[7] = 8 - count;
  DES_EncryptBlock(plainBlock,subKeys,cipherBlock);
  fwrite(cipherBlock,sizeof(char),8,cipher);
 }
 fclose(plain);
 fclose(cipher);
 return OK;
}
  
/*解密文件*/
int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile){
 FILE *plain, *cipher;
 int count,times = 0;
 long fileLen;
 ElemType plainBlock[8],cipherBlock[8],keyBlock[8];
 ElemType bKey[64];
 ElemType subKeys[16][48];
 if((cipher = fopen(cipherFile,"rb")) == NULL){
  return CIPHER_FILE_OPEN_ERROR;
 }
 if((plain = fopen(plainFile,"wb")) == NULL){
  return PLAIN_FILE_OPEN_ERROR;
 }
  
 /*设置密钥*/
 memcpy(keyBlock,keyStr,8);
 /*将密钥转换为二进制流*/
 Char8ToBit64(keyBlock,bKey);
 /*生成子密钥*/
 DES_MakeSubKeys(bKey,subKeys);
  
 /*取文件长度 */
 fseek(cipher,0,SEEK_END);/*将文件指针置尾*/
 fileLen = ftell(cipher); /*取文件指针当前位置*/
 rewind(cipher); /*将文件指针重指向文件头*/
 while(1){
  /*密文的字节数一定是8的整数倍*/
  fread(cipherBlock,sizeof(char),8,cipher);
  DES_DecryptBlock(cipherBlock,subKeys,plainBlock);  
  times += 8;
  if(times < fileLen){
fwrite(plainBlock,sizeof(char),8,plain);
  }
  else{
break;
  }
 }
 /*判断末尾是否被填充*/
 if(plainBlock[7] < 8){
  for(count = 8 - plainBlock[7]; count < 7; count++){
if(plainBlock[count] != '\0'){
 break;
}
  }
 }
 if(count == 7){/*有填充*/
  fwrite(plainBlock,sizeof(char),8 - plainBlock[7],plain);
 }
 else{/*无填充*/
  fwrite(plainBlock,sizeof(char),8,plain);
 }
  
 fclose(plain);
 fclose(cipher);
 return OK;
}  
int main()
{
 clock_t a,b;
 a = clock();
 DES_Encrypt("1.txt","key.txt","2.txt");
 b = clock();
 printf("加密消耗%d毫秒\n",b-a);
 
 system("pause");
 a = clock();
 DES_Decrypt("2.txt","key.txt","3.txt");
 b = clock();
 printf("解密消耗%d毫秒\n",b-a);
 getchar();
 return 0;
}
5. 在线等,急求一个用C语言写的简单的AES加密程序,无需图形界面,但要能运行,有输入输出。
请到这里下载。
http://members.ozemail.com.au/~nulifetv/freezip/freeware/
6. 用C语言编写AES加密算法,遇到问题。
一行行打印语句,问题的核心没有讲出来,大家怎么帮你呢,我们只能保证这个打印过程是正确的。
7. 高分求完整aes加密程序(C/C++),Linux下就完美了。
如果你是程序开发人员,应该有自己动手查找资源的能力啊,这个AES很好找啊。
这个是github上的专门为嵌入式优化过的,作者介绍ARM上大概使用200bytesRAM和2.5KROM
https://github.com/kokke/tiny-AES128-C
为防你上不了github,我直接下下来做了个附件
8. 谁会用C语言实现AES算法,谢谢
1 AES加密、解密算法原理和AVR实现
  AES是分组密钥,算法输入128位数据,密钥长度也是128位。用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表1所列)。每一轮都需要一个与输入分组具有相同长度的扩展密钥Expandedkey(i)的参与。由于外部输入的加密密钥K长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥K扩展成更长的比特串,以生成各轮的加密和解密密钥。
1.1圈变化
AES每一个圈变换由以下三个层组成:
非线性层——进行Subbyte变换;
线行混合层——进行ShiftRow和MixColumn运算;
密钥加层——进行AddRoundKey运算。
① Subbyte变换是作用在状态中每个字节上的一种非线性字节转换,可以通过计算出来的S盒进行映射。
Schange:
ldi zh,$01;将指针指向S盒的首地址
mov zl,r2;将要查找的数据作为指针低地址
ldtemp,z+;取出这个对应的数据
mov r2,temp;交换数据完成查表
.
.
. 
ret
② ShiftRow是一个字节换位。它将状态中的行按照不同的偏移量进行循环移位,而这个偏移量也是根据Nb的不同而选择的[3]。
shiftrow:;这是一个字节换位的子程序
mov temp,r3;因为是4×4
mov r3,r7; r2 r6 r10 r14 r2 r6 r10 r14 
mov r7,r11; r3 r7 r11 r15---r7 r11 r15 r3
mov r11,r15; r4 r8 r12 r17 r12 r17 r4 r8
mov r15,temp; r5 r9 r13 r18 r18 r5 r9 r13
mov temp,r4
mov temp1,r8
mov r4,r12
mov r8,r17
mov r12,temp
mov r17,temp1
mov temp,r18
mov r18,r13
mov r13,r9
mov r9,r5
mov r5,temp
ret
③ 在MixColumn变换中,把状态中的每一列看作GF(28)上的多项式a(x)与固定多项式c(x)相乘的结果。b(x)=c(x)*a(x)的系数这样计算:*运算不是普通的乘法运算,而是特殊的运算,即
b(x)=c(x)·a(x)(mod x4+1)
对于这个运算
b0=02。a0+03。a1+a2+a3
令xtime(a0)=02。a0
其中,符号“。”表示模一个八次不可约多项式的同余乘法[3]。
mov temp,a0;这是一个mixcolimn子程序
rcall xtime;调用xtime程序
mov a0,temp
mov temp,a1
rcall xtime
eor a0,a1
eor a0,temp
eor a0,a2
eor a0,a3;完成b(x)的计算
. 
.
. 
xtime:;这是一个子程序
ldi temp1,$1b 
lsl temp
brcs next1;如果最高位是1,则转移
next: ret;否则什么也不变化
next1:eor temp,temp1 
rjmp next
对于逆变化,其矩阵C要改变成相应的D,即b(x)=d(x)*a(x)。
④ 密钥加层运算(addround)是将圈密钥状态中的对应字节按位“异或”。
⑤ 根据线性变化的性质[1],解密运算是加密变化的逆变化。这里不再详细叙述。
1.2轮变化
  对不同的分组长度,其对应的轮变化次数是不同的,如表1所列。
       
1.3密钥扩展
  AES算法利用外部输入密钥K(密钥串的字数为Nk),通过密钥的扩展程序得到共计4(Nr+1)字的扩展密钥。它涉及如下三个模块:
① 位置变换(rotword)——把一个4字节的序列[A,B,C,D]变化成[B,C,D,A];
② S盒变换(subword)——对一个4字节进行S盒代替;
③ 变换Rcon[i]——Rcon[i]表示32位比特字[xi-1,00,00,00]。这里的x是(02),如
Rcon[1]=[01000000];Rcon[2]=[02000000];Rcon[3]=[04000000]……
  扩展密钥的生成:扩展密钥的前Nk个字就是外部密钥K;以后的字W[[i]]等于它前一个字W[[i-1]]与前第Nk个字W[[i-Nk]]的“异或”,即W[[i]]=W[[i-1]]�W[[i- Nk]]。但是若i为Nk的倍数,则W[i]=W[i-Nk]�Subword(Rotword(W[[i-1]]))�Rcon[i/Nk]。
  程序执行的时候,主要调用以上几个子程序,具体实现如下:
Keyexpansion:
rcall rotwoed
rcall subword
rcall Rcon
.
.
. 
2 AES加密、解密算法的优化
  由以上算法的流程中可以清楚地看到,整个算法中程序耗时最多的就是圈变化部分,因此对于算法的优化也就在此;而圈变化部分可以优化的也就是列变化。因为列变化是一个模乘同余规则。由于AES加密和解密是不对称的,如果不对其进行优化,会使算法的解密速度远远大于加密的速度[1]。
① 加密运算。对列变换(Mixcolumn)可以通过调用xtime子程序进行优化。
另一种有效的优化方法就是离线构造一个表格,即列变化表格。这样只要通过查表的方式就可以提高加密速度。
② 解密算法的优化。由于解密的列变换的系数分别是09、0E、0B和0D。在AVR单片机上实现以上的乘法显然是需要很多的时间,从而导致了解密的性能降低。
  优化方法一:对列变化进行分解使倍乘次数降低。
  仔细研究解密矩阵的系数,不难发现解密矩阵和加密矩阵有着一定的联系,即解密矩阵等于加密矩阵和一个矩阵的相乘。通过这样的联系,就可以对算法进行优化:
这样一来,只用几个简单的“异或”就可以实现列变化,使倍乘的次数降低,提高解密的速度。
优化方法二:构造表格。
  同加密构造方法一样,可以构造四个表格T[ea]=e×a; T[9a]=9×a;T[9a]=9×a;T[ba]=b×a。这样一来,也只需要进行查表和简单的异或就可以完成解密的任务。虽然这种方法将增加额外的开销,但是它却是一种有效的方法。
3 AES加密与解密的实验仿真
  根据以上实验步骤和优化方法得出表2、3所列实验结果。
     
设主密钥为:(128bit)。
加密明文:。
密文:。
解密密文:。
明文:。
  总之,AES密码是一个非对称密码体制,它的解密要比加密复杂和费时。解密优化算法没有增加存储空间的基础上,以列变化为基础进行处理,程序比原始的要小,而且节约了时间。解密优化方法速度最快,效率最高,但要增加系统的存储空间,因此它的程序也是最大的一个
流程图省略  朋友参考吧
