分组加密算法加密的数据块长度是固定的。为了安全地加密任意长度的数据,人们引入了加密模式。通过加密模式,加密算法可加密任意长度的数据。密文反馈模式(CBC)是一种常用的加密模式,它首先将输入数据分块,每块的长度为加密算法可处理的块长度,最后一块若不到块长度,则通过填充0比特使其达到块长。上图给出了CBC的原理。其中+代表异或操作,Ek代表使用密钥k进行加密的操作,Dk代表使用密钥k解密的操作。图中上半部分为加密的过程,下半部为解密过程。
//IDEA.h
bool SetKey( unsigned short *key, unsigned short kLen );
void idea_encrypt( unsigned short *in, unsigned short *out );
void idea_decrypt( unsigned short *in, unsigned short *out );
//IDEA.c
#include <string.h>
#include <stdlib.h>
#include "idea.h"
//! 宏定义,IDEA迭代轮次
#define ROUNDS 8
//! 宏定义,参与加密过程的子密钥数目
#define KEYLEN (6*ROUNDS+4)
//! 宏定义,获取低16位字
#define low16(x) ((x) & 0xffff)
//! 用于保存52个加密子密钥
unsigned short gEnkey[52];
//! 用于保存52个解密子解钥
unsigned short gDekey[52];
typedef unsigned short IDEAkey[KEYLEN];
struct IDEA_MSG_ITEM
{
unsigned short X[4];
unsigned short Z[6];
unsigned short W[4];
};
struct IDEA_MSG
{
IDEA_MSG_ITEM items[8];
unsigned short Y[4];
unsigned short LZ[4];
};
IDEA_MSG gIDEA_MSG;
unsigned int inv( unsigned int x )
{
unsigned int t0,t1;
unsigned int q,y;
if( x <= 1 )
return x;
t1 = (unsigned int)(0x10001l / x);
y = (unsigned int)(0x10001l % x);
if( y == 1 )
return low16( 1 - t1 );
t0 = 1 ;
do
{
q = x / y;
x = x % y;
t0 += q * t1;
if (x == 1)
return t0;
q = y / x;
y = y % x;
t1 += q * t0;
} while( y != 1 );
return low16( 1-t1 );
}
unsigned short mul( unsigned int a, unsigned int b )
{
unsigned int p;
if(a)
{
if(b)
{
p=(unsigned int)a*b;
b=(unsigned int)(low16(p));
a=(unsigned int)(p>>16);
return b-a+(b<a);
}
else
{
return 1-a;