1.txt

来自「1、 实验要求:用高级语言实现IDEA算法的加密」· 文本 代码 · 共 157 行

TXT
157
字号
#include <fstream>
#include <iostream>
#include <string>
#include "math.h"
#define KEYLEN 52	//子密钥个数
#define word16 unsigned short
#define word32 unsigned int
#define low16(x) ((x)&0xffff)  //取低16位
using namespace std;

word16 inv(word16 x)			//求乘法逆元
{
word16 d0,d1;
word16 q,y;
if(x<=1)
   return x;                    //1的乘法逆元是1,2^16+1的乘法逆元是2^16+1
d1=(word16)(0x10001/x);         //利用扩展Euclidean算法求乘法逆元
y=(word16)(0x10001%x);
if(y==1)
   return low16(1-d1);
d0=1;
do{
   q=x/y;
   x=x%y;
   d0+=q*d1;
   if(x==1)
    return d0;
   q=y/x;
   y=y%x;
   d1+=q*d0;
}while(y!=1);
return low16(1-d1);
}

word16 mul(word16 a,word16 b)	//模2^16+1乘
{
word32 p;
if(a){
   if(b){
    p=(word32)a*b;
    b=(word16)(low16(p));         //低16位
    a=(word16)(p>>16);            //高16位
    return b-a+(b<a);
   }
   else
    return 1-a;
}
else
   return 1-b;
}

void en_key(word16 *userkey,word16 *Z)//获得加密子密码
{
	int i,j;
	/*shifts*/
	for(j=0;j<8;j++)
		Z[j]=*userkey++;
	for(i=0;j<KEYLEN;j++)
	{
		i++;
		Z[i+7]=((Z[i&7]<<9)|(Z[(i+1)&7]>>7));
		Z+=i&8;
		i&=7;
	}
}

void de_key(word16 *Z,word16 *DK)	//获得解密子密码
{	int j;
	word16 t1,t2,t3;
	DK+=52;
	t1=inv(*Z++);
	t2=-*Z++;
	t3=-*Z++;
	*--DK=inv(*Z++);
	*--DK=t3;
	*--DK=t2;
	*--DK=t1;
	for(j=1;j<8;j++)
	{	t1=*Z++;
		*--DK=*Z++;
		*--DK=t1;
		t1=inv(*Z++);
        t2=-*Z++;
		t3=-*Z++;
		*--DK=inv(*Z++);
        *--DK=t2;
		*--DK=t3;
		*--DK=t1;
	}
	t1=*Z++;
	*--DK=*Z++;
	*--DK=t1;
	t1=inv(*Z++);
	t2=-*Z++;
	t3=-*Z++;
	*--DK=inv(*Z++);
	*--DK=t3;
	*--DK=t2;
	*--DK=t1;
}

void cipher_decipher(word16 in[4],word16 out[4],word16 Z[KEYLEN])	//加解密过程
{	word16 x1,x2,x3,x4,s2,s3,r=8;
	x1=*in++;
	x2=*in++;
	x3=*in++;
	x4=*in;
	do{
		x1=mul(x1,*Z++);
		x2+=*Z++;
		x3+=*Z++;
		x4=mul(x4,*Z++);
		s3=x3;
		x3^=x1;
		x3=mul(x3,*Z++);
		s2=x2;
		x2^=x4;
		x2+=x3;
		x2=mul(x2,*Z++);
		x3+=x2;
		x1^=x2;
		x4^=x3;
		x2^=s3;
		x3^=s2;
	}while(--r);            //8轮变换
	x1=mul(x1,*Z++);        //输出变换
	*out++=x1;
	*out++=(x3+*Z++);
	*out++=(x2+*Z++);
	x4=mul(x4,*Z);
	*out=x4;
}
int main()
{	
	int i;		//循环变量
	word16 userkey[8]={0x7363,0x686F,0x6F6C,0x6F66,0x636F,0x6D70,0x7574,0x6572};//128位会话密钥
	word16 EN_KEY[KEYLEN],DE_KEY[KEYLEN];
	word16 in[4],out[4],rst[4];			//分别用于存放明文,密文,和解密结果
	for(i=0;i<4;i++)		//输入原始明文
	{	cout<<"输入第"<<i+1<<"个分组对应的整数(0-65535):";
		cin>>in[i];
	}
	en_key(userkey,EN_KEY);	//获得加密子密码
	de_key(EN_KEY,DE_KEY);	//获得解密子密码
	cipher_decipher(in,out,EN_KEY);	//加密过程
	cout<<"对应的密文为: "<<endl;
	for(i=0;i<4;i++)		//输出加密后的密文
		cout<<out[i]<<"	";
	cout<<endl<<"对应的结果为: "<<endl;
	cipher_decipher(out,rst,DE_KEY);//解密过程
	for(i=0;i<4;i++)		//输出解密结果
		cout<<rst[i]<<"	";
	system("pause");
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?