TEA加密算法Demo

#include <stdio.h>
#include <stdint.h>
#include <string.h>

void encrypt (uint32_t v[], uint32_t k[]) {
    uint32_t v0=v[0], v1=v[1], sum=0, i;           /* set up */
    uint32_t delta=0x9e3779b9;                     /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];   /* cache key */
         
	printf("encrypt() v0=%08x,v1=%08x\n",v0,v1); 
	
	for (i=0; i < 32; i++) {                       /* basic cycle start */
        sum += delta;
        v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
    }                                              /* end cycle */
    v[0]=v0; v[1]=v1;
}
 
void decrypt (uint32_t v[], uint32_t k[]) {
    uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i;  /* set up */
    uint32_t delta=0x9e3779b9;                     /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];   /* cache key */
    for (i=0; i<32; i++) {                         /* basic cycle start */
        v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
        v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        sum -= delta;                                   
    }                                              /* end cycle */
    v[0]=v0; v[1]=v1;
}

#define N	40

int main() 
{
    uint8_t str[N];
	int i;
	uint32_t k[4]= {0, 0, 0, 0};
	uint8_t *pkey;
		
	memcpy(str,"my test stringsdfsfew2034442^&8*()\\r\\r12",N);
	//memcpy(str,"hello!!!",N);
	//memcpy(str,"12345678",N);
	pkey=(uint8_t *)&k;
	memcpy(pkey,"abcdef1234567890",16);
	
	printf("16进制Key是: ");
	for(i=0;i<16;i++)
		printf("%02x ",pkey[i]);
	printf("\n\n");
	printf("Long类型的Key是: ");
	for(i=0;i<4;i++)
		printf("%08x ",k[i]);
	printf("\n\n");
	//--------------------------------------------
	printf("加密前是:\n");
	for(i=0;i<N;i++)
		printf("%02x ",str[i]);	
	printf("\n\n");
	//----------------------------
	printf("密文:\n");
	for(i=0;i<N/8;i++)
		encrypt((uint32_t *)&str[i*8], k);	
		 	
	for(i=0;i<N;i++)
		printf("%02x ",str[i]);
	printf("\n\n");
	//--------------------------------------------
	printf("解开:\n");
	for(i=0;i<N/8;i++)
		decrypt((uint32_t *)&str[i*8], k);	
	for(i=0;i<N;i++)
		printf("%02x ",str[i]);
	printf("\n\n");
	
	printf("解密后字符串:%.*s\n",sizeof(str),str);
	
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值