历史上的今天
返回首页

历史上的今天

今天是:2024年12月11日(星期三)

正在发生

2019年12月11日 | 数据的加密传输——单片机上实现TEA加密解密算法

2019-12-11 来源:eefocus

各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性。常用的加密解密算法比如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


推荐阅读

史海拾趣

兵字(BingZi)公司的发展小趣事

随着市场的不断变化和客户需求的日益多样化,兵字公司意识到,要想在市场中保持领先地位,就必须不断进行技术创新。于是,公司投入大量研发资源,成功研发出了小型精密互感器。这一创新产品不仅填补了市场空白,还为公司带来了可观的收益。同时,兵字公司也凭借这一技术突破,进一步巩固了在电子元器件领域的领先地位。

Chiefdom Electronic Co Ltd公司的发展小趣事

在快速发展的过程中,Chiefdom Electronic Co Ltd注重企业文化的建设。公司倡导创新、协作、诚信和担当的价值观,通过举办各类文化活动、培训项目等方式,增强员工的归属感和凝聚力。同时,公司还建立了完善的激励机制和晋升通道,为员工提供广阔的职业发展空间。这些举措使得公司拥有一支高效、团结、富有创造力的团队,为公司的持续发展提供了有力的保障。


这些故事仅作为示例,实际的公司发展历程可能会因市场环境、技术趋势、公司战略等多种因素而有所不同。如果您需要更具体的信息,建议直接查阅相关公司的官方资料或行业报告。

Control Sciences Inc公司的发展小趣事

Control Sciences Inc公司在电子行业的初期,就以其技术创新而闻名。公司团队不断研发新的控制技术,成功打破了当时行业的局限。他们推出的首款智能控制系统,不仅提高了生产效率,还大大降低了能源消耗,为电子行业带来了巨大的经济效益。这一创新成果使得Control Sciences Inc在业界崭露头角,赢得了众多客户的青睐。

Elpac公司的发展小趣事

作为一家有社会责任感的企业,Elpac公司始终关注环境保护和可持续发展。公司积极采用环保材料和清洁能源,努力降低生产过程中的能耗和排放。同时,Elpac公司还积极参与各种公益活动和社会事务,回馈社会、关爱弱势群体。这些举措不仅提升了公司的品牌形象和社会影响力,也为公司的长远发展注入了正能量。

以上是关于电子行业里某假设性“Elpac公司”的发展故事,希望对您有所帮助。

EasySync公司的发展小趣事

随着数字化和智能化技术的不断发展,EasySync公司也加快了数字化转型的步伐。公司引入先进的生产管理系统和智能制造设备,实现了生产过程的自动化和智能化。同时,公司还加强了对大数据和人工智能技术的研发和应用,为客户提供更加智能化、个性化的同步解决方案。

Aerotronics Marketing Inc公司的发展小趣事

Aerotronics Marketing Inc公司在电子行业中崭露头角,源于其一项革命性的无人机技术。公司研发团队历经数年努力,成功开发出一款具有高精度导航和稳定飞行能力的无人机,广泛应用于农业监测、地质勘探等领域。这一技术的推出,不仅填补了市场空白,还为公司赢得了大量订单和合作伙伴,推动了公司的快速发展。

问答坊 | AI 解惑

USB HID 自定义设备之 DS18B20 温度计(转)

转自:点点滴滴版主 http://www.pic16.com/bbs/dispbbs.asp?boardid=8&replyid=172309&id=46618&page=1&skin=0&Star=1 经过将近一个月的闭关。今天终于完成自定义USB HID 免驱动设备。其中由于系统问题,识别出来的HID 设备要驱动程序,害得我浪费 ...…

查看全部问答>

PNG显示

在EVC下,IImage可以对PNG解码,可是为什么透明部分是白色?下面是代码。请问要怎么解决?还有没有其它的方法解决PNG在EVC下的显示问题?     hr = FindResource(GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_PNG1), _T(\"PNG\"));  ...…

查看全部问答>

+++++++++GPRS数据串口转以太网

我的ARM开发板通过串口连接的GPRS MODEM上网,它也有以太网口,我想把接收的GPRS数据转发到以太网口上(它所在的局域网),请问难不难啊。…

查看全部问答>

单片机的汇编指令使用基础

1 .MOV A,Rn 寄存器内容送入累加器2 .MOV A,direct 直接地址单元中的数据送入累加器3 .MOV A,@Ri (i=0,1)间接RAM 中的数据送入累加器4 .MOV A,#data 立即数送入累加器5 .MOV Rn,A 累加器内容送入寄存器6 .MOV Rn,direct 直接地址单元中的数据送入寄 ...…

查看全部问答>

有没有人用过cycloneⅣ的lvds宏的啊

有没有人用过cycloneⅣ的lvds宏的啊,我现在遇到好几个问题,比如:不管tx_in的位宽是多少,输进去的却总是8位等等。很神奇。求助各位,已经弄了很久了。有用过的大神现身吧,帮帮我,感激不尽。…

查看全部问答>

C6455 TCP2中TCPIC0~15有一半的寄存器写不进去

在CCS3.3下,查看寄存器的值,发现TCP2中TCPIC0~TCPIC15中,有一半的寄存器不能write,分别是TCPIC(1,3,5,7,9,11,13,15),是因为哪个控制器锁住了吗? 情况紧急,请求各位帮助,谢谢!…

查看全部问答>

Android新功能:用谷歌搜索寻找丢失手机

谷歌本周宣布推出一项新功能,帮助用户通过桌面平台的搜索引擎去寻找丢失的Android手机。如果希望使用这一功能,用户需要知道自己的电脑在何处。谷歌同时表示,用户需要安装最新版谷歌Android应用才能使用这一功能。在升级之后,当用户在谷歌搜索引 ...…

查看全部问答>

帮忙看看用TPS22915B做的这个开关机电路有没有问题

本帖最后由 wgsxsm 于 2015-6-12 10:39 编辑 注:KEY 1,3硬件连接在一起的,请无视那个NC元件。 如上图所示,KEY按下,系统上电,MCU上电后将PWR_ON置高,系统处于开机状态; 长按KEY,通过检测PWR_DEC(平时为低)状态是否为高,持续时间达到3 ...…

查看全部问答>

揭秘手机锂电池的电量杀手

用“通货膨胀”这个经济术语来形容手机电池寿命可能再贴切不过了。几年前,即便是诸如三星Galaxy、摩托罗拉Droid的旗舰机型,通常也仅仅搭载了1600mAh左右的电池,但足以完整使用一整天。而现在,具有3000mAh电池容量的旗舰机型比比皆是,但很难满 ...…

查看全部问答>

模仿RA8875_RA8876做个图形LCD控制器,STM32跑emWin接VGA显示器测试OK

   看到STM32+RA8875+emWin做人机界面这么流行,于是也用FPGA模仿RA8875做了个图形LCD控制器。图形LCD控制器的系统主构架是:FPGA+DDR2+Nand-Flash,FPGA里面还跑了个8051,因为要做指令缓冲、FAT32文件系统、Nand-Flash驱动程序,这三 ...…

查看全部问答>