这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » C语言试玩TEA加密解密

共1条 1/1 1 跳转至

C语言试玩TEA加密解密

高工
2017-10-13 11:16:07     打赏

上图为加密解密结果。

TEA加密解密比较快也非常简单,当然也很难攻破,加密强度与加密轮数成正比,下面编写的代码中加密轮数为16.  密钥是128bits。

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

typedef unsigned char               uint8_t;
typedef unsigned short              uint16_t;
typedef unsigned int                uint32_t;



#define TEA_DELTA                  0x9e3779b9
#define TEA_ENCRYPT_TIMES          16

static const uint8_t tea_fill_data[8] = {0x12,0x23,0x34,0x45,0x56,0x67,0x78,0x89};

static uint8_t tea_key[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

int tea_set_key()
{
	uint8_t i = 0;
	printf("enter your key (16bytes): \n\r");
	for(i = 0;i < 16;i++)
	{
		scanf("%d", &tea_key[i]);
	}
	return 0;
}

int tea_fill_buff(uint8_t *text, uint32_t size)
{
	uint32_t i = 0;
	if((size & 0x7) == 0x0)
	{
		return size;
	}
	for(i = 0;i < (8 - (size & 0x7));i++)
	{
		text[size + i] = tea_fill_data[i];
	}
	return (size + i);
}


static int tea_encrypt_group(uint32_t *text, uint32_t *key)
{
	uint32_t sum = 0, v0 = text[0], v1 = text[1];
	uint32_t k0 = key[0], k1 = key[1], k2 = key[2], k3 = key[3];
	uint8_t i = 0;

	for(i = 0;i < TEA_ENCRYPT_TIMES;i++)
	{
		sum += TEA_DELTA;
		v0 += (v1 << 4) + k0 ^ v1 + sum ^ (v1 >> 5) + k1;
		v1 += (v0 << 4) + k2 ^ v0 + sum ^ (v0 >> 5) + k3;
	}
	text[0] = v0;
	text[1] = v1;
	return 0;
}

static int tea_decrypt_group(uint32_t *text, uint32_t *key)
{
	uint32_t sum = TEA_DELTA * TEA_ENCRYPT_TIMES, v0 = text[0], v1 = text[1];
	uint32_t k0 = key[0], k1 = key[1], k2 = key[2], k3 = key[3];
	uint8_t i = 0;

	for(i = 0;i < TEA_ENCRYPT_TIMES;i++)
	{
		v1 -= (v0 << 4) + k2 ^ v0 + sum ^ (v0 >> 5) + k3;
		v0 -= (v1 << 4) + k0 ^ v1 + sum ^ (v1 >> 5) + k1;
		sum -= TEA_DELTA;
	}
	text[0] = v0;
	text[1] = v1;
	return 0;
}

int tea_encrypt(uint8_t *text, uint32_t size)
{
	uint32_t number = size >> 3;
	uint8_t  i = 0;
	
	if(text == NULL || (size & 0x7) != 0)
	{
		printf("param invalid %d ....",(uint8_t)(size & 0x7));
		return -1;
	}
	for(i = 0;i < number;i++)
	{
		tea_encrypt_group(&(((uint32_t *)text)[i * 2]), (uint32_t *)tea_key);
	}
	return 0;
}


int tea_decrypt(uint8_t *text, uint32_t size)
{
	uint32_t number = size >> 3;
	uint8_t  i = 0;
	
	if(text == NULL || (size & 0x7) != 0)
	{
		printf("param invalid %d ....",(uint8_t)(size & 0x7));
		return -1;
	}
	for(i = 0;i < number;i++)
	{
		tea_decrypt_group(&(((uint32_t *)text)[i * 2]), (uint32_t *)tea_key);
	}
	return 0;
}



int main()
{
	uint8_t sel;
	uint8_t tmp_buf[128];
	uint32_t count, i;
	printf("*********************************************\n\r");
	printf("******TEA encryption and decryption *********\n\r");
	printf("*********************************************\n\r");
	while(1)
	{
		printf("***1. enter your key \n\r");
		printf("***2. data encryption \n\r");
		printf("***3. data decryption \n\r");
		printf("***enter number : \n\r");
		scanf("%d", &sel);
		switch(sel)
		{
			case 1: 
				if(0 != tea_set_key())
				{
					printf("fail to create key ... \n\r");
				}
				break;
			case 2:
				printf("enter your information: \n\r");
				scanf("%s", (char *)tmp_buf);
				count = strlen((char *)tmp_buf);
				count = tea_fill_buff(tmp_buf, count);
				printf("::::\n\r");
				tea_encrypt(tmp_buf, count);
				for(i = 0;i < count;i++)
				{
					printf("%d ", tmp_buf[i]);
				}
				printf("\n\r");
				break;
			case 3:
				printf("enter your data len: \n\r");
				scanf("%d", &count);
				printf("please enter %d numbers: \n\r", count);
				for(i = 0;i < count; i++)
				{
					scanf("%d", &tmp_buf[i]);
				}
				printf("::::\n\r");
				tea_decrypt(tmp_buf, count);
				for(i = 0;i <= count;i++)
				{
					printf("%c", tmp_buf[i]);
				}
				printf("\n\r");				
				break;
			default: 
				return 0;
		}
	}
}

大家也可以玩玩.....




关键词: 加密解密     TEA     C    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]