tea加密算法及其变种的研究
tea
介绍
分组加密(CBC)加密
- 明文有一组中有错,会使以后的密文组都受影响,但经解密后的恢复结果,除原有误的一组外,其后各组明文都正确地恢复。
- 解密时,有一组秘钥错误,该错误会影响下一分组相同位置的解密
- 若在传送过程中,某组密文组出错时,则该组恢复的明文和下一组恢复数据出错。再后面的组将不会受中错误比特的影响
加密图及实现
tea加密至少需要两个数据,通常为64位8字节,同时需要一个delta值,delta每次迭代倍增,一般为0x9E3779B9,有一个128位密钥,一般分为4个32位密钥,每组加密一般进行32轮迭代。
C语言实现
- void Encrypt(long* EntryData, long* Key)
- {
- //分别加密数组中的前四个字节与后4个字节,4个字节为一组每次加密两组
- unsigned long x = EntryData[0];
- unsigned long y = EntryData[1];
- unsigned long sum = 0;//迭代器
- unsigned long delta = 0x9E3779B9;//delta值
- //总共加密32轮
- for (int i = 0; i < 32; i++)
- {
- sum += delta;//delata倍增
- x += ((y << 4) + Key[0]) ^ (y + sum) ^ ((y >> 5) + Key[1]); y += ((x << 4) + Key[2]) ^ (x + sum) ^ ((x >> 5) + Key[3]);
- }
- //最后加密的结果重新写入到数组中
- EntryData[0] = x;
- EntryData[1] = y;
- }
xtea
最大的不同在于,xtea的sum第一次加密为0,subkey的取值方式为sum中的两个二进制位,一般一个是最后两个,一个是左移11位在取得的
- 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;//注意于tea的区别
- v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
- }
- v[0]=v0; v[1]=v1;
- }
xxtea
相比xtea与tea,xxtea的复杂度更上了一层,subkey的方式变为已进行的轮数的最后两位与delta叠加的最后两位相异或,delta迭代与tea相同
- #include <stdio.h>
- #include <stdint.h>
- #define DELTA 0x9e3779b9
- #define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
- void xxtea(uint32_t* v, int n, uint32_t* key)
- {
- uint32_t y, z, sum;
- unsigned p, rounds, e;
- if (n > 1) // encrypt
- {
- 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) // decrypt
- {
- 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);
- }
- }
- // test
- int main()
- {
- // 两个32位无符号整数,即待加密的64bit明文数据
- uint32_t v[2] = {0x12345678, 0x78563412};
- // 四个32位无符号整数,即128bit的key
- uint32_t k[4]= {0x1, 0x2, 0x3, 0x4};
- //n的绝对值表示v的长度,取正表示加密,取负表示解密
- int n = 2;
- printf("Data is : %x %x\n", v[0], v[1]);
- xxtea(v, n, k);
- printf("Encrypted data is : %x %x\n", v[0], v[1]);
- xxtea(v, -n, k);
- printf("Decrypted data is : %x %x\n", v[0], v[1]);
- return 0;
- }
tea加密算法及其变种的研究的更多相关文章
- TEA加密算法的文件加密和解密的实现
一.TEA加密算法简介 TEA加密算法是由英国剑桥大学计算机实验室提出的一种对称分组加密算法.它采用扩散和混乱方法,对64位的明文数据块,用128位密钥分组进行加密,产生64位的密文数据块,其循环轮数 ...
- DES、AES、TEA加密算法的比较
1. DES算法介绍: DES算法具有对称性, 既可以用于加密又可以用于解密.对称性带来的一个很大的好处在于硬件实现, DES 的加密和解密可以用完全相同的硬件来实现.DES 算法的明文分组是 ...
- TEA加密算法的C/C++实现
TEA(Tiny Encryption Algorithm) 是一种简单高效的加密算法,以加密解密速度快,实现简单著称.算法真的很简单,TEA算法每一次可以操作64-bit(8-byte),采用128 ...
- TEA加密算法java版
这个算法简单,而且效率高,每次可以操作8个字节的数据,加密解密的KEY为16字节,即包含4个int数据的int型数组,加密轮数应为8的倍数,一般比较常用的轮数为64,32,16,推荐用64轮. 源代码 ...
- Tea加密算法和XxTea加密算法
TEA(Tiny Encryption Algorithm)是一种小型的对称加密解密算法,支持128位密码,与BlowFish一样TEA每次只能加密/解密8字节数据.TEA特点是速度快.效率高,实现也 ...
- TEA算法
我们要讨论的最后一个分组密码加密算法是TEA(Tiny Encryption Algorithm).到目前为止,我们在前面所呈现的连线图可能会使你得出如下结论:分组密码加密算法必须是复杂的.TEA却能 ...
- 普通硬件就能破解GSM A5加密算法
如果你还在使用基于早期信号标准的GSM手机,那么你最好在使用手机的过程中小心一点了.因为根据国外媒体的最新报道,安全研究专家通过测试发现,他们只需要使用三张NVIDIA GeForce GTX690显 ...
- 单片机上使用TEA加密通信(转)
源:单片机上使用TEA加密通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:MDK4.72 单片机:STM32 说 ...
- 【搬运】Tea算法Java实现工具类
最近在做数据加密,目标是实现平台app的数据安全性,所以准备使用AES+Base64进行加密,适逢一个特长的json串AES加密不了,于是在谷歌了各种算法,判断是否合用,参见 各种加密算法比较 一文中 ...
随机推荐
- SQL注入蠕虫分析//未完待续
蠕虫代码: DECLARE @S VARCHAR(4000);SET @S=CAST(0x4445434C415245204054205641524348415228323535292C4043205 ...
- DubboSPI机制二之Dubbo中SPI初体验
Dubbo高级之一SPI机制之JDK中的SPI - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中阐述了JDK标准的SPI,并对其应用做了相应的实践.在实际应用中,很多框架都会对其进行扩展 ...
- ORACLE-创建用户和表空间
/*分为四步 *//*第1步:创建临时表空间 */create temporary tablespace user_temp tempfile 'D:\oracle\oradata\Oracle9i\ ...
- Linux mysql8.0.11安装
准备:检查是否已安装过mysql,若有便删除(linux系统自带的) rpm -qa | grep mariadb rpm -e nodeps mariadb-libs-5.5.56-2.el7.x8 ...
- 微信公众平台网页授权登陆access_token误区
公众平台里显示 每日获取access_token上线2000次,此access_token并非网页授权登陆的access_token大家不要混淆 1,网页授权登陆的access_token是没有上线的 ...
- 018 磁盘 IO 性能监控/压测工具(sar、iotop、fio、iostat)
1 sar 命令查看当前磁盘 IO 读写 sar(System Activity Reporter 系统活动情况报告)是 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告 ...
- LSMT 实战-python
长短期记忆网络(LSTM,Long Short-Term Memory) 使用kears 搭建一个LSTM预测模型,使用2022年美国大学生数学建模大赛中C题中处理后的BTC比特币的数据进行数据训练和 ...
- 多态在C#中的应用
C# 语言经过专门设计,以便不同库中的基类与派生类之间的版本控制可以不断向前发展,同时保持向后兼容.这具有多方面的意义.例如,这意味着在基类中引入与派生类中的某个成员具有相同名称的新成员在 C# 中是 ...
- tput用法详解-渐入佳境
--作者:飞翔的小胖猪 --创建时间:2021年2月28日 tput 命令将通过 terminfo 数据库对终端会话进行初始化和操作. 主要功能为:移动更改光标.更改文本属性颜色.清除屏幕特定区域. ...
- jq实现加减功能
效果展示: HTML: <!-- 3.咨询分钟 --> <div class="buymain_body_son" ...