数据的加密传输——单片机上实现TEA加密解密算法

http://www.eeworld.com.cn/mcu/article_2016121632367.html

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

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
RSA算法是一种非对称加密算法,常用于数据加密和数字签名等。在前端使用js实现RSA算法加密,后端使用Java实现RSA算法解密,具体步骤如下: 前端(js)实现: 1. 生成RSA密钥对,代码如下: ```javascript function generateRSAKey() { var crypt = new JSEncrypt({ default_key_size: 1024 }); crypt.getKey(); return crypt; } ``` 2. 使用公钥加密数据,代码如下: ```javascript function encryptData(data, publicKey) { var crypt = new JSEncrypt(); crypt.setKey(publicKey); var encryptedData = crypt.encrypt(data); return encryptedData; } ``` 后端(Java)实现: 1. 使用私钥解密数据,代码如下: ```java public static String decryptData(String data, String privateKey) throws Exception { byte[] dataBytes = Base64.decodeBase64(data); byte[] keyBytes = Base64.decodeBase64(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateK); byte[] decryptedData = cipher.doFinal(dataBytes); return new String(decryptedData); } ``` 2. 生成RSA密钥对,代码如下: ```java public static Map<String, String> generateRSAKey() throws Exception { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(1024); KeyPair keyPair = keyPairGen.generateKeyPair(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); Map<String, String> keyMap = new HashMap<String, String>(); keyMap.put("publicKey", Base64.encodeBase64String(publicKey.getEncoded())); keyMap.put("privateKey", Base64.encodeBase64String(privateKey.getEncoded())); return keyMap; } ``` 注意:在前端和后端使用RSA算法加密和解密的时候,需要使用相同的密钥对(即公钥和私钥)。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值