IDEA.h的源码如下:
#ifndef IDEA_H
#define IDEA_H

typedef unsigned char byte;
typedef unsigned short word16;
typedef unsigned long word32;

class IDEA{
	public:
		void setKey(byte in[]);
		void setPlainText(byte in[]);
		word16 invMul(word16 x);
		word16 mul(word16 x, word16 y);
		void encryption(word16 in[], word16 out[], word16* EK);
		void enc();
		void IDEATest();
	private:
		void getEncRoundKey(word16* encRoundKey);
		void getDecRoundKey(word16 const* EK, word16 DK[]);
		byte key[16];
		word16 plainText[4];
		word16 cipherText[4];
		word16 deCipherText[4];
		word16 encRoundKey[52];
		word16 decRoundKey[52];
		void checkRounakey();
};

#endif
IDEA.cpp
#include "IDEA.h"
#include <fstream>


using namespace std;

void IDEA::setPlainText(byte in[]){
	int i;
	for(i=0;i<8;i+=2){
		plainText[i/2]=(in[i]<<8)+in[i+1];
	}
}

void IDEA::setKey(byte in[]){
	int i;
	for(i=0;i<16;i++){
		key[i]=in[i];
	}
	getEncRoundKey(encRoundKey);
	getDecRoundKey(encRoundKey, decRoundKey);
}

void IDEA::getEncRoundKey(word16* encRoundKey){
	int i,j;
	for(i=0,j=0;j<8;j++){
		encRoundKey[j]=(key[i]<<8)+key[1+1];
		i+=2;
	}
	for (i=0;j<52;j++){
		i++ ;
		encRoundKey[i+7]=encRoundKey[i&7]<<9 | encRoundKey[(i+1)&7]>>7;
		encRoundKey+=i&8;
		i&=7;
	}
}

void IDEA::getDecRoundKey(word16 const *EK, word16 DK[]){
	int i;
	word16 temp[52];		//计算用临时密钥组
	word16 t1,t2,t3;		//计算用临时变量
	word16 *p=temp+52;		//52为密钥数量
	t1=invMul(*EK++);
	t2=-*EK++;
	t3=-*EK++;
	*--p=invMul(*EK++);
	*--p=t3;
	*--p=t2;
	*--p=t1;
	for(i=0;i<7;i++){
		t1=*EK++;
		*--p=*EK++;
		*--p=t1;
		t1=invMul(*EK++);
		t2=-*EK++;
		t3=-*EK++;
		*--p=invMul(*EK++);
		*--p=t2;
		*--p=t3;
		*--p=t1;
	}
	t1=*EK++;
	*--p=*EK++;
	*--p=t1;
	t1=invMul(*EK++);
	t2=-*EK++;
	t3=-*EK++;
	*--p=invMul(*EK++);
	*--p=t3;
	*--p=t2;
	*--p=t1;
	for(i=0,p=temp;i<52;i++){
		*DK++=*p;
		*p++=0;
	}
}


word16 IDEA::invMul(word16 x){
	word16 t0,t1;
	word16 q,y;
	if(x<=1){
		return x;			//x=0或x=1,乘法逆元为其本身
	}
	t1=word16(0x10001L/x);
	y=word16(0x10001L%x);
	if(y==1){
		return (1-t1)&0xFFFF;
	}
	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 (1-t1)&0xFFFF;
}

void IDEA::encryption(word16 in[], word16 out[], word16* EK){
	word16 x1,x2,x3,x4,t1,t2;
	x1=in[0];
	x2=in[1];
	x3=in[2];
	x4=in[3];
	int r=8;
	do{
		x1=mul(x1, *EK++);
		x2+=*EK++;
		x3+=*EK++;
		x4=mul(x4, *EK++);
		t2=x1^x3;
		t1=x2^x4;
		t2=mul(t2, *EK++);
		t1=t1+t2;
		t1=mul(t1, *EK++);
		t2=t1+t2;
		x1^=t1;
		x4^=t2;
		t2^=x2;
		x2=x3^t1;
		x3=t2;
	}while(--r);
	x1=mul(x1, *EK++);
	*out++=x1;
	*out++=x3+*EK++;
	*out++=x2+*EK++;
	x4=mul(x4,*EK++);
	*out=x4;
}

word16 IDEA::mul(word16 x, word16 y){
	word32 p;
	p=(word32)x*y;
	if(p){
		y=p&0xFFFF;		//取低16位
		x=p>>16;
		return (y-x)+(y<x) ;
	}else if(x){
		return 1-y;
	}else{
		return 1-x;
	}
}

void IDEA::enc(){
	encryption(plainText, cipherText, encRoundKey);
	encryption(cipherText, deCipherText, decRoundKey);
}

void IDEA::IDEATest(){
	ofstream out("ideatest.out");
	out<<"The input key is:"<<endl;
	int i;
	for(i=0;i<16;i++){
		out<<hex<<int(key[i])<<" ";
	}
	out<<endl;
	out<<"The plain text is:"<<endl;
	for(i=0;i<4;i++){
		out<<hex<<plainText[i]<<" ";
	}
	out<<endl;
	out<<"The cipherText is:"<<endl;
	for(i=0;i<4;i++){
		out<<hex<<cipherText[i]<<" ";
	}
	out<<endl;
	out<<"The deCipherText is:"<<endl;
	for(i=0;i<4;i++){
		out<<hex<<deCipherText[1]<<" ";
	}
	out<<endl;
}
main.cpp的源代码如下:
#include <iostream>
#include "IDEA.h"

/* run this program using the console pauser&nbs***bsp;add your own getch, system("pause")&nbs***bsp;input loop */

int main(int argc, char** argv) {
	IDEA idea;
	byte key[16]= {0x10, 0x1A, 0x0C, 0x0B, 0x01, 0x11, 0x09, 0x07,
				0x32, 0xA1, 0xB3, 0x06, 0x23, 0x12, 0xD3, 0xF1};
	idea.setKey(key);
	byte plainText[8]={0xA7, 0x95, 0x87, 0x23, 0x1F, 0x2C, 0x6D, 0x73};
	idea.setPlainText(plainText);
	idea.enc();
	idea.IDEATest();
	
	return 0;
}