Tea加解密算法(可直接运行)

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

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

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

//加密入口
uint16_t encrypt_new(uint8_t *src,uint16_t size_src,uint8_t *key){
        uint8_t a = 0;
        uint16_t i = 0;
        uint16_t num = 0;
        
        a = size_src % 8;
        if (a != 0)//数据不够8位,后面补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;
}


//解密核心算法
void tea_decrypt(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];  
    sum=delta*32;
    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;
}

//解密入口
uint16_t decrypt_new(uint8_t *src,uint16_t size_src,uint8_t *key){
        uint16_t i = 0;
        uint16_t num = 0;

        num = size_src / 8;
        for (i = 0;i < num;i++)
        {
          tea_decrypt((uint32_t *)(src + i * 8),(uint32_t *)key);
        }        
        return size_src;
}


int main(){
   
 unsigned char ENCRYPT_ARRAY[16] ={‘1’,‘2’,‘3’.......} ;//16位字符(根据自己业务补全)
 unsigned char jiamibuf1[32]={0x60,0x00,......};//32位字符(根据自己业务补全,注意:是16进制的)
 encrypt_new(jiamibuf1,32,ENCRYPT_ARRAY);
  printf("加密数据:\n");
  for(int j = 0; j < 32;j++){    
    printf("%X",jiamibuf1[j]);
  } 
   printf("\n");
  printf("解密数据:\n");
  decrypt_new(jiamibuf1,ENCRYPT_ARRAY);
 for(int i = 0; i < 32;i++){
     printf("%X",jiamibuf1[i]);
     printf("\n");
 } 
  return 0;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TEA算法是一种对称加密算法,它的加密和解密过程是相同的。TEA算法的加密过程如下: 1. 将明文分成两个32位的块L0和R0。 2. 将L0和R0分别与密钥的前两个32位进行异或运算,得到L1和R1。 3. 将L1和R1分别与密钥的第三个和第四个32位进行异或运算,得到L2和R2。 4. 重复上述步骤,直到得到L16和R16。 5. 将L16和R16合并成一个64位的块,即为密文。 TEA算法的解密过程与加密过程类似,只是将密钥的顺序颠倒,即先用密钥的最后两个32位进行异或运算,然后再用前两个32位进行异或运算,最终得到明文。 TEA算法的改进版本有XTEA、XXTEA和BLOCK TEA等,它们的加密过程类似,只是轮数和密钥长度有所不同。 下面是TEA算法的Python实现代码: ```python def encrypt_tea(v, k): delta = 0x9e3779b9 sum = 0 k = [k[i:i+4] for i in range(0, len(k), 4)] v = [v[i:i+4] for i in range(0, len(v), 4)] for i in range(32): sum += delta v0 = v[0] v1 = v[1] v[0] += ((v[1] << 4) + int(k[i%4])) ^ (v[1] + sum) ^ ((v[1] >> 5) + int(k[(i+1)%4])) v[1] += ((v[0] << 4) + int(k[(i+2)%4])) ^ (v[0] + sum) ^ ((v[0] >> 5) + int(k[(i+3)%4])) return b''.join(v) def decrypt_tea(v, k): delta = 0x9e3779b9 sum = delta * 32 k = [k[i:i+4] for i in range(0, len(k), 4)] v = [v[i:i+4] for i in range(0, len(v), 4)] for i in range(32): v1 = v[1] v0 = v[0] v[1] -= ((v[0] << 4) + int(k[(i+2)%4])) ^ (v[0] + sum) ^ ((v[0] >> 5) + int(k[(i+3)%4])) v[0] -= ((v[1] << 4) + int(k[i%4])) ^ (v[1] + sum) ^ ((v[1] >> 5) + int(k[(i+1)%4])) sum -= delta return b''.join(v) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值