?? ecc_encrypt.c
字號(hào):
{
bufferyes=1;
break;
}
}
*pmx=mw;
*pmy=(unsigned char)sqrt(x3);
}
*yes=bufferyes;
}
int oula(unsigned char mwdel)
{
unsigned char p1=0;
unsigned char p1_2=0;
unsigned char result=0;
//unsigned char result_p=0;
unsigned char h1=1;
unsigned char h2=2;
p1=sub(p,h1);
p1_2=division(p1,h2);//(p-1)/2
pow_p(mwdel,p1_2,&result);
if(result==1)
return 1;
else
return 0;
}
void pow_p(unsigned char bottom,unsigned char top,unsigned char *result)
{
unsigned char bit_pro[4]={0};
unsigned char mul_tmp=0;
int j;
longth(top,bit_pro); //l??????
if(bit_pro[3]==1)
mul_tmp=bottom;
else
mul_tmp=1;
for(j=2;j>=0;j--)
{
mul_tmp=mul(mul_tmp,mul_tmp);
if(bit_pro[j]==1)
mul_tmp=mul(mul_tmp,bottom);
}
*result=mul_tmp;
}
void longth(unsigned char pv_key,unsigned char *bit)
{
unsigned char bit_pro[4]={0};
unsigned char h1=1;
unsigned char result=0;
int i;
for(i=0;i<=3;i++)
{
result=pv_key&h1;
if(result==1)
bit_pro[i]=1;
pv_key=pv_key>>1;
}
//bit=bit_pro;
for(i=0;bit_pro[i]!='\0';i++)
{
bit[i]=bit_pro[i];
}
}
void kp(unsigned char pv_key,unsigned char pb_key_x,unsigned char pb_key_y,unsigned char *pv_pb_key_x,unsigned char *pv_pb_key_y)
{
int i;
unsigned char bit_pro[4]={0};
unsigned char buf_Q_x=1;
unsigned char buf_Q_y=0;
longth(pv_key,bit_pro);
for(i=0;i<=3;i++)
{
if(bit_pro[i]==1)
addition(buf_Q_x,buf_Q_y,pb_key_x,pb_key_y,&buf_Q_x,&buf_Q_y);
square(pb_key_x,pb_key_y,&pb_key_x,&pb_key_y);
}
*pv_pb_key_x=buf_Q_x;
*pv_pb_key_y=buf_Q_y;
}
void encryption(unsigned char mw,unsigned char qbx,unsigned char qby,unsigned char *cx,unsigned char *cy,unsigned char *yes)
{
unsigned char pmx=0;
unsigned char pmy=0;
unsigned char daqbx=0;
unsigned char daqby=0;
unsigned char bufferyes=0;
unsigned char cx_tmp=0;
unsigned char cy_tmp=0;
proclaimed(mw,&pmx,&pmy,&bufferyes);
*yes=bufferyes;
kp(g_encrypt_private_key,qbx,qby,&daqbx,&daqby);
addition(daqbx,daqby,pmx,pmy,&cx_tmp,&cy_tmp);
*cx=cx_tmp;
*cy=cy_tmp;
}
void decode(unsigned char cx,unsigned char cy,unsigned char qax,unsigned char qay,unsigned char yes,unsigned char *mx)
{
unsigned char dbqax=0;
unsigned char dbqay=0;
unsigned char mx_tmp=0;
unsigned char my=0;
kp(g_decrypt_private_key,qax,qay,&dbqax,&dbqay);
dbqay=sub(p,dbqay);
addition(cx,cy,dbqax,dbqay,&mx_tmp,&my);
*mx=mx_tmp;
}
void SHA_a_4(unsigned char time_ws,unsigned char *pv_key_a)
{
unsigned char pv_pro=0;
srand(time_ws);
pv_pro= rand() ;
pv_pro=pv_pro&15;
*pv_key_a=pv_pro;
}
void SHA_b_4(unsigned char time_ws, unsigned char *pv_key_b)
{
unsigned char pv_pro=0;
//srand((unsigned)time(NULL));
srand(time_ws);
pv_pro= rand() ;
pv_pro=pv_pro&15;
*pv_key_b=pv_pro;
}
//**************************************************************
//函數(shù)名稱: void Software_delay3(unsigned int i)
//函數(shù)說(shuō)明: 軟件延時(shí)程序
//參數(shù)說(shuō)明: 延時(shí)時(shí)間單位:微秒為單位,8MHz為主時(shí)鐘
//返回值 : 無(wú)
//**************************************************************
Software_delay3(unsigned int nValue)
{
unsigned int ii;
for(ii = nValue;ii > 0;ii--)
{
_NOP();//1Tj
_NOP();//1Tj
}
return;//8000000*0.000001/(6+2)=1
}
//**************************************************************
//函數(shù)名稱: void Delay(void)
//函數(shù)說(shuō)明: 延時(shí)程序,用于消除抖動(dòng)
//參數(shù)說(shuō)明: 無(wú)
//返回值 : 無(wú)
//**************************************************************
void Delay(void)
{
int i;
for(i = 15000;i > 0;i--) ;//延時(shí)一點(diǎn)時(shí)間
}
//-------------------------------------可調(diào)用函數(shù)(子程序)結(jié)束--------------------------//
//*************************************主函數(shù)體********************************
//函數(shù)名稱: void main(void)
//函數(shù)說(shuō)明: 主函數(shù)
//*****************************************************************************
void main(void)
{
unsigned int i;
//====================================
//全局變量初始化
//====================================
g_encrypt_pk_x=0;
g_encrypt_pk_y=0;
g_encrypt_private_key=0;
g_decrypt_pk_x=0;
g_decrypt_pk_y=0;
g_decrypt_private_key=0;
px=1;
py=5;
yes=0;
g_recv_flag = 0;
g_recv_count = 0;
g_UartCommand = 0;
g_uart_answer = 0;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT 關(guān)看門狗 ?
//-----------------------------------MCU系統(tǒng)初始化-----------------------------------//
DCOCTL = SYS_DCOCTL_INIT; //采用DOC來(lái)作時(shí)鐘控制
BCSCTL1 = SYS_XTCL1_INIT;
//BCSCTL1 |= XT2OFF ; // XTon (選擇晶振1)
do //??????(是否需要)
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 = SYS_XTCL2_INIT;
//BCSCTL2 |= SELM_3 + SELS; // MCLK = SMCLK = XT2 (主時(shí)鐘和子時(shí)鐘選擇)
//---------------------------------串口設(shè)置程序9600 ,32768HZ--------------------------//
UCTL0 = SWRST; // Set the reset bit to hold inactive
UBR00 = UART_BAUD_BYTE_L; // 32768hz/2400
UBR10 = UART_BAUD_BYTE_H; //
UMCTL0 = UART_BAUD_FINE; // Modulation
UCTL0 = SWRST+CHAR; // P=none, 8 bits, 1 stop
UTCTL0 = SSEL0; // UCLK = ACLK
URCTL0 = 0; // wake on all correct rx
ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD
P3SEL_INIT_SETUP; // P3.4,5 = USART0 TXD/RXD
P3DIR_SETUP_OUTPUT; // P3.0,4 = OUT
UCTL0 &= ~SWRST; // Initialize USART state machine
IE1 |= URXIE0; // Enable USART0 RX interrupt
//---------------------------------P2口初始設(shè)置--------------------------------------//
P2DIR_FIRST_SETUP; //P2口初始化
//.................................中斷使用(初始配置)..................................
// P2INIT_FLAG_SET; // 打開無(wú)線接收中斷(P2口的設(shè)置)
// P2INIT_EDGE_SET;
// P2INIT_ENABLE_SET; //開中斷 P2.2 = DR1
//.....................................................................................
P2DIR_DATA_RECV; //P2口設(shè)置為射頻接收
_EINT(); //開所有中斷使能
Software_delay(POWERUP_DELAY_TIME); //軟件延時(shí)
//send_uart_a_byte(NORMAL); //上電正常顯示表示
while(1)
{
if( g_recv_flag == 1 ) //串口收到一幀數(shù)據(jù)中斷標(biāo)志
{
uart_command_prog(); //串口命令處理,
// send_uart_a_byte(g_uart_answer);
g_uart_answer = 0;
g_recv_count = 0;
g_recv_flag = 0;
g_UartCommand = 0;
IE1 |= URXIE0; //開打串口中斷
}
}
}
//------------------------------------主函數(shù)體結(jié)束----------------------------------------//
//-------------------------------------中斷服務(wù)程序---------------------------------------//
//**********************************************************************************//
// 函數(shù)名稱: void usart0_rx //
// 函數(shù)說(shuō)明: 串口接收命令中斷服務(wù)程序 //
// 參數(shù)說(shuō)明: 無(wú) //
// 返回值 : 無(wú) //
// 調(diào)用函數(shù): void recv_spi_string(void) //
// 全局變量: g_recv_count; g_UartCommand; g_Uartdata2; g_recv_flag; g_buf[32]; //
// 函數(shù)功能說(shuō)明:將串口接收到的第一個(gè)字節(jié)g_UartCommand和 //
// 第二個(gè)字節(jié)分別做為命令字和字節(jié)長(zhǎng)度g_Uartdata2. //
// 其中,g_UartCommand只能取01,02,03三個(gè)數(shù);2 <= g_Uartdata2; //
//**********************************************************************************//
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
if(g_recv_count == 0) //串口接收第一個(gè)命令字節(jié)(命令字節(jié)),
{
g_UartCommand = RXBUF0;
g_recv_count++;
if((g_UartCommand == 0) || (g_UartCommand > 6))//錯(cuò)誤命令轉(zhuǎn)做錯(cuò)誤處理
{
g_recv_flag = 1;
g_uart_answer = 1; //錯(cuò)誤
IE1 &= ~URXIE0;
}
}
else if(g_recv_count == 1) //串口接收第二個(gè)字節(jié)數(shù)(數(shù)據(jù)長(zhǎng)度)。
{
g_Uartdata2 = RXBUF0;
g_recv_count++;
switch (g_UartCommand)
{
case GET_ENCRYPT_PK_COMD:
{
if(g_Uartdata2 != 3)
{
g_recv_flag = 1;
g_uart_answer = 1;
IE1 &= ~URXIE0;
}
break;
}
case SENT_DECRYPT_PK_COMD:
{
if(g_Uartdata2 != 4)
{
g_recv_flag = 1;
g_uart_answer = 1;
IE1 &= ~URXIE0;
}
break;
}
case GET_DECRYPT_PK_COMD:
{
if(g_Uartdata2 = 3)
{
g_recv_flag = 1;
g_uart_answer = 1;
IE1 &= ~URXIE0;
}
break;
}
case SENT_ENCRYPT_PK_COMD:
{
if(g_Uartdata2 != 4)
{
g_recv_flag = 1;
g_uart_answer = 1;
IE1 &= ~URXIE0;
}
break;
}
default:
{
//g_recv_flag = 1; //若接收到03命令則命令處理做待機(jī)
//IE1 &= ~URXIE0; //關(guān)uart中斷
}
}
}
else //串口接收數(shù)據(jù)字節(jié)
{
g_buf[g_recv_count-2] = RXBUF0;
g_recv_count++;
if(g_recv_count == g_Uartdata2 ) //串口命令一幀數(shù)據(jù)結(jié)束
{
g_recv_flag = 1;
IE1 &= ~URXIE0;
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -