【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)
ref : https://blog.csdn.net/gsls200808/article/details/48243019
在密码学中,微型加密算法(Tiny Encryption Algorithm,TEA)是一种易于描述和执行的块密码,通常只需要很少的代码就可实现。其设计者是剑桥大学计算机实验室的大卫·惠勒与罗杰·尼达姆。这项技术最初于1994年提交给鲁汶的快速软件加密的研讨会上,并在该研讨会上演讲中首次发表。
在给出的代码中:加密使用的数据为2个32位无符号整数,密钥为4个32位无符号整数即密钥长度为128位
加密过程:
算法实现:
示例代码:
C语言代码(需支持C99)
- #include <stdio.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 */
- 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;
- }
- int main()
- {
- uint32_t v[2]={1,2},k[4]={2,2,3,4};
- // v为要加密的数据是两个32位无符号整数
- // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
- printf("加密前原始数据:%u %u\n",v[0],v[1]);
- encrypt(v, k);
- printf("加密后的数据:%u %u\n",v[0],v[1]);
- decrypt(v, k);
- printf("解密后的数据:%u %u\n",v[0],v[1]);
- return 0;
- }
执行结果:
http://write.blog.csdn.net/postedithttp://write.blog.csdn.net/postedit
加密前原始数据:1 2
加密后的数据:1347371722 925494771
解密后的数据:1 2
Process returned 0 (0x0) execution time : 0.020 s
Press any key to continue.
XTEA是TEA的升级版,增加了更多的密钥表,移位和异或操作等等,设计者是Roger Needham, David Wheeler
加密过程:
算法实现:
示例代码:
- #include <stdio.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;
- }
- int main()
- {
- uint32_t v[2]={1,2};
- uint32_t const k[4]={2,2,3,4};
- unsigned int r=32;//num_rounds建议取值为32
- // v为要加密的数据是两个32位无符号整数
- // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
- printf("加密前原始数据:%u %u\n",v[0],v[1]);
- encipher(r, v, k);
- printf("加密后的数据:%u %u\n",v[0],v[1]);
- decipher(r, v, k);
- printf("解密后的数据:%u %u\n",v[0],v[1]);
- return 0;
- }
加密前原始数据:1 2
加密后的数据:1345390024 2801624574
解密后的数据:1 2
Process returned 0 (0x0) execution time : 0.034 s
Press any key to continue.
XXTEA,又称Corrected Block TEA,是XTEA的升级版,设计者是Roger Needham, David Wheeler
加密过程:
算法实现:
示例代码:
- #include <stdio.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()
- {
- uint32_t v[2]= {1,2};
- uint32_t const k[4]= {2,2,3,4};
- int n= 2; //n的绝对值表示v的长度,取正表示加密,取负表示解密
- // v为要加密的数据是两个32位无符号整数
- // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
- printf("加密前原始数据:%u %u\n",v[0],v[1]);
- btea(v, n, k);
- printf("加密后的数据:%u %u\n",v[0],v[1]);
- btea(v, -n, k);
- printf("解密后的数据:%u %u\n",v[0],v[1]);
- return 0;
- }
加密前原始数据:1 2
加密后的数据:3238569099 2059193138
解密后的数据:1 2
Process returned 0 (0x0) execution time : 0.369 s
Press any key to continue.
【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)的更多相关文章
- 基于新唐M0的XXTEA加密解密算法源码
/*-------------------------------------------------------------------------------------------------- ...
- DES加密解密算法C语言代码实现
代码: #include<stdio.h> #include<string.h> #include<stdlib.h> /*-------------------- ...
- 数据的加密传输——单片机上实现TEA加密解密算法
各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性.常用的加密解密算法比如DES.RSA等,受限于单片机的内存和运算速度,实 ...
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- 一组PHP可逆加密解密算法
对于大部分密码加密,我们可以采用md5.sha1等方法.可以有效防止数据泄露,但是这些方法仅适用于无需还原的数据加密. 对于需要还原的信息,则需要采用可逆的加密解密算法. 下面一组PHP函数是实现此加 ...
- RC4加密解密算法
RC4相对是速度快.安全性高的加密算法.在实际应用中,我们可以对安全系数要求高的文本进行多重加密,这样破解就有一定困难了.如下测试给出了先用RC4加密,然后再次用BASE64编码,这样双重锁定,保证数 ...
- java 实现 DES加密 解密算法
DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...
- md5加密以及可逆的加密解密算法
md5加密 package gov.mof.fasp2.gcfr.adjustoffset.adjust; import java.security.MessageDigest; public cla ...
- N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列。设计加密解密算法,且要求K<=15*N.
N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列.设计加密解密算法,且要求K<=15*N. ...
随机推荐
- 我带着小程序和Springboot后端终于战胜了WebSocket!!!胜利( •̀ ω •́ )y
WebSocket项目笔记 1. What is WebSocket? (以下内容来源于百度百科) WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器 ...
- IKAnalyzer结合Lucene实现中文分词
1.基本介绍 随着分词在信息检索领域应用的越来越广泛,分词这门技术对大家并不陌生.对于英文分词处理相对简单,经过拆分单词.排斥停止词.提取词干的过程基本就能实现英文分词,单对于中文分词而言,由于语义的 ...
- asp.net FromBody接收不到参数的解决方法
今天改一个前端框架(angularjs,不兼容ie内核,需要修改),后台框架是已经写好了的,不用修改. 接口接收参数如下: [HttpPost] public async Task<Schedu ...
- Ubuntu 16.04 安装垃圾清理工具 BleachBit
BleachBit 可以清理系统缓存文件, 清理磁盘垃圾. 首先下载最新版 deb安装包,默认下载到Downloads 中, 下载链接: https://www.bleachbit.org/downl ...
- 基于mysql的一些sql语法
Sql: distinct: select distinct * from tea; Tea中每行的数据必有不同,若有两行相同的,则只输出一行 Limit: select * from stu lim ...
- VUE的一个数据绑定与页面刷新相关的bug
1.场景: N层嵌套的循环查询业务场景,框架是vue.其中在最后一层查完之后,还需要查其中每一项的两个属性,类型都是列表.查完之后将其赋值给一个变量用于页面展示.代码如下: (1)异常代码: getS ...
- BERT模型在多类别文本分类时的precision, recall, f1值的计算
BERT预训练模型在诸多NLP任务中都取得最优的结果.在处理文本分类问题时,即可以直接用BERT模型作为文本分类的模型,也可以将BERT模型的最后层输出的结果作为word embedding导入到我们 ...
- 蚂蚁 uva 10881
思路: 一,两个点相撞然后,相互弹开.这样其实和两个点穿过去差不多, 但是对于单个点而言,这样肯定不行. 二,当你发现了不管什么情况,这些点的相对位置是不变的, 比如 1, 4, 3, 2 不管怎么移 ...
- openstack 2019/4/28
官网参考地址:https://docs.openstack.org/keystone/queens/install/index-rdo.html (但愿能看懂) 环境:这个部分解释如何按示例架构配置控 ...
- Elasticsearch 通关教程(四): 分布式工作原理
前言 通过前面章节的了解,我们已经知道 Elasticsearch 是一个实时的分布式搜索分析引擎,它能让你以一个之前从未有过的速度和规模,去探索你的数据.它被用作全文检索.结构化搜索.分析以及这三个 ...