

上图为加密解密结果。
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;
}
}
}大家也可以玩玩.....
我要赚赏金
