📄 ecc_encrypt.c
字号:
//***************程序说明****************************************//
//程序名称: 射频数据通信 AUCT-Scanner.C //
//功能: 无线扫码器 //
//硬件环境: MSP430F135; NRF2401 //
//软件开发环境:IAR Embedded Workbench for MSP430 V3 //
//制作单位: 艾易(武汉)电子技术有限公司 //
//作者: //
//日期: 2007.1.1 //
//***************************************************************//
#include <msp430x13x.h>
#include "ECC_Encrypt.h"
#include <string.h>
//--------------------------------------可调用函数(子程序)---------------------------//
//**************************************************************
//函数名称: void Software_delay(unsigned int i)
//函数说明: 软件延时程序
//参数说明: 延时时间单位:1/4微秒,16位长
//返回值 : 无
//**************************************************************
#include <stdio.h>
#include "stdio.h"
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <stdlib.h>
unsigned char p=29;
unsigned char a=4;
unsigned char b=20;
//--------------------------------------可调用函数(子程序)---------------------------//
//**************************************************************
//函数名称: void Software_delay(unsigned int i)
//函数说明: 软件延时程序
//参数说明: 延时时间单位:1/4微秒,16位长
//返回值 : 无
//**************************************************************
void Software_delay(unsigned int i)
{
while(i--)
{;}
}
//**************************************************************
//函数名称: void Software_delay(unsigned int i)
//函数说明: 软件延时程序
//参数说明: 延时时间单位:1/4微秒,16位长
//返回值 : 无
//**************************************************************
void delayms(unsigned int i)
{int j;
while(i--)
{
for(j=1;j<=500;j++)
{;}
}
}
//**************************************************************
//函数名称: void send_uart_a_byte(unsigned char sendbyte)
//函数说明: 异步串口发送一字节数据
//参数说明: 要发送的数据,
//返回值 : 无
//调用函数:
//引脚说明: TXD_PIN---串口发送引脚
//**************************************************************
void send_uart_a_byte(unsigned char sendbyte)
{
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready? 异步串口发送缓存是否准备好。
TXBUF0 = sendbyte; //将输入的要发送的数据存放到缓存,
}
//******************************************************************
//函数名称: void uart_command_prog(void)
//函数说明: 串口命令处理
//返回值: error
//调用函数: void send_spi_configure(unsigned char ByteCount); void send_spi_string(void);
//全局变量: g_UartCommand;g_recv_count; g_SpiDataCount; g_SpiAddrCount;g_buf[32]; g_configer[15];
//函数功能说明:串口命令字为g_UartCommand,其命令共有三个:01,02,03。
// 当为01时表示重新配置射频头;为02时表示发射一帧数据;为03时表示待机.
//******************************************************************
void uart_command_prog(void)
{
unsigned char i,j;
unsigned char ciphertext1,ciphertext2,cleartext,cleartext1;
unsigned char temp[2];
j=0;
switch(g_UartCommand)
{
case GET_ENCRYPT_PK_COMD: //命令1:请求加密方公钥
{
if(g_recv_count == 3) //只配置最后一个字节进行收发转换
{
//g_configer[TR_CONFIG_BYTE] = g_buf[0];
//生成加密方私钥,传出g_encrypt_private_key:1个字节
SHA_a_4(g_buf[0],&g_encrypt_private_key);
//生成公钥,输入g_encrypt_private_key,px(CONT),py(CONT);输出公钥g_encrypt_pk_x,g_encrypt_pk_y。
kp(g_encrypt_private_key,px,py,&g_encrypt_pk_x,&g_encrypt_pk_y);
//生成串口一帧数据(命令字,数据长度,加密方的公钥)
g_buf_out[0]=0x01;
g_buf_out[1]=0x04;
g_buf_out[2]=g_encrypt_pk_x;
g_buf_out[3]=g_encrypt_pk_y;
// for(i=0;i<=1000;i++)
//{Software_delay(200);}
//从串口传出加密方公钥数据
// for(i=0;i<=30;i++)
//{
//delayms(20);
for(i=0;i<=3;i++)
{
send_uart_a_byte(g_buf_out[i]+0x30);
}
//}//
}
else
{
g_uart_answer = 1; //如果g_recv_count不为 3或 17,则报错。
}
break;
}
case SENT_DECRYPT_PK_COMD: //命令2:向加密方传送解密方的公钥
{
g_decrypt_pk_x=g_buf[0]; //保存解密方公钥x
g_decrypt_pk_y=g_buf[1]; //保存解密方公钥y
g_buf_out[0]=0x02;
g_buf_out[1]=0x02;
for(i=0;i<=1;i++)
{
send_uart_a_byte(g_buf_out[i]+0x30);
}
break;
}
case SENT_ENCRYPT_COMD: //命令3:向加密方发送加密命令
{
//从串口收明文mw,向串口发密文cx,cy。交叉存。
g_buf_out[j++]=0x03;
g_buf_out[j++]=0x08;
for(i=0;i<g_recv_count-2;i++)
{
//加密,mw为明文,输出cx、cy为密文,yes为是嵌入。
temp[0]=g_buf[i]&0x0F;
temp[1]=g_buf[i]>>4;
//for()
encryption(temp[0],g_decrypt_pk_x,g_decrypt_pk_y,&ciphertext1,&ciphertext2,&yes);
g_buf_out[j++]=ciphertext1;//传出X
g_buf_out[j++]=ciphertext2;//传出Y
g_buf_out[j++]=yes;//传出嵌入标志
encryption(temp[1],g_decrypt_pk_x,g_decrypt_pk_y,&ciphertext1,&ciphertext2,&yes);
g_buf_out[j++]=ciphertext1;//传出X
g_buf_out[j++]=ciphertext2;//传出Y
g_buf_out[j++]=yes;//传出嵌入标志
}
//从串口传出加密方公钥数据
for(i=0;i<j;i++)
{
send_uart_a_byte(g_buf_out[i]);
}
break;
}
case GET_DECRYPT_PK_COMD:
{
if(g_recv_count == ONE_BYTE_CONFIG) //只配置最后一个字节进行收发转换
{
//g_configer[TR_CONFIG_BYTE] = g_buf[0];
//生成解密方私钥,传出g_decrypt_private_key:1个字节
SHA_b_4(g_buf[0],&g_decrypt_private_key);
//生成公钥,输入g_encrypt_private_key,px(CONT),py(CONT);输出公钥g_decrypt_pk_x,g_decrypt_pk_y。
kp(g_decrypt_private_key,px,py,&g_decrypt_pk_x,&g_decrypt_pk_y);
//生成串口一帧数据(命令字,数据长度,解密方的公钥)
g_buf_out[0]=0x04;
g_buf_out[1]=0x04;
g_buf_out[2]=g_decrypt_pk_x;
g_buf_out[3]=g_decrypt_pk_y;
//从串口传出解密方公钥数据
for(i=0;i<=3;i++)
{
send_uart_a_byte(g_buf_out[i]+0x30);
}
}
else
{
g_uart_answer = 1; //如果g_recv_count不为 3或 17,则报错。
}
break;
}
case SENT_ENCRYPT_PK_COMD:
{
g_encrypt_pk_x=g_buf[0]; //保存加密方公钥x
g_encrypt_pk_y=g_buf[1]; //保存加密方公钥y
g_buf_out[0]=0x05;
g_buf_out[1]=0x02;
for(i=0;i<=1;i++)
{
send_uart_a_byte(g_buf_out[i]+0x30);
}
break;
}
case SENT_DECRYPT_COMD:
{
g_buf_out[j++]=0x06;
g_buf_out[j++]=0x03;
/* for(i=0;i<g_recv_count-2;i++)
{
//加密,mw为明文,输出cx、cy为密文,yes为是嵌入。
//decode(g_buf[i],g_buf[i+1],g_encrypt_pk_x,g_encrypt_pk_y,yes,&cleartext);
decode(g_buf[i],g_buf[i+1],g_encrypt_pk_x,g_encrypt_pk_y,g_buf[i+2],&cleartext);
g_buf_out[j++]=cleartext;
i++;
i++;
}*/
//加密,mw为明文,输出cx、cy为密文,yes为是嵌入。
//decode(g_buf[i],g_buf[i+1],g_encrypt_pk_x,g_encrypt_pk_y,yes,&cleartext);
decode(g_buf[0],g_buf[1],g_encrypt_pk_x,g_encrypt_pk_y,g_buf[2],&cleartext);
decode(g_buf[3],g_buf[4],g_encrypt_pk_x,g_encrypt_pk_y,g_buf[5],&cleartext1);
g_buf_out[j++]=cleartext|(cleartext1<<4);
//从串口传出加密方公钥数据
for(i=0;i<j;i++)
{
send_uart_a_byte(g_buf_out[i]);
}
break;
}
default:
g_uart_answer = 1; //报错
break;
}//switch()语句结束
}
unsigned char add(unsigned char add_1,unsigned char add_2)
{
unsigned char sum;
sum=add_1+add_2;
sum=sum%p;
return sum;
}
unsigned char sub(unsigned char sub_1,unsigned char sub_2)
{
unsigned char sum;
sum=sub_1-sub_2;
sum=sum%p;
return sum;
}
unsigned char mul(unsigned char mul_1,unsigned char mul_2)
{
unsigned char sum;
sum=mul_1*mul_2;
sum=sum%p;
return sum;
}
unsigned char division(unsigned char div_1,unsigned char div_2)
{
unsigned char sum;
sum=div_1/div_2;
sum=sum%p;
return sum;
}
void addition(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char *x3,unsigned char *y3)
{
unsigned char x3_tmp=0;
unsigned char y3_tmp=0;
unsigned char fenzi=0;
unsigned char fenmu=0;
unsigned char kuohao=0;
unsigned char kuohao2=0;
unsigned char xiaokuohao=0;
unsigned char dakuohao=0;
if(x1==x2)
square(x1,y1,&x3_tmp,&y3_tmp); //如果两个数相同,调用倍点
else if(y1==0)
{
x3_tmp=x2;
y3_tmp=y2;
}
else if(y2==0)
{
x3_tmp=x1;
y3_tmp=y1;
}
else
{
fenzi=sub(y2,y1);//fenzi=y2-y1
fenmu=sub(x2,x1);//fenmu=x2-x1
kuohao=division(fenzi,fenmu);//kuohao=(y2-y1)/(x2-x1)
kuohao2=mul(kuohao,kuohao);//kuohao2=kuohao^2
x3_tmp=sub(kuohao2,x1);//x3
x3_tmp=sub(x3_tmp,x2);//x3
xiaokuohao=sub(x1,x3_tmp);//xiaokuohao=x1-x3
dakuohao=mul(kuohao,xiaokuohao);//dakuohao=(y2-y1)/(x2-x1)*(x1-x3)
y3_tmp=sub(dakuohao,y1);//y3
}
*x3=x3_tmp;
*y3=y3_tmp;
}
void square(unsigned char x1,unsigned char y1,unsigned char *x3,unsigned char *y3)
{
unsigned char x3_tmp=0;
unsigned char y3_tmp=0;
unsigned char fenzi=0;
unsigned char fenmu=0;
unsigned char kuohao=0;
unsigned char kuohao2=0;
unsigned char xiaokuohao=0;
unsigned char dakuohao=0;
unsigned char h2=2;
unsigned char h3=3;
if(y1==0)
{
x3_tmp=x1;
y3_tmp=y1;
}
else
{
fenzi=mul(x1,x1);//fenzi=x1^2
fenzi=mul(fenzi,h3);//fenzi=3*x1^2
fenzi=add(fenzi,a);//fenzi=3*x1^2+a
fenmu=mul(y1,h2);//fenmu=2*y1
kuohao=division(fenzi,fenmu);//kuohao=(3*x1^2+a)/(2*y1)
kuohao2=mul(kuohao,kuohao);//kuohao2=kuohao^2
x3_tmp=sub(kuohao2,x1);
x3_tmp=sub(x3_tmp,x1);//x3
xiaokuohao=sub(x1,x3_tmp);//xiaokuohao=x1-x3
dakuohao=mul(kuohao,xiaokuohao);//dakuohao=(3*x1^2+a)/(2*y1)*(x1-x3)
y3_tmp=sub(dakuohao,y1);//y3
}
*x3=x3_tmp;
*y3=y3_tmp;
}
void proclaimed(unsigned char mw,unsigned char *pmx,unsigned char *pmy,unsigned char *yes)
{
unsigned char h1=1;
unsigned char h20=20;
unsigned char x3=0;
unsigned char xa=0;
unsigned char bufferyes=0;
int t=0,j;
x3=mul(mw,mw);
x3=mul(x3,mw);
xa=mul(mw,a);
x3=add(x3,xa);
x3=add(x3,b);//x3=x^3+4x+20
t=oula(x3);
if(t==1) //可以嵌入
{
*pmx=mw;
*pmy=(unsigned char)sqrt(x3);
}
else
{
mw=mul(mw,h20);
mw=sub(mw,h1);
for(j=0;j<=19;j++)
{
mw=add(mw,h1);
x3=mul(mw,mw);
x3=mul(x3,mw);
xa=mul(mw,a);
x3=add(x3,xa);
x3=add(x3,b);//x3=x^3+4x+20
t=oula(x3);
if(t==1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -