📄 123123dlg.cpp
字号:
// 123123Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "123123.h"
#include "123123Dlg.h"
#include "string.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include <math.h>
int ks[16],kc[16],addr[6],addra[6],addrb[6],e0_key[16],AU_RAND[16],LK[16],Kinita[16],Kinitb[16];
int lka[16],lkb[16];
//字符串和数字相互转换类
class trans
{
public:
trans();
CString string;
int tmp[16];
CString put_string(int tmp[16],int len);
void get_string(CString &str);
};
trans::trans()
{
for(int i=0;i<16;i++)tmp[i]=0;
}
void trans::get_string(CString &str)
{
int len=str.GetLength(),k1,k2,j=0;//获得字符串的长度
for(int i=len-1;i>=0;i-=2)
{
if((str[i]>='0')&&(str[i]<='9'))k1=str[i]-48;
else if ((str[i]>='A')&&(str[i]<='F'))k1=str[i]-55;
else if ((str[i]>='a')&&(str[i]<='f'))k1=str[i]-87;
else k1=0;
if((i==0)&&(len%2==1))k2=0;
else if((str[i-1]>='0')&&(str[i-1]<='9'))k2=str[i-1]-48;
else if ((str[i-1]>='A')&&(str[i-1]<='F'))k2=str[i-1]-55;
else if ((str[i-1]>='a')&&(str[i-1]<='f'))k2=str[i-1]-87;
else k2=0;
tmp[j++]=k1+k2*16;
}
}
CString trans::put_string(int temp[16],int len)
{
//考虑所有数字为0的情况(待编)
int i=0,k,jinwei=1;
CString str="";
CString t="0123456789ABCDEF";
char ch;
while(i<len)
{
if(temp[i]==0)
{jinwei=0;
for(int j=i-1;j>0;j--)
if(temp[j]>0){jinwei=1;break;}
}
if(jinwei)
{
k=temp[i]%16;
ch=t[k];
str.Insert(0,ch);
k=temp[i]/16;
ch=t[k];
str.Insert(0,ch);
}
i++;
}
return str;
}
//随机数生成类
class random
{
public:
random(unsigned int pp,unsigned int qq,unsigned __int64 ss);
void ran(random &A);
unsigned char r[16];
private:
unsigned int p,q;
unsigned __int64 s;
};
random::random(unsigned int pp,unsigned int qq,unsigned __int64 ss)
{
p=pp;
q=qq;
s=ss;//p*q=n,s是满足与n互素的随机数
}
void random::ran(random &A)
{
unsigned char ran[128];
unsigned __int64 x[128],n;
n=A.p*A.q;
x[0]=A.s*A.s;
ran[0]=(x[0]%2);
for(int i=1 ; i<128 ; i++)
{
x[i]=(x[i-1]*x[i-1])%n;
ran[i]=x[i]%2;
}
for(i=0;i<128;i++)
{A.r[i/8]+=ran[i];
if((i+1)%8!=0)
A.r[i/8]<<=1;
}
}
class AR1
{
public:
AR1();
int mod45(int x);
int BB(int m,int n);
void subkey128(AR1 &A); //密钥流生成函数
void mov(int plain[16],int in[16]); //赋值函数
void each_round(AR1 &A);
void get(CString& str); //将字符串转化为大数
CString put(AR1 &A); //将128位大数转化为字符串
void a_r1(AR1 &A); //safer运算主函数
void a_r2(AR1 &A); //safer'运算主函数
int output[16],tmp[16];
private:
int plain_txt[16],in_key[17],round,subkey[17][16];
};
//构造函数,设初值全部为零
AR1::AR1()
{
int j;
for(int i=0;i<16;i++)
{
plain_txt[i]=0;
in_key[i]=0;
output[i]=0;
tmp[i]=0;
}
in_key[16]=0;
for(i=0;i<16;i++)
{
output[i]=0;
for(j=0;j<16;j++)subkey[i][j]=0;
}
for(j=0;j<16;j++)
subkey[16][j]=0;
}
void AR1::get(CString &str)
{
int len=str.GetLength(),k1,k2,j=0;//获得字符串的长度
for(int i=len-1;i>=0;i-=2)
{
if((str[i]>='0')&&(str[i]<='9'))k1=str[i]-48;
else if ((str[i]>='A')&&(str[i]<='F'))k1=str[i]-55;
else if ((str[i]>='a')&&(str[i]<='f'))k1=str[i]-87;
else k1=0;
if((i==0)&&(len%2==1))k2=0;
else if((str[i-1]>='0')&&(str[i-1]<='9'))k2=str[i-1]-48;
else if ((str[i-1]>='A')&&(str[i-1]<='F'))k2=str[i-1]-55;
else if ((str[i-1]>='a')&&(str[i-1]<='f'))k2=str[i-1]-87;
else k2=0;
tmp[j++]=k1+k2*16;
}
}
CString AR1::put(AR1 &A)
{
//考虑所有数字为0的情况(待编)
int i=0,k,jinwei=1;
CString str="";
CString t="0123456789ABCDEF";
char ch;
while(i<16)
{
if(tmp[i]==0)for(int j=i+1;j<16;j++)
{
if(tmp[j]>0){jinwei=1;break;}
else jinwei=0;
}
if(jinwei)
{
k=tmp[i]%16;
ch=t[k];
str.Insert(0,ch);
k=tmp[i]/16;
ch=t[k];
str.Insert(0,ch);
}
i++;
}
return str;
}
//输入明文及密钥的赋值函数,调用形式 N.mov(plain,in),
//返回值,无
void AR1::mov(int plain[16],int in[16])
{
for(int i=0;i<16;i++)
{
plain_txt[i]=plain[i];
//output[i]=plain[i];
in_key[i]=in[i];
}
}
int AR1::mod45(int x)
{
int z=1;
for(int j=0;j<x;j++)
{
if((z=z*45)>257)z=z%257;
}
if(x==128)z=0;
return z;
}
//B计算函数
int AR1::BB(int i ,int j)
{
int x,y,z;
x=17*i+j;
y=mod45(x);
z=mod45(y);
return z;
}
/*加密所用的密钥流生成函数,输入为16字节密钥k_array[0]~k_array[15],
输出为17个16字节的密钥流k[0][0]~k[17][16]*/
void AR1::subkey128(AR1& a)
{
int j,K[17][17];//K[17][17]用于存储临时的子密钥流
//子密钥算法中第17字节的生成
in_key[16]=in_key[0];
for(int i=1;i<16;i++)
in_key[16]^=in_key[i];
//子密钥流K的生成
for(j=0;j<16;j++)
{
K[0][j]=in_key[j];
subkey[0][j]=in_key[j];
}
for(i=1;i<17;i++)
for(j=0;j<16;j++)
{
K[i][j]=(K[i-1][j]<<3)%256;
if(K[i][j]<0)K[i][j]+=256;
}
for(i=1;i<17;i++)
for(j=0;j<16;j++)
{
subkey[i][j]=(BB(i+1,j)+K[i][(j+i)%16])%256;
}
}
//SAFER+算法每一轮运算函数,调用形式A.each_round()
void AR1::each_round(AR1 &A)
{
//log 运算的预算值
const static int L[256]=
{
128, 0 , 176, 9 , 96 , 239, 185, 253, 16 , 18 , 159, 228, 105, 196, 173, 248,
192, 56 , 194, 101, 79 , 6 , 148, 252, 25 , 222, 106, 27 , 93 , 78 , 168, 130,
112, 237, 232, 236, 114, 179, 21 , 195, 255, 171, 182, 71 , 68 , 1 , 172, 37 ,
201, 125, 142, 65 , 26 , 33 , 203, 211, 13 , 110, 254, 38 , 88 , 218, 50 , 15 ,
32 , 169, 157, 132, 152, 5 , 156, 187, 34 , 140, 99 , 231, 197, 225, 115, 198,
175, 36 , 91 , 135, 102, 39 , 247, 87 , 244, 150, 177, 183, 92 , 139, 213, 84 ,
121, 223, 170, 246, 62 , 163, 241, 17 , 202, 245, 208, 23 , 123, 147, 131, 188,
189, 82 , 30 , 235, 174, 204, 214, 53 , 8 , 200, 138, 180, 226, 205, 191, 217,
208, 80 , 89 , 63 , 77 , 98 , 52 , 10 , 72 , 136, 181, 86 , 76 , 46 , 107, 158,
210, 61 , 60 , 3 , 19 , 251, 151, 81 , 117, 74 , 145, 113, 35 , 190, 118, 42 ,
95 , 249, 212, 85 , 11 , 220, 55 , 49 , 22 , 116, 215, 119, 167, 230, 7 , 219,
164, 47 , 70 , 243, 97 , 69 , 103, 227, 12 , 162, 59 , 28 , 133, 24 , 4 , 29 ,
41 , 160, 143, 178, 90 , 216, 166, 126, 238, 141, 83 , 75 , 161, 154, 193, 14 ,
122, 73 , 165, 44 , 129, 196, 199, 54 , 43 , 127, 67 , 149, 51 , 242, 108, 104,
109, 240, 2 , 40 , 206, 221, 155, 234, 94 , 153, 124, 20 , 134, 207, 229, 66 ,
184, 64 , 120, 45 , 58 , 233, 100, 31 , 146, 144, 125, 57 , 111, 224, 137, 48
};
//y=xM中M的值
const static int M[][16]=
{
{2,2,1,1,16,8,2,1,4,2,4,2,1,1,4,4},
{1,1,1,1,8,4,2,1,2,1,4,2,1,1,2,2},
{1,1,4,4,2,1,4,2,4,2,16,8,2,2,1,1},
{1,1,2,2,2,1,2,1,4,2,8,4,1,1,1,1},
{4,4,2,1,4,2,4,2,16,8,1,1,1,1,2,2},
{2,2,2,1,2,1,4,2,8,4,1,1,1,1,1,1},
{1,1,4,2,4,2,16,8,2,1,2,2,4,4,1,1},
{1,1,2,1,4,2,8,4,2,1,1,1,2,2,1,1},
{2,1,16,8,1,1,2,2,1,1,4,4,4,2,4,2},
{2,1,8,4,1,1,1,1,1,1,2,2,4,2,2,1},
{4,2,4,2,4,4,1,1,2,2,1,1,16,8,2,1},
{2,1,4,2,2,2,1,1,1,1,1,1,8,4,2,1},
{4,2,2,2,1,1,4,4,1,1,4,2,2,1,16,8},
{4,2,1,1,1,1,2,2,1,1,2,1,2,1,8,4},
{16,8,1,1,2,2,1,1,4,4,2,1,4,2,4,2},
{8,4,1,1,1,1,1,1,2,2,2,1,2,1,4,2},
};
int temp[16]={0},i,j; //temp[16]为和矩阵M相乘后的输出值
for(i=0;i<16;i++)
{
if((i==0) || (i==3) || (i==4) || (i==7) || (i==8) || (i==11) || (i==12) || (i==15))
{
A.output[i]=(A.output[i] ^ A.subkey[2*round-1-1][i])%256;
if(A.output[i]==128)A.output[i]=0;
else A.output[i]=mod45(A.output[i]);
A.output[i]=(A.output[i] + A.subkey[2*round-1][i])%256;
}
else
{
A.output[i]=(A.output[i] + A.subkey[2*round-1-1][i])%256;
int temp=A.output[i];
A.output[i]=L[temp];
A.output[i]=(A.output[i]^A.subkey[2*round-1][i])%256;
}
}
//对矩阵M作mod256的算术运算
for(i=0;i<16;i++)
for(j=0;j<16;j++)
temp[i]=(temp[i]+output[j]*M[j][i])%256;//以前用的是plain_txt,现在改了
for(i=0;i<16;i++)A.output[i]=temp[i];
}
//SAFER+算法主函数
void AR1::a_r1(AR1 &A)
{
int i;
for(int j=0;j<16;j++)A.output[j]=A.plain_txt[j];
//8轮加密运算
for(round=1;round<9;round++)
A.each_round(A);
for(i=0;i<16;i++)
{
if(i==0 || i==3 || i==4 || i==7 || i==8 || i==11 || i==12 || i==15)
A.output[i]=(subkey[16][i] ^ A.output[i])%256;
else
A.output[i]=(subkey[16][i] + A.output[i])%256;
}
for(i=0;i<16;i++)if(A.output[i]<0)A.output[i]=A.output[i]+256;
}
//safer'算法主函数
void AR1::a_r2(AR1 &A)
{
for(int j=0;j<16;j++)A.output[j]=A.plain_txt[j];
for(round=1;round<9;round++)
{
if(round==2)
{
for(int j=0;j<16;j++)
{
if(j==0 || j==3 || j==4 || j==7 || j==8 || j==11 || j==12 || j==15)
A.output[j]=(A.plain_txt[j]^A.output[j])%256;
else
A.output[j]=(A.plain_txt[j]+A.output[j])%256;
}
}
A.each_round(A);
}
for(int i=0;i<16;i++)
{
if(i==0 || i==3 || i==4 || i==7 || i==8 || i==11 || i==12 || i==15)
A.output[i]=(subkey[16][i] ^ A.plain_txt[i])%256;
else
A.output[i]=(subkey[16][i] + A.plain_txt[i])%256;
}
for(i=0;i<16;i++)if(A.output[i]<0)A.output[i]=A.output[i]+256;
}
/* E1算法主程序:
原始输入为:{K(128当前链路密钥),RAND(128位鉴权随机数),
address(48位的蓝牙地址)
原始输出为(共128位):{SRES(32位的鉴权验证吗),
ACO(以后用于生成加密密钥的鉴权偏移量96位)}
*/
class E1
{
public:
E1();
void move(int k[16],int rand[16],int adr[6]);
void offset(int k[16]);//漂移处理
void expand(E1 &A);
void e1(E1 &A); //E1算法主程序
int SRES[4],ACO[12];//E1算法的输出
private:
int address[6],e_add[16],LK[16],A_rand[16],temp[16];
AR1 AR; //safer算法程序
};
E1::E1()//E1构造函数
{
int i;
for(i=0;i<4;i++)SRES[i]=0;
for(i=0;i<12;i++)ACO[i]=0;
for(i=0;i<6;i++)address[i]=0;
for(i=0;i<16;i++)
{
e_add[i]=0;
LK[i]=0;
A_rand[i]=0;
}
}
void E1::move(int k[16],int rand[16],int adr[6]) //赋值函数
{
for(int i=0;i<16;i++)
{
LK[i]=k[i];
A_rand[i]=rand[i];
}
for(i=0;i<6;i++)address[i]=adr[i];
}
void E1::offset(int k[16]) //密钥偏移函数
{
k[0]=(k[0]+233)%256;
k[1]=k[1]^229;
k[2]=(k[2]+223)%256;
k[3]=k[3]^193;
k[4]=(k[4]+179)%256;
k[5]=k[5]^167;
k[6]=(k[6]+149)%256;
k[7]=k[7]^131;
k[8]=k[8]^233;
k[9]=(k[9]+229)%256;
k[10]=k[10]^223;
k[11]=(k[11]+193)%256;
k[12]=k[12]^179;
k[13]=(k[13]+167)%256;
k[14]=k[14]^149;
k[15]=(k[15]+131)%256;
}
void E1::expand(E1 &A) //地址扩展函数
{
for(int i=0;i<15;i++)e_add[i]=address[i%6];
}
void E1::e1(E1 &A)//E1算法主程序
{
AR.mov(A.A_rand,A.LK);
AR.a_r1(AR);
A.expand(A); //蓝牙物理地址的扩展
for(int i=0;i<15;i++)
{
A.temp[i]=AR.output[i];
A.temp[i]=A.temp[i]^A.A_rand[i];
A.temp[i]=(A.temp[i]+A.e_add[i])%256;
}
A.offset(A.LK); //链路密钥偏移函数
AR.mov(A.temp,A.LK);
AR.subkey128(AR);//子密钥生成
AR.a_r2(AR);
for(i=0;i<4;i++)A.SRES[i]=(AR.output[i])%256;
for(i=0;i<12;i++)A.ACO[i]=AR.output[i+4]%256;
}
/*节点密钥KA和组合密钥KAB的生成算法E21*/
class E21
{
public:
E21();
void mov(int rand[16],int add[6]);
void e21(E21 &A);
int key[16];
private:
AR1 AR;
int RAND[16],BD_ADDR[6],E_addr[16];
};
E21::E21()//构造函数
{
for(int i=0;i<6;i++)BD_ADDR[i]=0;
for(i=0;i<16;i++)
{
key[i]=0;
RAND[i]=0;
E_addr[i]=0;
}
}
void E21::mov(int rand[16],int add[6])//E21赋值函数
{
for(int i=0;i<6;i++)BD_ADDR[i]=add[i];
for(i=0;i<16;i++)RAND[i]=rand[i];
}
void E21::e21(E21 &A) //E21密钥算法主函数
{
RAND[15]=RAND[15]^16;
for(int i=0;i<16;i++)E_addr[i]=BD_ADDR[i%6];
AR.mov(A.E_addr,A.RAND); //注意ar加密算法中的密钥和明文之间的顺序
AR.subkey128(AR);//子密钥生成
AR.a_r2(AR);
for(i=0;i<16;i++)key[i]=AR.output[i];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -