首页 > 编程语言 >TEA算法相关

TEA算法相关

时间:2024-08-24 17:05:51浏览次数:10  
标签:TEA sum v0 v1 算法 key text 相关 uint32

TEA算法相关

TEA

TEA, Tiny Encryption Algorithm, 微型加密算法

#include <stdint.h>

void encrypt (uint32_t v[2], const uint32_t k[4]) {
    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 */
    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[2], const uint32_t k[4]) {
    uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i;  /* set up; sum is (delta << 5) & 0xFFFFFFFF */
    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;
}

XTEA

XTEA, eXtended TEA, 扩展的TEA算法, 使用更复杂的key处理,移位、异或、相加的重新排布

#include <stdint.h>

/* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */

void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
    for (i=0; i < num_rounds; i++) {
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
    }
    v[0]=v0; v[1]=v1;
}

void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
    for (i=0; i < num_rounds; i++) {
        v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
        sum -= delta;
        v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
    }
    v[0]=v0; v[1]=v1;
}

XXTEA

XXTEA, Corrected Block TEA

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

#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))

void btea(uint32_t* v, int n, uint32_t const key[4]) {
    uint32_t y, z, sum;
    unsigned p, rounds, e;
    if (n > 1) {          /* Coding Part */
        rounds = 6 + 52 / n;
        sum = 0;
        z = v[n - 1];
        do {
            sum += DELTA;
            e = (sum >> 2) & 3;
            for (p = 0; p < n - 1; p++) {
                y = v[p + 1];
                z = v[p] += MX;
            }
            y = v[0];
            z = v[n - 1] += MX;
        } while (--rounds);
    }
    else if (n < -1) {  /* Decoding Part */
        n = -n;
        rounds = 6 + 52 / n;
        sum = rounds * DELTA;
        y = v[0];
        do {
            e = (sum >> 2) & 3;
            for (p = n - 1; p > 0; p--) {
                z = v[p - 1];
                y = v[p] -= MX;
            }
            z = v[n - 1];
            y = v[0] -= MX;
            sum -= DELTA;
        } while (--rounds);
    }
}

int main() {
    char text[] = "Improve the world!";
    char key[] = "Just do it.";

    // 1. 新分配空间,用空字节填充text至4的倍数,最后使用4字节保存明文长度
    int text_len = strlen(text);
    int text_size = (text_len + 3) / 4 * 4 + 4;
    char* padded_text = (char*)malloc(text_size);
    memset(padded_text, 0, text_size);
    memcpy(padded_text, text, text_len);
    *(uint32_t*)(padded_text + text_size - 4) = text_len;

    // 2. 新分配空间,用空字节填充key为16个字节
    int key_len = strlen(key);
    //int key_size = (key_len + 3) / 4 * 4;
    int key_size = 16;
    char* padded_key = (char*)malloc(key_size);
    memset(padded_key, 0, key_size);
    memcpy(padded_key, key, key_len);

    // 3. 加密,输出加密后的内容
    uint32_t* text_uint32 = (uint32_t*)padded_text;
    uint32_t* key_uint32 = (uint32_t*)padded_key;
    btea(text_uint32, text_size / 4, key_uint32);
    printf("encrypted:\n");
    for (int i = 0; i < text_size / 4; i++) {
        printf("0x%08x,", text_uint32[i]);
    }
    printf("\n");
    for (int i = 0; i < text_size / 4; i++) {
        unsigned char bytes[4];
        memcpy(bytes, &text_uint32[i], 4); // 将uint32_t值复制到字节数组中
        for (int j = 0; j < 4; j++) {
            printf("%02x", bytes[j]);
            if (j < 3) {
                printf(" "); // 在字节之间添加空格,除了最后一个字节
            }
        }
        if (i < text_size - 1) {
            printf(" "); // 在每个uint32_t之间添加空格,除了最后一个
        }
    }
    printf("\n");

    // 4. 解密,输出解密后的内容
    btea(text_uint32, -text_size / 4, key_uint32);
    int original_len = *(uint32_t*)(text_uint32 + text_size / 4 - 1);
    printf("decrypted:\n%.*s\n", original_len, text_uint32);

    free(padded_text);
    free(padded_key);

    return 0;
}
/*
encrypted:
0x90f08367,0x9c5c4986,0x8f86feb4,0x2b85edd6,0x67b79425,0xdaf04cd4,
67 83 f0 90 86 49 5c 9c b4 fe 86 8f d6 ed 85 2b 25 94 b7 67 d4 4c f0 da
decrypted:
Improve the world!
*/

其它

很容易根据常数 0x9E3779B9 判断加密算法是否和TEA相关,所以有时会换成 -0x61C88647 的形式。

原链接

  1. https://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm
  2. https://en.wikipedia.org/wiki/XTEA
  3. https://en.wikipedia.org/wiki/XXTEA

2021/11/16

标签:TEA,sum,v0,v1,算法,key,text,相关,uint32
From: https://www.cnblogs.com/-rvy-/p/18377942

相关文章

  • python常用的算法
    以下是常用的算法及其详细介绍,包括排序算法、查找算法、基础算法和图算法,同时我也会提到每种数据结构的特性、优缺点及使用场景,并给出示例。一、排序算法1.冒泡排序(BubbleSort)冒泡排序是一种简单的排序算法。它通过重复遍历要排序的数列,比较每对相邻元素并交换它们的位......
  • 力扣热题100_贪心算法_55_跳跃游戏
    文章目录题目链接解题思路解题代码题目链接55.跳跃游戏给你一个非负整数数组nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回true;否则,返回false。示例1:输入:nums=[......
  • C++相关知识
     string倒排reverse#include<iostream>#include<string>#include<algorithm>intmain(){std::stringstr="Hello,World!";std::reverse(str.begin(),str.end());std::cout<<str<<std::endl;r......
  • 亦菲喊你来学机器学习(10) --决策树算法
    文章目录决策树一、基本定义二、学习过程三、剪枝处理四、决策树的特点五、构建模型训练模型测试模型总结决策树机器学习中的决策树算法是一种基本的分类与回归方法,它通过树状结构建立决策模型,以解决分类和回归问题。以下是对决策树算法的详细解析:一、基本定义决......
  • Steam共享库被锁怎么办?Steam共享库锁定问题全面解析与解锁指南
    当Steam共享库被锁定时,玩家可能会遇到无法访问或共享游戏库的问题。以下是对Steam共享库锁定问题的全面解析与解锁指南:一、理解Steam共享库锁定的原因同步问题:可能是由于Steam客户端的同步问题导致的,例如账户状态未及时更新。账户使用冲突:如果其他家庭成员或朋友正在使用共......
  • 【排序算法】八大排序(下)(c语言实现)(附源码)
    ......
  • Visio 2021安装教程及相关问题和下载
    MicrosoftVisio2021是一款功能强大的图表和流程图设计工具,提供直观的方式来创建和编辑各种图表类型,如流程图、组织结构图、网络图和平面图等。作为Visio系列的最新版本,Visio2021引入了更加现代化的用户界面,使图表的定制和管理更加简便。此外,Visio2021还增加了多项智......
  • ChatGPT等大模型高效调参大法——PEFT库的算法简介
    随着ChatGPT等大模型(LargeLanguageModel)的爆火,而且目前业界已经发现只有当模型的参数量达到100亿规模以上时,才能出现一些在小模型无法得到的涌现能力,比如in_contextlearing和chainofthougt。深度学习似乎朝着模型越来越大的方向一去不复。而对于这些通用的大模型如......
  • 网络安全人才缺口大 每年相关专业毕业生仅8千余人
    前言“目前我国网络安全方面人才缺口仍然很大,相关专业每年本科、硕士、博士毕业生之和仅8000余人,而我国网民数量近7亿人。”网信办网络安全协调局局长赵泽良说。这是记者从2日举行的中国互联网发展基金会网络安全专项基金捐赠仪式上了解到的信息,这也是我国首个网络安全领......
  • 掌握数据科学中的算法效率:大 O 符号和计算复杂性
    机器学习工程师可扩展且高效的数据处理和模型训练的基本策略和工具欢迎来到雲闪世界。    时间和空间复杂度是抽象概念,也是高效数据处理和模型训练的支柱。通过掌握这些原则,数据科学家可以优化工作流程,降低计算成本,并快速构建处理大型数据集的可扩展解决方案。  ......