📄 123123dlg.cpp
字号:
/*初始密钥的生成函数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 + -