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 + -
显示快捷键?