TEA系列加解密算法详解

2023-11-18

TEA系列概述

TEA算法是由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明,TEA是Tiny Encryption Algorithm的缩写,以加密解密速度快,实现简单著称。TEA算法每一次可以操作64bit(8byte),采用128bit(16byte)作为key,算法采用迭代的形式,推荐的迭代轮数是64轮,最少32轮。为解决TEA算法密钥表攻击的问题,TEA算法先后经历了几次改进,从XTEA到BLOCK TEA,直至最新的XXTEA。XTEA也称做TEAN,它使用与TEA相同的简单运算,但四个子密钥采取不正规的方式进行混合以阻止密钥表攻击。Block TEA算法可以对32位的任意整数倍长度的变量块进行加解密的操作,该算法将XTEA轮循函数依次应用于块中的每个字,并且将它附加于被应用字的邻字。XXTEA使用跟Block TEA相似的结构,但在处理块中每个字时利用了相邻字,且用拥有两个输入量的MX函数代替了XTEA轮循函数。上面提到的相邻字其实就是数组中相邻的项。

TEA系列算法中均使用了一个DELTA常数,但DELTA的值对算法并无什么影响,只是为了避免不良的取值,推荐DELTA的值取为黄金分割数(5√-2)/2与232的乘积,取整后的十六进制值为0x9e3779B9,用于保证每一轮加密都不相同。

TEA算法介绍

TEA采用与DES算法类似的Feistel结构,迭代的每次循环使用加法和移位操作,对明文和密钥进行扩散和混乱,实现明文的非线性变换。TEA密钥长度和迭代次数都是DES的两倍,抗“试错法”攻击的强度不低于DES算法。算法以32bits的字为运算单位,而不是耗费计算能力的逐位运算。算法没有采用DES那样的转换矩阵,它安全、高效、占用存储空间少,非常适合在嵌入式系统中应用, 据说QQ就是使用16轮迭代的TEA算法。

TEA加密过程

在这里插入图片描述

C语言实现:

#define DELTA 0x9e3779b9

void tea_encrypt(unsigned int* v, unsigned int* key) {
  unsigned int l = v[0], r = v[1], sum = 0;
  for (size_t i = 0; i < 32; i++) { //进行32次迭代加密,Tea算法作者的建议迭代次数
    l += (((r << 4) ^ (r >> 5)) + r) ^ (sum + key[sum & 3]);
    sum += DELTA; //累加Delta的值
    r += (((l << 4) ^ (l >> 5)) + l) ^ (sum + key[(sum >> 11) & 3]); //利用多次双位移和异或将明文与密钥扩散混乱,并将两个明文互相加密
  }
  v[0] = l;
  v[1] = r;
}

//利用可逆性将加密过程逆转
void tea_decrypt(unsigned int* v, unsigned int* key) {
  unsigned int l = v[0], r = v[1], sum = 0;
  sum = DELTA * 32; //32次迭代累加后delta的值
  for (size_t i = 0; i < 32; i++) {
    r -= (((l << 4) ^ (l >> 5)) + l) ^ (sum + key[(sum >> 11) & 3]);
    sum -= DELTA;
    l -= (((r << 4) ^ (r >> 5)) + r) ^ (sum + key[sum & 3]);
  }
  v[0] = l;
  v[1] = r;
}

测试:

int main(int argc, char const *argv[])
{
    unsigned int v[2]={123,456},key[4]={0x11,0x22,0x33,0x44};
    printf("%u,%u\n",v[0],v[1]);
    tea_encrypt(v,key);
    printf("%u,%u\n",v[0],v[1]);
    tea_decrypt(v,key);
    printf("%u,%u\n",v[0],v[1]);
    return 0;
}

XTEA算法介绍

XTEA是TEA的扩展,也称做TEAN,它使用与TEA相同的简单运算,同样是一个64位块的Feistel密码,使用128位密钥,建议64轮, 但四个子密钥采取不正规的方式进行混合以阻止密钥表攻击

XTEA加密过程

在这里插入图片描述

C语言实现

#define DELTA 0x9e3779b9

void xtea_encrypt(unsigned int* v, unsigned int* key) {
  unsigned int l = v[0], r = v[1], sum = 0;
  for (size_t i = 0; i < 32; i++) { //进行32次迭代加密,Tea算法作者的建议迭代次数
    l += (((r << 4) ^ (r >> 5)) + r) ^ (sum + key[sum & 3]);
    sum += DELTA; //累加Delta的值
    r += (((l << 4) ^ (l >> 5)) + l) ^ (sum + key[(sum >> 11) & 3]); 
  }
  v[0] = l;
  v[1] = r;
}
 
void xtea_decrypt(unsigned int* v, unsigned int* key) {
  unsigned int l = v[0], r = v[1], sum = 0;
  sum = DELTA * 32; //32次迭代累加后delta的值
  for (size_t i = 0; i < 32; i++) {
    r -= (((l << 4) ^ (l >> 5)) + l) ^ (sum + key[(sum >> 11) & 3]);
    sum -= DELTA;
    l -= (((r << 4) ^ (r >> 5)) + r) ^ (sum + key[sum & 3]);
  }
  v[0] = l;
  v[1] = r;
}

测试:

int main(int argc, char const *argv[])
{
    unsigned int v[2]={123,456},key[4]={0x11,0x22,0x33,0x44};
    printf("%u,%u\n",v[0],v[1]);
    xtea_encrypt(v,key);
    printf("%u,%u\n",v[0],v[1]);
    xtea_decrypt(v,key);
    printf("%u,%u\n",v[0],v[1]);
    return 0;
}

XTEA算法介绍

XXTEA是一个非平衡Feistel网络分组密码,在可变长度块上运行,这些块是32位大小的任意倍数(最小64位),使用128位密钥, 是目前TEA系列中最安全的算法,但性能较上两种有所降低。

XXTEA加密过程

XXTEA cipher.svg的算法图

C语言实现

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

//XXTEA 加密,在处理数据流中每个数据时利用了相邻数据,使用MX函数计算加密值
static uint32_t * xxtea_uint_encrypt(uint32_t * data, size_t len, uint32_t * key) {
    uint32_t n = (uint32_t)len - 1;
    // 6 和 52 是怎么来的?
    uint32_t z = data[n], y, p, q = 6 + 52 / (n + 1), sum = 0, e;

    if (n < 1) return data;

    while (0 < q--) {
        sum += DELTA;
        // 根据sum 计算得出0~3中的某一个数值, 用于MX中与p共同作用选择key数组中某个秘钥值
        e = sum >> 2 & 3;

        //遍历每个待加密的数据
        for (p = 0; p < n; p++) {
            //z的初值为data[len - 1],即将数据数组当做是环形队列来处理的,首尾相连,当加密data[0]时,需要用到data[len - 1],data[0],data[0 + 1],以及MX计算返回的的一个加密值,加密值与data[0]相加后达到加密的效果
            y = data[p + 1];
            z = data[p] += MX;
        }

        //当加密data[len-1]时,需要用到data[len - 2],data[len-1],data[0],以及MX计算返回的的一个加密值,加密值与data[len-1]相加后达到加密的效果
        y = data[0];
        z = data[n] += MX;
    }

    return data;
}

//XXTEA 解密,把加密的步骤反过来即可得到解密的方法
static uint32_t * xxtea_uint_decrypt(uint32_t * data, size_t len, uint32_t * key) {
    uint32_t n = (uint32_t)len - 1;
    uint32_t z, y = data[0], p, q = 6 + 52 / (n + 1), sum = q * DELTA, e;

    if (n < 1) return data;

    while (sum != 0) {
        e = sum >> 2 & 3;

        for (p = n; p > 0; p--) {
            z = data[p - 1];
            y = data[p] -= MX;
        }

        z = data[n];
        y = data[0] -= MX;
        sum -= DELTA;
    }

    return data;
}

测试:

int main(int argc, char const *argv[])
{
    uint32_t v[2]={123,456},key[4]={0x11,0x22,0x33,0x44};
    printf("%u,%u\n",v[0],v[1]);
    xxtea_uint_encrypt(v,2,key);
    printf("%u,%u\n",v[0],v[1]);
    xxtea_uint_decrypt(v,2,key);
    printf("%u,%u\n",v[0],v[1]);
    return 0;
}

参考

https://en.wikipedia.org/wiki/XXTEA
https://www.jiamisoft.com/blog/22953-louy.html
https://www.jiamisoft.com/blog/17621-xxteajiamisuanfa.html
https://www.jianshu.com/p/4272e0805da3

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TEA系列加解密算法详解 的相关文章

  • IUnknown—COM和MFC

    转自 http hi baidu com zhangqiuxi blog item 6d9603ad9c8fe5084b36d6a0 html 问题 我用MFC编写COM程序有一段时间了 知道如何使用宏和嵌套类 以及如何在嵌套类中处理IUn
  • [原]Pro*C介绍-内嵌SQL

    Translate by Z Jingwei Document address http www db stanford edu ullman fcdb oracle or proc html Pro C介绍内嵌SQL 概要 Pro C语法
  • android通过JNI用C/C++创建本地文件

    通过jni在本地创建文件 1 在android studio创建基本的jni工程 并且在APP界面成功显示 Hello from C 不会的可以看android studio使用jni 2 在native lib cpp文件中创建文件 为了
  • DES加密算法详解——看这一篇就够了!

    目录 一 DES简介 二 DES算法入参 三 DES加密算法步骤解析 1 IP置换 M gt M0 2 密钥K控制的16轮运算 M0 K1 K16 gt M16 2 1 子密钥Kn的计算 2 1 1 PC 1置换 2 1 2 循环左移运算
  • c++得到窗口句柄

    include
  • GDAL多光谱与全色图像融合简单使用

    目录 简述 C 代码 效果对比 GDAL融合效果和原始多光谱波段对比 GDAL融合效果和原始全色波段对比 ARCGIS融合效果与原始全色和多光谱对比 GDAL融合效果与ArcGIS融合效果对比 简述 最近在GDAL的代码中看见了gdalpa
  • Lua和C++交互总结(很详细)

    出处 http blog csdn net shun fzll article details 39120965 一 lua堆栈 要理解lua和c 交互 首先要理解lua堆栈 简单来说 Lua和C c 语言通信的主要方法是一个无处不在的虚拟
  • ATL字符串转换宏

    有比MultiByteToWideChar和WideCharToMultiByte更简单的字符串转换宏 你相信吗 头文件 d program files microsoft visual studio 8 vc atlmfc include
  • LeetCode题目笔记——17.19消失的两个数字

    文章目录 题目描述 题目难度 困难 方法一 暴力 代码 代码优化 方法二 数学方法 代码 总结 题目描述 题目直达 题目难度 困难 方法一 暴力 虽然题目说你能在 O N 时间内只用 O 1 的空间找到它们吗 但是也没有限制我们不能用暴力
  • 为何在新建STM工程中全局声明两个宏

    在uVision中新建STM32工程后 需要从STM32标准库中拷贝标准外设驱动到自己的工程目录中 此时需要在工程设置 gt C C 选项卡下的Define文本框中键入这两个全局宏定义 STM32F40 41xxx USE STDPERIP
  • R----dplyr包介绍学习

    dplyr包 plyr包的替代者 专门面对数据框 将ddplyr转变为更易用的接口 gt 来自dplyr包的管道函数 其作用是将前一步的结果直接传参给下一步的函数 从而省略了中间的赋值步骤 可以大量减少内存中的对象 节省内存 可惜的是应用范
  • 模板的完全特例化和部分特例化

    介绍 完全特例化就是类型完全明确的版本 而部分特例化指的是 只知道是几个参数的函数而不知道参数的类型 或者是只知道是引用或者是指针类型 而不知道具体是char 还是 int 模板特例化实例1 template
  • Dev-C++之开启装逼效果

    Dev C 是个不错的C IDE 在10年前 它是很不错 在现在 它是个以界面丑陋和调试像吃粑粑这两点著称 如下图 实在是丑到离谱 丑到无法忍受 可是没办法呀 人家CCF规定比赛用这个 你个小蒟蒻吵什么 我现在就来讲讲怎么把你的Dev C
  • mfc窗口创建的create与oncreate

    在view类中 create 是虚函数由框架调用 是用来 生成一个窗口的子窗口 oncreate 消息响应函数 是用来 表示一个窗口正在生成 某个CWnd的Create函数由当前CWnd的Owner调用 而在CWnd Create中 又会调
  • visual studio 一直显示正在准备解决方案

    首先重启电脑 无法解决的情况下执行以下步骤 Kill Visual Studio Open Visual Studio without loading a solution Disable AnkhSvn as Source Control
  • enable_shared_from_this使用介绍

    文章目录 enable shared from this定义 使用场合 源码实现 注意 enable shared from this定义 定义于头文件 template lt class T gt class enable shared
  • 【数据结构/C++】树和二叉树_二叉链表

    include
  • 【C++】运算符重载

    加号运算符重载 include
  • C 语言运算符详解

    C 语言中的运算符 运算符用于对变量和值进行操作 在下面的示例中 我们使用 运算符将两个值相加 int myNum 100 50 虽然 运算符通常用于将两个值相加 就像上面的示例一样 它还可以用于将变量和值相加 或者将变量和另一个变量相加
  • C++ 中 const 和 constexpr 关键字解析:常量、函数和指针

    很多 C 的初学者看到 const 这个关键字的第一反应都是一头雾水 主要是因为 const 可 以出现在很多的位置 以及后面加入的 constexpr 更是常常感到困惑 今天就为大家一一解释出现它们的含义和以及作用 const 关键字 c

随机推荐

  • Windows server 2019搭建证书服务器

    1 安装服务 2 选择角色服务 3 配置CA服务器 指定凭据 选择要配置的角色服务 选择CA的设置类型 指定CA类型 指定私钥类型 指定证书有效期 确认整体配置 确认后就可以开始配置我们的CA服务器 4 配置完成后 申请证书 打开IIS 里
  • 以后不在:CSDN写博客了

    以后不在CSDN写博客了 去寻找一个 有人情味的地方 老洋
  • JAVA 练习

    错题回顾 1 运行如下代码 class COne public void f System out println COne f class CTwo extends COne public void f System out printl
  • maven 打包带版本号_maven实现打包带源代码的jar包

    实现方法一 pom文件添加以下及节点 src main java 说明 默认的资源文件夹是src main resource 此方法修改了资源文件夹 让你默认的资源文件夹变成了src main java文件夹 而这个文件夹在maven中是默
  • 【热门框架】Maven怎样进行配置文件管理?有什么好处?

    Maven可以通过使用resources元素和filters来进行配置文件管理 这样可以方便地管理项目中的配置文件 避免重复和冗余 提高可维护性和可扩展性 在Maven的pom xml文件中 可以使用resources元素来指定项目中的资源
  • TP5返回参数,封装方法jsonReturn

    调用jsonReturn 生成调账单 状态获取 public function getStatusCreateDebugBill endStatus Paas request sim finance statement getStatusB
  • wordpress搭建网站

    域名 主机申请 宝塔面板使用流程 看以下这两个就够了 https blog csdn net weixin 45106434 article details 108894407 https blog csdn net qq 44721831
  • SimpleFOC无刷电机平衡小车

    前言 本科毕业于自动化 期间学习了各种电机运动控制原理 自动控制原理 但是只会考试而未究其理 最近接触到simplefoc这个基于arduino的开源无刷电机驱动库 想正好借此机会将本科学到的内容用于实际 于是就有了这个小项目 基于无刷电机
  • Ubuntu——统计目录下文件数量的方法

    统计当前目录下文件的个数 不包括目录 ls l grep wc l 参考文章 Linux 统计目录下文件数量的方法
  • scrapy保存、中断、继续执行爬虫程序

    在scrapy文件中的custom settings写入JOBDIR即可 比如 JOBDIR jobs baidu news baidu news这个位置就是当程序停止爬虫的时候当前的运行状态就会记录在这个文件中 当再次爬取时会接着保存的状
  • 已知a.txt文件中的内容为"AAbcdea22dferwplkCC321ou1", 请编写程序读取该文件内容,要求去掉重复字母(区分大小写), 并按照自然排序顺序后输出到b.txt文件中。

    package copy1 import java io BufferedReader import java io BufferedWriter import java io FileInputStream import java io
  • 2020美赛F奖论文(四):模拟退火算法驱动的结构策略设计

    上接 2020美赛F奖论文 三 足球团队指标和基于机器学习的球队表现预测 全文 2020美赛F奖论文 一 摘要 绪论和模型准备 2020美赛F奖论文 二 传球网络模型 PNM 的建立和影响因子分析 2020美赛F奖论文 三 足球团队指标和基
  • 计算机网络(1)——概念、组成、功能和分类

    文章目录 0 总揽全局 1 计算机网络的概念 2 计算机网络的功能 3 计算机网络的组成 4 计算机网络的分类 视频来源 https www bilibili com video BV19E411D78Q p 1 0 总揽全局 1 计算机网
  • 强烈推荐Linux深入学习必读的几本书

    2012 10 01 21 00 40 成为一名精通 Linux程序设计的高级程序员一直是不少朋友孜孜以求的目标 根据中华英才网统计数据 北京地区 Linux 程序员月薪平均为 Windows程序员的 1 8 倍 Java 程序员的 2 6
  • sql语句中关于1 and 1=2详解

    在通关sqli labs的时候 我经常会遇到这么一个问题 那就是 id 1 和 id 1 and 1 2 的查询结果是一致的 我一直以来都很疑惑 然后寻求了很多文章 终于解决了我的问题 我们将其放在sqlyog里面去讲解 我先给你们展示一下
  • Shell监控jvm发短信

    Shell脚本 jstat crontab curl 监控JVM发送短信 bin bash 定时监控本机器下所有java应用的 JVM信息 定时任务配置 crontab e 写入如下 5分钟执行一次检测 5 home admin monit
  • 【H5】 svg动画 旋转属性与虚线属性

    svg 动画 旋转 transform rotate angle x y 不要写在style里面 angle 旋转角度 x y旋转中心 绘制虚线 stroke dasharray a b a b c d 旋转属性 transform rot
  • 立陶宛央行抢跑数字货币背后:前瞻的区块链战略 中国已有企业布局

    7月2日 据路透社报道 立陶宛将在下周开始预售2 4万枚由央行发行的数字货币 该名为LBCoin的数字货币基于区块链技术生产 立陶宛成为是欧盟国家中第一家正式发行央行数字货币的地区 不是2015年就开始研究央行数字货币的英国 不是今年2月试
  • 人工智能芯片未来发展前景如何?

    随着深度学习技术的快速发展 以及互联网和云计算时代海量数据和高效计算能力的支撑 计算机视觉技术 语音技术 自然语言理解技术等人工智能技术取得了突破性进展 并解锁多个行业的人工智能场景 产生了巨大的商业价值 驱动了人工智能行业的发展 同时 伴
  • TEA系列加解密算法详解

    文章目录 TEA系列概述 TEA算法介绍 TEA加密过程 C语言实现 XTEA算法介绍 XTEA加密过程 C语言实现 XTEA算法介绍 XXTEA加密过程 C语言实现 参考 TEA系列概述 TEA算法是由剑桥大学计算机实验室的David W