1. AES算法支持192位明文幺 c
 支持。AES有128bit、192bit、256bit三种块大小
明文大小小于块大小时,需要自己决定填充补齐方法。比如PKCS7标准中定义的补齐方法。 
2. 基于c语言的aes算法分析 基于c语言的aes.c算法分析(代码注释),vc++环境
 blog.csdn.net-zycamym-article-details-45774767
-换斜杠就好了 
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. aes加密算法C代码
 完整的!
#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. 求AES加密算法 C代码
 以前编过的,c++可以用的
#include <iostream>
using namespace std;
long gcd(long a, long b)
{
 if(b>a) //a中存放较大的数,b中存放较小的数
 {
 int temp;
 temp=a;
 a=b;
 b=temp;
 }
 long n;
 while((n=a%b)!=0)
 {
 a=b;
 b=n;
 }
 return b;
}
//---------------------------------------
long cheng_niyuan(long a, long b)
{
 for(long i=1; (i*a)%b!=1; i++);
 return i;
}
//---------------------------------------
int mi_mo(int a, int b, int n)
{
 int K[100];
 int top=-1;
 while(b)
 {
 top++;
 K[top]=(b%2);
 b/=2;
 }
 int c=0, f=1;
 for(; top>=0; top--)
 {
 c=2*c;
 f=(f*f)%n;
 if(K[top]==1)
 {
 c+=1;
 f=(f*a)%n;
 }
 }
 return f;
}
//---------------------------------------
int main()
{
 int p=5,q=11;
 cout<<"p="<<p<<endl;
 cout<<"q="<<q<<endl;
 long int n=p*q;
 cout<<"n="<<n<<endl;
 long int fi_n=(p-1)*(q-1);
 cout<<"fi_n="<<fi_n<<endl;
 int e=3;
 cout<<"e="<<e<<endl;
 long d=cheng_niyuan(e,fi_n);
 int M, C;
 cout<<"请输入明文:"<<endl;
 cin>>M;
 C=mi_mo(M, e, n);
 cout<<"对应的密文为:"<<endl;
 cout<<C<<endl;
 cout<<"请输入密文:"<<endl;
 cin>>C;
 M=mi_mo(C, d, n);
 cout<<"对应的明文为:"<<endl;
 cout<<M<<endl;
 return 0;
} 
6. ASE加密算法,C语言实现
 Rijdeal的AES算法吧?
实现:
#include"stdio.h"
typedef unsigned char word8;
typedef unsigned int word32;
word8 Logtable[256] =
{
 0,0,25,1,50,2,26,198,75,199,27,104,51,238,223,3,100,4,
 224,14,52,141,129,239,76,113,8,200,248,105,28,193,125,194,29,
 181,249,185,39,106,77,228,166,114,154,201,9,120,101,47,138,
 5,33,15,225,36,18,240,130,69,53,147,218,142,150,143,219,189,
 54,208,206,148,19,92,210,241,64,70,131,56,102,221,253,48,
 191,6,139,98,179,37,226,152,34,136,145,16,126,110,72,195,163,
 182,30,66,58,107,40,84,250,133,61,186,43,121,10,21,155,159,
 94,202,78,212,172,229,243,115,167,87,175,88,168,80,244,234,
 214,116,79,174,233,213,231,230,173,232,44,215,117,122,235,
 22,11,245,89,203,95,176,156,169,81,160,127,12,246,111,23,196,
 73,236,216,67,31,45,164,118,123,183,204,187,62,90,251,96,
 177,134,59,82,161,108,170,85,41,157,151,178,135,144,97,190,
 220,252,188,149,207,205,55,63,91,209,83,57,132,60,65,162,109,
 71,20,42,158,93,86,242,211,171,68,17,146,217,35,32,46,137,
 180,124,184,38,119,153,227,165,103,74,237,222,197,49,254,
 24,13,99,140,128,192,247,112,7,
};
word8 Alogtable[256]=
{
 1,3,5,15,17,51,85,255,26,46,114,150,161,248,19,53,95,225,
 56,72,216,115,149,164,247,2,6,10,30,34,102,170,229,52,92,
 228,55,89,235,38,106,190,217,112,144,171,230,49,83,245,4,12,
 20,60,68,204,79,209,104,184,211,110,178,205,76,212,103,169,
 224,59,77,215,98,166,241,8,24,40,120,136,131,158,185,208,107,
 189,220,127,129,152,179,206,73,219,118,154,181,196,87,249,
 16,48,80,240,11,29,39,105,187,214,97,163,254,25,43,125,135,
 146,173,236,47,113,147,174,233,32,96,160,251,22,58,78,210,
 109,183,194,93,231,50,86,250,21,63,65,195,94,226,61,71,201,
 64,192,91,237,44,116,156,191,218,117,159,186,213,100,172,239,
 42,126,130,157,188,223,122,142,137,128,155,182,193,88,232,
 35,101,175,234,37,111,177,200,67,197,84,252,31,33,99,165,
 244,7,9,27,45,119,153,176,203,70,202,69,207,74,222,121,139,
 134,145,168,227,62,66,198,81,243,14,18,54,90,238,41,123,141,
 140,143,138,133,148,167,242,13,23,57,75,221,124,132,151,162,
 253,28,36,108,199,82,246,1,
};
word8 S[256]=
{
 99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,
 118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,
 114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,
 49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,
 9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,
 0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,
 170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,
 146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,
 95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,
 34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,
 36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,
 78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,
 180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,
 14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,
 148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,
 104,65,153,45,15,176,84,187,22,
};
word8 Si[256]=
{
 82,9,106,213,48,54,165,56,191,64,163,158,129,243,215,251,
 124,227,57,130,155,47,255,135,52,142,67,68,196,222,233,203,
 84,123,148...
  
