⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 123123dlg.cpp

📁 蓝牙鉴权算法详细代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -