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

📄 123123dlg.cpp

📁 蓝牙鉴权算法详细代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:


/*初始密钥的生成函数E22*/
class E22
{
public:
	E22();
	void move(int pin[16],int l,int rand[16],int add[6]);
	void e22(E22 &A);
	int  K_init[16],PIN_E[16];
private:
	AR1 AR;
	int Length,RAND[16],PIN[16],addr[6],N_PIN[16];
};

E22::E22() //构造函数
{
Length=0;
for(int i=0;i<16;i++)
	{
	 PIN_E[i]=0;
	 K_init[i]=0;
	 PIN[i]=0;
	 RAND[i]=0;
	 addr[i]=0;
	}
}

void E22::move(int pin[16],int l,int rand[16],int add[6]) //赋值函数
{
    Length=l;
	for(int i=0;i<l;i++)PIN[i]=pin[i];
	for(i=0;i<16;i++)RAND[i]=rand[i];
    for(i=0;i<6;i++)addr[i]=add[i];
}

void E22::e22(E22 &A)  //E22运算主函数
{
for(int i=0;i<Length;i++)PIN_E[i]=PIN[i];
if(Length<15)
	{if (Length>9)
		{
		  for(i=Length;i<16;i++)PIN_E[i]=addr[i-Length];
		  A.RAND[15]=RAND[15]^16;
		}
	 else
		{
		for(i=Length;i<Length+6;i++)
			PIN_E[i]=addr[i-Length];
		for(i=0;i<16;i++)
			PIN_E[i]=PIN_E[i%(Length+6)];
		RAND[15]=RAND[15]^(Length+6);
	 }
	}
else
	RAND[15]=RAND[15]^16;

AR.mov(A.PIN_E,A.RAND);    //一定在调试的时候检查赋值参数的位置
AR.subkey128(AR);//子密钥生成
AR.a_r2(AR);
for(i=0;i<16;i++)K_init[i]=AR.output[i];
}


/*加密密钥的生成算法E3*/

class E3
{
public:
	E3();
	void move(int k[16],int rand[16],int adr[6],int ktype,int ACO[12]);
	void offset(int k[16]);
	void expand(E3 &A);
	void e3(E3 &A);//E1算法主程序
    int  Kc[16];
private:
	int COF[12],COF128[16],e_rand[16],LK[16],k_type,address[6],temp[16];
    AR1 AR;

};

E3::E3()//E3构造函数
{
int i;
k_type=0;
for(i=0;i<12;i++)COF[i]=0;
for(i=0;i<16;i++)
	{
	temp[i]=0;
    Kc[i]=0;
	e_rand[i]=0;
	LK[i]=0;
	}
}

void E3::move(int k[16],int rand[16],int addr[6],int ktype,int ACO[12]) //赋值函数
{
for(int i=0;i<16;i++)
	{
     LK[i]=k[i];
     e_rand[i]=rand[i];
	}
for(i=0;i<6;i++)address[i]=addr[i];
k_type=ktype;

if (k_type==1)   //当前链路密钥是主结点密钥
	for(int i=0;i<12;i++)COF[i]=address[i%6];
else 
    for(int i=0;i<12;i++)COF[i]=ACO[i];//得出结果以前,E1应该是经过一次运算的。
}

void E3::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 E3::expand(E3 &A)
{
 for (int i=0;i<16;i++)
	A.COF128[i]=A.COF[i%12];

}

void E3::e3(E3 &A)//E3算法主程序
{
AR.mov(A.e_rand,A.LK);
AR.subkey128(AR);
AR.a_r1(AR);
A.expand(A);
for(int i=0;i<16;i++)
	{
	  A.temp[i]=AR.output[i];
	  A.temp[i]=A.temp[i]^A.e_rand[i];
	  A.temp[i]=(A.temp[i]+A.COF128[i])%256;
	}
A.offset(A.LK);
AR.mov(A.temp,A.LK);
AR.subkey128(AR);//子密钥生成
AR.a_r2(AR);
for(i=0;i<16;i++)A.Kc[i]=AR.output[i];
}








/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMy123123Dlg dialog

CMy123123Dlg::CMy123123Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMy123123Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMy123123Dlg)
	m_addra = _T("");
	m_pina = _T("");
	m_plena = 0;
	m_addrb = _T("");
	m_pinb = _T("");
	m_plenb = 0;
	m_info = _T("");
	m_linkkey = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMy123123Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMy123123Dlg)
	DDX_Text(pDX, IDC_ADDRA, m_addra);
	DDX_Text(pDX, IDC_PINA, m_pina);
	DDX_Text(pDX, IDC_PINLA, m_plena);
	DDX_Text(pDX, IDC_ADDRB, m_addrb);
	DDX_Text(pDX, IDC_PINB, m_pinb);
	DDX_Text(pDX, IDC_PINLB, m_plenb);
	DDX_Text(pDX, IDC_INFORMATION, m_info);
	DDX_Text(pDX, IDC_LINKKEY, m_linkkey);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMy123123Dlg, CDialog)
	//{{AFX_MSG_MAP(CMy123123Dlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_AUTHERATION, OnAutheration)
	ON_BN_CLICKED(IDC_V_RESET, OnVReset)
	ON_BN_CLICKED(IDC_CREATKEY, OnCreatkey)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMy123123Dlg message handlers

BOOL CMy123123Dlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CMy123123Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CMy123123Dlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMy123123Dlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CMy123123Dlg::OnAutheration() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);

 if(m_addrb==""||m_addra==""||m_pina==""||m_pinb=="")MessageBox("请输入完整信息!!!","输入错误!",MB_OK);
 else if(strlen(m_addra)!=12||strlen(m_addrb)!=12)MessageBox("错误的蓝牙地址!!!","输入错误!",MB_OK);
 else if(m_plena==0||m_plenb==0)MessageBox("个人识别码的长度不应为0,其长度是识别码的字节数!!!","输入错误!",MB_OK);
 //else if(strcmp(m_pina,m_pinb)!=0)m_info+="PIN码错误,鉴权失败!!!\r\n";
 else
 {
  int randa[16],pina[16],pinb[16],la,lb;
  int linkkeya[16],linkkeyb[16];
  
  trans TRA,TRB,TR;
  E1 E1A,E1B;
  E21 E21A,E21B;
  E22 E22A,E22B;
  E3 E3A,E3B;
  
  la=m_plena;
  m_info+="设备A的PIN码扩展为.....\r\n";
  random RANDA(383,503,101355);
  RANDA.ran(RANDA);
  for(int i=0;i<16;i++){randa[i]=RANDA.r[i];AU_RAND[i]=RANDA.r[15-i];}
  TRA.get_string(m_addrb);
  for(i=0;i<6;i++)addrb[5-i]=TRA.tmp[i];//生成初始化密钥时用的都是发起者的蓝牙地址,所以此处用的是B的地址
  TRA.get_string(m_pina);
  for(i=0;i<la;i++)pina[la-1-i]=TRA.tmp[i];
  AR1 ARA;
  E22A.move(pina,la,randa,addrb);
  E22A.e22(E22A);
  for(i=0;i<(la+6);i++)TRA.tmp[i]=E22A.PIN_E[la+5-i];
  m_info+=TRA.put_string(TRA.tmp,la+6);
  m_info+="\r\n";
  m_info+="蓝牙设备A的初始密钥是.....\r\n";
  for(i=0;i<16;i++)
	{
	  TRA.tmp[i]=E22A.K_init[15-i];
	  Kinita[i]=E22A.K_init[i];
	}
  m_info+=TRA.put_string(TRA.tmp,16);
  m_info+="\r\n";
 
  lb=m_plenb;
  m_info+="\r\n设备B的PIN码扩展为.....\r\n";
  TRA.get_string(m_addrb);
  for(i=0;i<6;i++)addrb[5-i]=TRA.tmp[i];
  TRA.get_string(m_pinb);
  for(i=0;i<lb;i++)pinb[lb-1-i]=TRA.tmp[i];
  
  AR1 ARB;
  E22B.move(pinb,lb,randa,addrb);
  E22B.e22(E22B);
  for(i=0;i<(lb+6);i++)TRA.tmp[i]=E22B.PIN_E[lb+5-i];
  m_info+=TRA.put_string(TRA.tmp,lb+6);
  m_info+="\r\n";
  m_info+="蓝牙设备B的初始密钥是.....\r\n";
  for(i=0;i<16;i++)
	{
	  TRA.tmp[i]=E22B.K_init[15-i];
	  Kinitb[i]=E22B.K_init[i];
	}
  m_info+=TRA.put_string(TRA.tmp,16);
  m_info+="\r\n";
 

  
  E21A.mov(randa,addra);
  E21A.e21(E21A);
  for(i=0;i<16;i++)
	{
	lka[i]=(E21A.key[i]^Kinita[i])%256;
	if(lka[i]<0)lka[i]+=256;
	TRA.tmp[15-i]=lka[i];
	}
  m_info+="\r\n蓝牙设备A的单元密钥是.....\r\n";
  m_info+=TRA.put_string(TRA.tmp,16);
  m_info+="\r\n";


  E21B.mov(AU_RAND,addrb);
  E21B.e21(E21B);
      for(i=0;i<16;i++)
	  {
	   lkb[i]=(E21B.key[15-i]^Kinitb[i])%256;
	   if(lkb[i]<0)lkb[i]+=256;
	   TRB.tmp[i]=lkb[i];
	  }
  m_info+="\r\n蓝牙设备B的单元密钥是.....\r\n";
  m_info+=TRB.put_string(TRB.tmp,16);
  m_info+="\r\n";
 
   
  if(strcmp(m_pina,m_pinb)!=0){MessageBox("PIN码匹配错误!!!","提示!",MB_OK);m_info+="\r\n\r\n鉴权失败!!!\r\n";}
  else{ 
	  for( i=0;i<16;i++)
   {
	linkkeya[i]=(Kinita[i]^lka[i])%256;
	if(linkkeya[i]<0)linkkeya[i]+=256;
	linkkeyb[i]=(Kinitb[i]^lkb[i])%256;
	if(linkkeyb[i]<0)linkkeyb[i]+=256;
   }
  for(i=0;i<16;i++)
   {
	LK[i]=(linkkeya[i]^linkkeyb[i])%256;
    if(LK[i]<0)LK[i]+=256;
   }
  

  for(i=0;i<16;i++)TR.tmp[i]=LK[15-i];
  m_info+="\r\n设备A和设备B的组合链路密钥是...\r\n";
  m_info+=TR.put_string(TR.tmp,16);
  m_info+="\r\n";
 
  E1A.move(LK,AU_RAND,addrb);
  E1A.e1(E1A);
  m_info+="\r\n设备A计算鉴权ACO......\r\n";
  m_info+=TRA.put_string(E1A.ACO,12);
  m_info+="\r\n设备A计算鉴权SRES......\r\n";
  m_info+=TRA.put_string(E1A.SRES,4);
  m_info+="\r\n";

  E1B.move(LK,AU_RAND,addrb);
  E1B.e1(E1B);
  m_info+="\r\n设备B计算鉴权ACO......\r\n";
  m_info+=TRB.put_string(E1B.ACO,12);
  m_info+="\r\n设备B计算鉴权SRES......\r\n";
  m_info+=TRB.put_string(E1B.SRES,4);
  m_info+="\r\n\r\n鉴权成功,设备A和B建立连接!!\r\n";MessageBox("鉴权成功!!!","提示!",MB_OK);

}}

UpdateData(false);

	
}

//void CMy123123Dlg::OnAutheration() 
//{
	// TODO: Add your control notification handler code here
//	m_info+="\r\n鉴权成功,设备A和B建立连接关系!!";

	
//}

void CMy123123Dlg::OnVReset() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	m_addra = _T("");
	m_addrb = _T("");
	m_pina = _T("");
	m_pinb = _T("");
	m_plena = 0;
	m_plenb = 0;
	m_info = _T("");
    m_linkkey = _T("");
//	m_ktype = 0;
    UpdateData(false);
	
}

void CMy123123Dlg::OnCreatkey() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	if(m_addrb=="")MessageBox("请输入蓝牙设备地址!!!","输入错误!!!",MB_OK);
	else
	{
	   int rand[16],u_key[16],aco[12],sres[4];
		random e3_r(383,503,101355);
		e3_r.ran(e3_r);
		for(int i=0;i<16;i++)rand[i]=e3_r.r[i];
		trans TRA;
		TRA.get_string(m_addrb);
		for(i=0;i<6;i++)addr[i]=TRA.tmp[5-i];
		E21 e3_21;
		e3_21.mov(rand,addr);
		e3_21.e21(e3_21);
		for(i=0;i<16;i++)u_key[i]=e3_21.key[i];
		E1 e3_1;
		e3_1.move(u_key,rand,addr);
		e3_1.e1(e3_1);
		for(i=0;i<12;i++)aco[i]=e3_1.ACO[i];
		for(i=0;i<4;i++)sres[i]=e3_1.SRES[i];
		//ktype=m_ktype;
		E3 e3_3;		
		e3_3.move(u_key,rand,addr,1,aco);
		e3_3.e3(e3_3);
		for(i=0;i<16;i++)
			{
			  TRA.tmp[i]=e3_3.Kc[15-i];
			  kc[i]=e3_3.Kc[i];
			}
		m_linkkey=TRA.put_string(TRA.tmp,16);
	}
	
	UpdateData(false);

	
}

⌨️ 快捷键说明

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