Newer
Older
BIRMM-GT200N / TEA.c
/*********************************************************************
*						   TEA算法主文件
*						(c)copyright 2013,jdh
*						  All Right Reserved
*文件名:hash.c
*程序员:jdh
**********************************************************************/

/*********************************************************************
*							头文件
**********************************************************************/

#include "TEA.h"
#include "stdio.h"
#include "string.h"
/*********************************************************************
*							函数
**********************************************************************/

/*********************************************************************
*							tea加密
*参数:v:要加密的数据,长度为8字节
*     k:加密用的key,长度为16字节
**********************************************************************/

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解密
*参数:v:要解密的数据,长度为8字节
*     k:解密用的key,长度为16字节
**********************************************************************/

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;
}

/*********************************************************************
*							加密算法
*参数:src:源数据,所占空间必须为8字节的倍数.加密完成后密文也存放在这
*     size_src:源数据大小,单位字节
*     key:密钥,16字节
*返回:密文的字节数
**********************************************************************/

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;

	//将明文补足为8字节的倍数
	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;
}

/*********************************************************************
*							解密算法
*参数:src:源数据,所占空间必须为8字节的倍数.解密完成后明文也存放在这
*     size_src:源数据大小,单位字节
*     key:密钥,16字节
*返回:明文的字节数,如果失败,返回0
**********************************************************************/

uint16_t decrypt(uint8_t *src,uint16_t size_src,uint8_t *key)
{
	uint16_t i = 0;
	uint16_t num = 0;

	//判断长度是否为8的倍数
	if (size_src % 8 != 0)
	{
		printf("\r\n 数据长度不是8字节的倍数!!");
		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;
}


uint16_t Tea_Encrypt(uint8_t *src,uint16_t size_src)
{
	unsigned char TEA_key[16];
	unsigned char i=0,size;
	memcpy(TEA_key,TEA_KEY,TEA_KEY_LEN);//做运算之前先要设置好密钥。

	printf("\r\n==============================================\r\n");
	printf("\r\ndat:");
	for(i=0; i<size_src; i++) printf(" %.2x",src[i]);
	size = encrypt(src,size_src,(uint8_t *)TEA_key);
	printf("\r\ndat:");
	for(i=0; i<size; i++) printf(" %.2x",src[i]);

	return size;
}


uint16_t Tea_Decrypt(uint8_t *src,uint16_t size_src)
{
	unsigned char TEA_key[16];
	unsigned char i=0,size;
	memcpy(TEA_key,TEA_KEY,TEA_KEY_LEN);//做运算之前先要设置好密钥。

	printf("\r\n==============================================\r\n");
	printf("\r\ndat:");
	for(i=0; i<size_src; i++) printf(" %.2x",src[i]);

	size = decrypt(src,size_src,(uint8_t *)TEA_key);
	printf("\r\ndat:");
	for(i=0; i<size_src; i++) printf(" %.2x",src[i]);
	printf("\r\n");

	return size;

}