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

📄 ecc_encrypt.c

📁 基于msp430的椭圆曲线加密器程序
💻 C
📖 第 1 页 / 共 2 页
字号:

//***************程序说明****************************************//
//程序名称:    射频数据通信 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 + -