📄 ecc_encrypt.c
字号:
{
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;
}
//**************************************************************
//函数名称: void Software_delay3(unsigned int i)
//函数说明: 软件延时程序
//参数说明: 延时时间单位:微秒为单位,8MHz为主时钟
//返回值 : 无
//**************************************************************
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
}
//**************************************************************
//函数名称: void Delay(void)
//函数说明: 延时程序,用于消除抖动
//参数说明: 无
//返回值 : 无
//**************************************************************
void Delay(void)
{
int i;
for(i = 15000;i > 0;i--) ;//延时一点时间
}
//-------------------------------------可调用函数(子程序)结束--------------------------//
//*************************************主函数体********************************
//函数名称: void main(void)
//函数说明: 主函数
//*****************************************************************************
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 关看门狗 ?
//-----------------------------------MCU系统初始化-----------------------------------//
DCOCTL = SYS_DCOCTL_INIT; //采用DOC来作时钟控制
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 (主时钟和子时钟选择)
//---------------------------------串口设置程序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口初始设置--------------------------------------//
P2DIR_FIRST_SETUP; //P2口初始化
//.................................中断使用(初始配置)..................................
// P2INIT_FLAG_SET; // 打开无线接收中断(P2口的设置)
// P2INIT_EDGE_SET;
// P2INIT_ENABLE_SET; //开中断 P2.2 = DR1
//.....................................................................................
P2DIR_DATA_RECV; //P2口设置为射频接收
_EINT(); //开所有中断使能
Software_delay(POWERUP_DELAY_TIME); //软件延时
//send_uart_a_byte(NORMAL); //上电正常显示表示
while(1)
{
if( g_recv_flag == 1 ) //串口收到一帧数据中断标志
{
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; //开打串口中断
}
}
}
//------------------------------------主函数体结束----------------------------------------//
//-------------------------------------中断服务程序---------------------------------------//
//**********************************************************************************//
// 函数名称: void usart0_rx //
// 函数说明: 串口接收命令中断服务程序 //
// 参数说明: 无 //
// 返回值 : 无 //
// 调用函数: void recv_spi_string(void) //
// 全局变量: g_recv_count; g_UartCommand; g_Uartdata2; g_recv_flag; g_buf[32]; //
// 函数功能说明:将串口接收到的第一个字节g_UartCommand和 //
// 第二个字节分别做为命令字和字节长度g_Uartdata2. //
// 其中,g_UartCommand只能取01,02,03三个数;2 <= g_Uartdata2; //
//**********************************************************************************//
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
if(g_recv_count == 0) //串口接收第一个命令字节(命令字节),
{
g_UartCommand = RXBUF0;
g_recv_count++;
if((g_UartCommand == 0) || (g_UartCommand > 6))//错误命令转做错误处理
{
g_recv_flag = 1;
g_uart_answer = 1; //错误
IE1 &= ~URXIE0;
}
}
else if(g_recv_count == 1) //串口接收第二个字节数(数据长度)。
{
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命令则命令处理做待机
//IE1 &= ~URXIE0; //关uart中断
}
}
}
else //串口接收数据字节
{
g_buf[g_recv_count-2] = RXBUF0;
g_recv_count++;
if(g_recv_count == g_Uartdata2 ) //串口命令一帧数据结束
{
g_recv_flag = 1;
IE1 &= ~URXIE0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -