当前位置:首页 > 单片机 > 单片机
[导读]  各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性。常用的加密解密算法比如DES、RSA等,受限于单片机的内存和运算速度,实现

  各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性。常用的加密解密算法比如DES、RSA等,受限于单片机的内存和运算速度,实现起来比较困难,但一种叫TEA的加密算法特别适合单片机使用。

  TEA(Tiny Encryption Algorithm)是一种简单高效的加密算法,以加密解密速度快,实现简单著称。算法很简单,TEA算法每一次可以操作64-bit(8-byte),采用128-bit(16-byte)作为key,算法采用迭代的形式,推荐的迭代轮数是64轮,最少32轮。目前我只知道QQ一直用的是16轮TEA。

  我之前做过一个数字的无线对讲机,把语音数据加密后发送,双方事先规定好公共的密钥,就可以进行加密和解密了。至于TEA算法速度,在我看来确实很快,我当时用的是16位的msp430单片机,晶振只有6M,每秒钟大概可以进行两三百次加密和解密的操作(一次加密和解密32字节)。

  说到加密,最简单的方式就是把要发送的数据和同样长度的密码进行异或运算,得到新的数据就是加密后的数据,然后,接收方把加密数据和密码进行异或就能得到原始数据。但这种异或的方法安全性如何,我也说不清楚。

  下面上传了c++实现的TEA算法,可以在vc里面调试看看。我把它改了改,让它适合单片机使用,下面的TEA.h和TEA.c可以包含在你的工程里面。使用时,根据你所要加密的数据包长度修改宏定义BLOCK_SIZE,密钥的长度是16字节。数据和密钥都是存放在数组里面的,比如:



//TEA密钥

unsigned char TEA_key[16]=

{

0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,

0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10

};


//数据缓冲区

unsigned char TX_buffer[32];

unsigned char RX_buffer[32];


加密时使用函数:

btea_encrypt(TX_buffer,TEA_key); //TEA加密

这样,数组TX_buffer里面的新内容就是加密后的数据。


接收到的密文数据存放在RX_buffer里面,调用下面函数:

decrpyt(RX_buffer,TEA_key); //TEA解密

就能得到之前的明文。



/*******************

TEA加密解密算法

*******************/


#include "TEA.h"



#define MX (z>>5^y<<2)+(y>>3^z<<4)^(sum^y)+(k[p&3^e]^z)

#define DELTA 0x9e3779b9

#define S_LOOPTIME 1 //5

#define BLOCK_SIZE 31 //PAGE_SIZE,根据你所要加密的数据包长度修改此参数(单位:字节)


/*

*key maybe 128bit =16 Bytes.

*buf maybe BLOCK_SIZE

*/


void btea_encrypt( unsigned char* buf, unsigned char* key )

{

unsigned char n=BLOCK_SIZE/4;

unsigned long *v=(unsigned long *)buf;

unsigned long *k=(unsigned long *)key;

unsigned long z = v[n - 1],y = v[0],sum = 0,e ;

unsigned char p,q ;

// Coding Part

q = S_LOOPTIME + 52 / n ;

while ( q-- > 0 )

{

sum += DELTA ;

e = sum >> 2 & 3 ;

for ( p = 0 ; p < n - 1 ; p++ )

y = v[p + 1],

z = v[p] += MX;

y = v[0] ;

z = v[n - 1] += MX;

}

}



/*

*key maybe 128bit =16Bytes.

*buf maybe BLOCK_SIZE

inbuf == outbuf == buf

*/


void btea_decrpyt( unsigned char* buf, unsigned char* key )

{

unsigned char n=BLOCK_SIZE/4;

unsigned long *v=(unsigned long *)buf;

unsigned long *k=(unsigned long *)key;

unsigned long z = v[n - 1],y = v[0],sum = 0,e ;

unsigned char p,q ;

//Decoding Part...

q = S_LOOPTIME + 52 / n ;

sum = q * DELTA ;

while ( sum != 0 )

{

e = sum >> 2 & 3 ;

for ( p = n - 1 ; p > 0 ; p-- )

z = v[p - 1],

y = v[p] -= MX;

z = v[n - 1] ;

y = v[0] -= MX;

sum -= DELTA ;

}

}




#ifndef __TEA_h__

#define __TEA_h__



//TEA加密函数

void btea_encrypt( unsigned char* buf, unsigned char* key );

//TEA解密函数

void btea_decrpyt( unsigned char* buf, unsigned char* key );



#endif



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

8位单片机在嵌入式设计领域已经成为半个多世纪以来的主流选择。尽管嵌入式系统市场日益复杂,8位单片机依然不断发展,积极应对新的挑战和系统需求。如今,Microchip推出的8位PIC®和AVR®单片机系列,配备了先进的独立...

关键字: 单片机 嵌入式 CPU

在嵌入式系统开发中,程序烧录是连接软件设计与硬件实现的关键环节。当前主流的单片机烧录技术已形成ICP(在电路编程)、ISP(在系统编程)、IAP(在应用编程)三大技术体系,分别对应开发调试、量产烧录、远程升级等不同场景。...

关键字: 单片机 ISP ICP IAP 嵌入式系统开发

在嵌入式系统开发中,看门狗(Watchdog Timer, WDT)是保障系统可靠性的核心组件,其初始化时机的选择直接影响系统抗干扰能力和稳定性。本文从硬件架构、软件流程、安全规范三个维度,系统分析看门狗初始化的最佳实践...

关键字: 单片机 看门狗 嵌入式系统

本文中,小编将对单片机予以介绍,如果你想对它的详细情况有所认识,或者想要增进对它的了解程度,不妨请看以下内容哦。

关键字: 单片机 开发板 Keil

随着单片机系统越来越广泛地应用于消费类电子、医疗、工业自动化、智能化仪器仪表、航空航天等各领域,单片机系统面临着电磁干扰(EMI)日益严重的威胁。电磁兼容性(EMC)包含系统的发射和敏感度两方面的问题。

关键字: 单片机 电磁兼容

以下内容中,小编将对单片机的相关内容进行着重介绍和阐述,希望本文能帮您增进对单片机的了解,和小编一起来看看吧。

关键字: 单片机 复位电路

在这篇文章中,小编将为大家带来单片机的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 单片机 异常复位

今天,小编将在这篇文章中为大家带来单片机的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: 单片机 仿真器

单片机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对它的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 单片机 中断 boot

一直以来,单片机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来单片机的相关介绍,详细内容请看下文。

关键字: 单片机 数字信号 模拟信号
关闭