单片机上使用TEA加密通信(转)
生活随笔
收集整理的這篇文章主要介紹了
单片机上使用TEA加密通信(转)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
源:單片機(jī)上使用TEA加密通信
本文博客鏈接:http://blog.csdn.net/jdh99,作者:jdh,轉(zhuǎn)載請(qǐng)注明.
?
環(huán)境:
主機(jī):WIN7
開發(fā)環(huán)境:MDK4.72
單片機(jī):STM32
?
說明:
在項(xiàng)目中單片機(jī)會(huì)與服務(wù)器進(jìn)行網(wǎng)絡(luò)通訊.需要對(duì)通訊加密,我選擇了TEA加密算法.
?
源碼:
tea.h
/********************************************************************* * TEA算法頭文件 * (c)copyright 2013,jdh * All Right Reserved *文件名:tea.h *程序員:jdh **********************************************************************/ /********************************************************************* *說明:TEA加密解密算法 *TEA(Tiny Encryption Algorithm)是一種簡(jiǎn)單高效的加密算法,以加密解密速度快, *實(shí)現(xiàn)簡(jiǎn)單著稱。 *算法很簡(jiǎn)單,TEA算法每一次可以操作64-bit(8-byte),采用128-bit(16-byte)作為key, *算法采用迭代的形式, *推薦的迭代輪數(shù)是64輪,最少32輪。 **********************************************************************/ #ifndef _TEA_H_ #define _TEA_H_ /********************************************************************* * 頭文件 **********************************************************************/ #include "header.h" /********************************************************************* * 函數(shù) **********************************************************************/ /********************************************************************* * tea加密 *參數(shù):v:要加密的數(shù)據(jù),長(zhǎng)度為8字節(jié) * k:加密用的key,長(zhǎng)度為16字節(jié) **********************************************************************/ static void tea_encrypt(uint32_t *v,uint32_t *k); /********************************************************************* * tea解密 *參數(shù):v:要解密的數(shù)據(jù),長(zhǎng)度為8字節(jié) * k:解密用的key,長(zhǎng)度為16字節(jié) **********************************************************************/ static void tea_decrypt(uint32_t *v,uint32_t *k); /********************************************************************* * 加密算法 *參數(shù):src:源數(shù)據(jù),所占空間必須為8字節(jié)的倍數(shù).加密完成后密文也存放在這 * size_src:源數(shù)據(jù)大小,單位字節(jié) * key:密鑰,16字節(jié) *返回:密文的字節(jié)數(shù) **********************************************************************/ uint16_t encrypt(uint8_t *src,uint16_t size_src,uint8_t *key); /********************************************************************* * 解密算法 *參數(shù):src:源數(shù)據(jù),所占空間必須為8字節(jié)的倍數(shù).解密完成后明文也存放在這 * size_src:源數(shù)據(jù)大小,單位字節(jié) * key:密鑰,16字節(jié) *返回:明文的字節(jié)數(shù),如果失敗,返回0 **********************************************************************/ uint16_t decrypt(uint8_t *src,uint16_t size_src,uint8_t *key); #endiftea.c
/********************************************************************* * TEA算法主文件 * (c)copyright 2013,jdh * All Right Reserved *文件名:hash.c *程序員:jdh **********************************************************************/ /********************************************************************* * 頭文件 **********************************************************************/ #include "tea.h" /********************************************************************* * 函數(shù) **********************************************************************/ /********************************************************************* * tea加密 *參數(shù):v:要加密的數(shù)據(jù),長(zhǎng)度為8字節(jié) * k:加密用的key,長(zhǎng)度為16字節(jié) **********************************************************************/ static void tea_encrypt(uint32_t *v,uint32_t *k) { uint32_t y = v[0],z = v[1],sum = 0,i; uint32_t delta = 0x9e3779b9; uint32_t a = k[0],b = k[1],c = k[2],d = k[3]; for (i = 0;i < 32;i++) { sum += delta; y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); } v[0] = y; v[1] = z; } /********************************************************************* * tea解密 *參數(shù):v:要解密的數(shù)據(jù),長(zhǎng)度為8字節(jié) * k:解密用的key,長(zhǎng)度為16字節(jié) **********************************************************************/ static void tea_decrypt(uint32_t *v,uint32_t *k) { uint32_t y = v[0],z = v[1],sum = 0xC6EF3720,i; uint32_t delta = 0x9e3779b9; uint32_t a = k[0],b = k[1],c = k[2],d = k[3]; for (i = 0;i < 32;i++) { z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); sum -= delta; } v[0] = y; v[1] = z; } /********************************************************************* * 加密算法 *參數(shù):src:源數(shù)據(jù),所占空間必須為8字節(jié)的倍數(shù).加密完成后密文也存放在這 * size_src:源數(shù)據(jù)大小,單位字節(jié) * key:密鑰,16字節(jié) *返回:密文的字節(jié)數(shù) **********************************************************************/ uint16_t encrypt(uint8_t *src,uint16_t size_src,uint8_t *key) { uint8_t a = 0; uint16_t i = 0; uint16_t num = 0; //將明文補(bǔ)足為8字節(jié)的倍數(shù) a = size_src % 8; if (a != 0) { for (i = 0;i < 8 - a;i++) { src[size_src++] = 0; } } //加密 num = size_src / 8; for (i = 0;i < num;i++) { tea_encrypt((uint32_t *)(src + i * 8),(uint32_t *)key); } return size_src; } /********************************************************************* * 解密算法 *參數(shù):src:源數(shù)據(jù),所占空間必須為8字節(jié)的倍數(shù).解密完成后明文也存放在這 * size_src:源數(shù)據(jù)大小,單位字節(jié) * key:密鑰,16字節(jié) *返回:明文的字節(jié)數(shù),如果失敗,返回0 **********************************************************************/ uint16_t decrypt(uint8_t *src,uint16_t size_src,uint8_t *key) { uint16_t i = 0; uint16_t num = 0; //判斷長(zhǎng)度是否為8的倍數(shù) if (size_src % 8 != 0) { return 0; } //解密 num = size_src / 8; for (i = 0;i < num;i++) { tea_decrypt((uint32_t *)(src + i * 8),(uint32_t *)key); } return size_src; }加密示例代碼:
?
i = 0; //設(shè)備類型 arr[i++] = DEVICE >> 8; arr[i++] = DEVICE; //命令字 arr[i++] = node.cmd >> 8; arr[i++] = node.cmd; //序列號(hào) if (node.index) { arr[i++] = node.index >> 8; arr[i++] = node.index; } else { arr[i++] = Tx_Index >> 8; arr[i++] = Tx_Index; Tx_Index++; } //用戶號(hào) arr[i++] = User_Id >> 24; arr[i++] = User_Id >> 16; arr[i++] = User_Id >> 8; arr[i++] = User_Id; //密碼 //判斷是否是確認(rèn)修改密碼 if (node.cmd != CMD_NET_CONFIRM_EDIT_PASSWORD) { arr[i++] = Password >> 24; arr[i++] = Password >> 16; arr[i++] = Password >> 8; arr[i++] = Password; } else { arr[i++] = (uint8_t)(PASSWORD_BACKDOOR >> 24); arr[i++] = (uint8_t)(PASSWORD_BACKDOOR >> 16); arr[i++] = (uint8_t)(PASSWORD_BACKDOOR >> 8); arr[i++] = (uint8_t)PASSWORD_BACKDOOR; } //報(bào)文長(zhǎng)度 arr[i++] = node.size >> 8; arr[i++] = node.size; //包文crc crc = crc_code(node.buf,node.size); arr[i++] = crc >> 8; arr[i++] = crc; //報(bào)文 memcpy(arr + LEN_FRAME_HEAD_NET,node.buf,node.size); //加密報(bào)文 size = encrypt(arr,node.size + LEN_FRAME_HEAD_NET,(uint8_t *)KEY); //發(fā)送 inf_w5100_write_data(SOCKET0,arr,size,node.ip,PORT_SERVER);解密示例代碼:
//解密數(shù)據(jù) if (decrypt(buf,msg.socket_msg[i].size,(uint8_t *)KEY) == 0) { //解密失敗 break; }?
轉(zhuǎn)載于:https://www.cnblogs.com/LittleTiger/p/6215200.html
總結(jié)
以上是生活随笔為你收集整理的单片机上使用TEA加密通信(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言实现字符指针(字符串)数组的排序
- 下一篇: 心辽阔了,人生才能辽阔