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

📄 main.c.bak

📁 基于armlpc2131实现rc5算法,并得到验证
💻 BAK
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:			Chenxibing
** Modified date:		2005-01-17
** Version:
** Descriptions:		UART0通讯实验,中断方式,使用FIFO。
**
********************************************************************************************************/
#include "config.h"
uint8 num=0;
#define w 32      //   自定义32位4字节的类型 、 WORD的位数,也是明文块长的位数
#define r 12      //   每次进行12轮
#define b 16      //   密钥中的字节数  
#define c 4       //   以WORD为单位将16字节密钥按序划为4份 
                  /*c=max(1,ceil(8*b/w)) */
#define t 26      //   生成子密钥的个数为包含2*(r+1)元素的WORD数组
uint32 S[t];       //   子密钥数组 
uint32 l_ct[2];
uint32 l_pt[2];
uint8 ki;
uint32 output[2];
uint32 P=0xb7e15163,Q=0x9e3779b9; /*两个固定16进制魔术常量  */
//uint32 pt1[2],pt2[2],ct[2]={0,0};
/*Rotation operators.x must be unsigned,to get logical right shift*/
#define ROTL(x,y) (((x)<<(y&(w-1)))|((x)>>(w-(y&(w-1)))))
#define ROTR(x,y) (((x)>>(y&(w-1)))|((x)<<(w-(y&(w-1)))))


/* 定义串口模式设置数据结构 */
typedef struct UartMode
{
	uint8 datab;		// 字长度,5/6/7/8可选
	uint8 stopb;		// 停止位,1/2可选
	uint8 parity;		// 奇偶校验位,0-无校验,1-奇校验,2-偶校验
}UARTMODE;

uint32 plantest[8];
 
uint8 rcv_buf;		// UART0数据接收缓冲区
volatile uint8 rcv_new;	// 接收新数据标志


/*
*********************************************************************************************************
** 函数名称 :RC5_ENCRYPT
** 函数功能 :加密程序
** 入口参数 :*pt1   输入明文	
                          *ct    输出密文
** 出口参数 :无
*********************************************************************************************************
*/
void RC5_ENCRYPT(uint32*pt,uint32*ct)         /*2WORD input pt/output ct */
{uint32 i,A=pt[0]+S[0],B=pt[1]+S[1];
for(i=1;i<=r;i++)                   //初始操作
{A=ROTL(A^B,B)+S[2*i];              //进行r轮异或和移位操作实现加密
B=ROTL(B^A,A)+S[2*i+1];
}
ct[0]=A;ct[1]=B;                    //赋以密文结果

l_ct[0]=A;
l_ct[1]=B;
}

/*
*********************************************************************************************************
** 函数名称 :RC5_ENCRYPT
** 函数功能 :解密程序
** 入口参数 :*ct 输入密文
                          *pt2输出明文
** 出口参数 :无
*********************************************************************************************************
*/
void RC5_DECRYPT(uint32*ct,uint32*pt)        /*2WORDinputct/outputpt */
{
 uint32 i,B=ct[1],A=ct[0];                   //初始操作
 for(i=r;i>0;i--)                            //进行r轮移位和异或操作实现解密
{
B=ROTR(B-S[2*i+1],A)^A;
A=ROTR(A-S[2*i],B)^B;
}
pt[1]=B-S[1];
pt[0]=A-S[0];                    //赋以明文结果

l_pt[0]=pt[0];
l_pt[0]=pt[1];
}


/*
*********************************************************************************************************
** 函数名称 :RC5_SETUP  
** 函数功能 :生成子密钥
** 入口参数 :密钥数组
** 出口参数 :无
*********************************************************************************************************
*/
void RC5_SETUP(unsigned char *K) /* secret input key K[0...b-1]      */
{  uint32 i,j,k,u=w/8,A,B,L[c]; 
   /* Initialize L, then S, then mix key into S */
   for (i=b-1,L[c-1]=0; i!=-1; i--)              //原密钥L自变形,L和K是同一密钥数组的不同划分形式
   L[i/u] = (L[i/u]<<8)+K[i];
   for (S[0]=P,i=1; i<t; i++)                    //生成2*(r+1)个初始子密钥
   S[i] = S[i-1]+Q;
   for (A=B=i=j=k=0; k<3*t; k++,i=(i+1)%t,j=(j+1)%c)   //子密钥S和原密钥L混合,进行3*t轮/* 3*t > 3*c */
     { A = S[i] = ROTL(S[i]+(A+B),3);  
       B = L[j] = ROTL(L[j]+(A+B),(A+B)); 
     } 
} 

/*
*********************************************************************************************************
** 函数名称 :UART0_SendByte()
** 函数功能 :向串口0发送1字节数据
** 入口参数 :dat	要发送的数据
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendByte (uint8 dat)
{
	U0THR = dat;	// 要发送的数据
}


/*
*********************************************************************************************************
** 函数名称 :IRQ_UART0()
** 函数功能 :串口0接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_UART0 (void)
{
    uint8 i;
	uint32 j;
	uint32 ppt[2];
	uint32 pt1[2],pt2[2],ct[2]={0,0};
	unsigned char key[b];
	if ((U0IIR & 0x0F) == 0x04)	
		rcv_new = 1;			// 设置接收到新的数据标志
			
		rcv_buf=U0RBR;		// 读取FIFO的数据,并清除中断	
	       
		plantest[ki] = rcv_buf;		// 读取FIFO的数据,并清除中断	
		ki++;
		if(ki==8)
		{
			ki=0;
	
	
	
	ppt[0]=(plantest[0]<<24)+(plantest[1]<<16)+(plantest[2]<<8)+plantest[3];  //实现移位相加
   	ppt[1]=(plantest[4]<<24)+(plantest[5]<<16)+(plantest[6]<<8)+plantest[7];

    
    pt1[0]=ppt[0]; 
    pt1[1]=ppt[1];
    for(j=0;j<b;j++) 
    key[j]=ct[0]%(255-j);
    
   RC5_SETUP(key);
   
   RC5_ENCRYPT(pt1,ct);

   /*
   for(i=0;i<16;i++)
   UART0_SendByte(ct[i]);
   */
   
   RC5_DECRYPT(ct,pt2);
   
   output[0]=pt2[0];
   for(i=3;i>=0;i--)
   {
   UART0_SendByte(output[0]>>8*i);       
   output[0]=(output[0]<<8;)
}
   
   }
/* UART0_SendByte(output[0]>>24);
   output[0]=output[0]<<8;
   UART0_SendByte(output[0]>>16);
   output[0]=output[0]<<8;
    UART0_SendByte(output[0]>>8);
    output[0]=output[0]<<8;
     UART0_SendByte(pt2[0]);
     */	
			
		
	VICVectAddr = 0x00;			// 中断处理结束
}


/*
*********************************************************************************************************
** 函数名称 :UART0_SendBuf()
** 函数功能 :向串口发送8字节数据
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendBuf (void)
{

	//uint8 i;
	UART0_SendByte(rcv_buf);  
	while ((U0LSR & 0x20) == 0);	// 等待数据发送完毕
}

/*
*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud	波特率
**			  set	模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功,  0-初始化失败
*********************************************************************************************************
*/
int8 UART0_Init (uint32 baud, UARTMODE set)
{
	uint32 bak;
	
	/* 参数过滤 */
	if ((baud ==0 ) || (baud > 115200))	return (0);
	if ((set.datab <5) || (set.datab > 8))	return (0);
	if ((set.stopb == 0) || (set.stopb > 2)) 	return (0);
	if (set.parity > 4)	return (0);
	
	/* 设置串口波特率 */
	U0LCR = 0x80;						// DLAB = 1	
	bak   = (Fpclk >> 4) / baud;
	U0DLM = bak >> 8;
	U0DLL = bak & 0xFF;
	
	/* 设置串口模式 */
	bak   = set.datab - 5;				// 设置字长
	if (set.stopb == 2)	bak |= 0x04;	// 判断是否为2位停止位
	
	if (set.parity != 0)
	{
		set.parity = set.parity - 1;
		bak |= 0x08;
	}
	bak |= set.parity << 4;				// 设置奇偶校验
	
	U0LCR = bak;
	
	return (1);
}



/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示。
** 调试说明 :需要PC串口显示终端软件如EasyARM.exe。
*********************************************************************************************************
*/
int main (void)
{
	UARTMODE set;

	set.datab  = 8;
	set.stopb  = 1;
	set.parity = 0;
	
	rcv_new = 0;
	
	PINSEL0 = 0x00000005;				// 设置I/O连接到UART0
	
	UART0_Init(115200, set);			// 串口初始化
	U0FCR = 0x01;						// 使能FIFO,并设置触发点为8字节
	U0IER = 0x01;						// 允许RBR中断,即接收中断
	
	IRQEnable();						// 使能IRQ中断
	/* 使能UART0中断 */
	VICIntSelect = 0x00000000;			// 设置所有的通道为IRQ中断
	VICVectCntl0 = 0x20 | 0x06;			// UART0分配到IRQ slot0,即最高优先级
	VICVectAddr0 = (uint32)IRQ_UART0;	// 设置UART0向量地址
	VICIntEnable = 1 << 0x06;			// 使能UART0中断
	/*if(num==7)
	num=0;*/
	while (1)
	{
		/*if (rcv_new == 1)
		{	
			rcv_new =0;
			UART0_SendBuf();
		}*/
	}
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/
/*uint32 i,j,k,pt1[2],pt2[2],ct[2]={0,0};
unsigned char key[b];
for(i=1;i<6;i++)                                            //Initialize pt1 and key pseudorandomly based on previous ct
pt1[0]=ct[0];pt1[1]=ct[1];
for(j=0;j<b;j++) key[j]=ct[0]%(255-j);        
 RC5_SETUP(key);
RC5_ENCRYPT(pt1,ct);            //加密	
RC5_DECRYPT(ct,pt2);            //解密
 */
 
 //差一个读入数据

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -