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密碼是一個非對稱密碼體制,它的解密要比加密復雜和費時。解密優化演算法沒有增加存儲空間的基礎上,以列變化為基礎進行處理,程序比原始的要小,而且節約了時間。解密優化方法速度最快,效率最高,但要增加系統的存儲空間,因此它的程序也是最大的一個
流程圖省略  朋友參考吧
