ref : https://blog.csdn.net/gsls200808/article/details/48243019


在密码学中,微型加密算法(Tiny Encryption Algorithm,TEA)是一种易于描述和执行的块密码,通常只需要很少的代码就可实现。其设计者是剑桥大学计算机实验室的大卫·惠勒与罗杰·尼达姆。这项技术最初于1994年提交给鲁汶的快速软件加密的研讨会上,并在该研讨会上演讲中首次发表。

在给出的代码中:加密使用的数据为2个32位无符号整数,密钥为4个32位无符号整数即密钥长度为128位

加密过程:

算法实现:

示例代码:
C语言代码(需支持C99)

  1. #include <stdio.h>
  2.  
  3. //加密函数
  4. void encrypt (uint32_t* v, uint32_t* k) {
  5. uint32_t v0=v[0], v1=v[1], sum=0, i; /* set up */
  6. uint32_t delta=0x9e3779b9; /* a key schedule constant */
  7. uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
  8. for (i=0; i < 32; i++) { /* basic cycle start */
  9. sum += delta;
  10. v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
  11. v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
  12. } /* end cycle */
  13. v[0]=v0; v[1]=v1;
  14. }
  15. //解密函数
  16. void decrypt (uint32_t* v, uint32_t* k) {
  17. uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i; /* set up */
  18. uint32_t delta=0x9e3779b9; /* a key schedule constant */
  19. uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
  20. for (i=0; i<32; i++) { /* basic cycle start */
  21. v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
  22. v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
  23. sum -= delta;
  24. } /* end cycle */
  25. v[0]=v0; v[1]=v1;
  26. }
  27.  
  28. int main()
  29. {
  30. uint32_t v[2]={1,2},k[4]={2,2,3,4};
  31. // v为要加密的数据是两个32位无符号整数
  32. // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
  33. printf("加密前原始数据:%u %u\n",v[0],v[1]);
  34. encrypt(v, k);
  35. printf("加密后的数据:%u %u\n",v[0],v[1]);
  36. decrypt(v, k);
  37. printf("解密后的数据:%u %u\n",v[0],v[1]);
  38. return 0;
  39. }

执行结果:

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

加密过程:

算法实现:

示例代码:

  1. #include <stdio.h>
  2.  
  3. /* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */
  4.  
  5. void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
  6. unsigned int i;
  7. uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
  8. for (i=0; i < num_rounds; i++) {
  9. v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
  10. sum += delta;
  11. v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
  12. }
  13. v[0]=v0; v[1]=v1;
  14. }
  15.  
  16. void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
  17. unsigned int i;
  18. uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
  19. for (i=0; i < num_rounds; i++) {
  20. v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
  21. sum -= delta;
  22. v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
  23. }
  24. v[0]=v0; v[1]=v1;
  25. }
  26.  
  27. int main()
  28. {
  29. uint32_t v[2]={1,2};
  30. uint32_t const k[4]={2,2,3,4};
  31. unsigned int r=32;//num_rounds建议取值为32
  32. // v为要加密的数据是两个32位无符号整数
  33. // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
  34. printf("加密前原始数据:%u %u\n",v[0],v[1]);
  35. encipher(r, v, k);
  36. printf("加密后的数据:%u %u\n",v[0],v[1]);
  37. decipher(r, v, k);
  38. printf("解密后的数据:%u %u\n",v[0],v[1]);
  39. return 0;
  40. }

加密前原始数据: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
加密过程:

算法实现:

示例代码:

  1. #include <stdio.h>
  2. #define DELTA 0x9e3779b9
  3. #define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
  4.  
  5. void btea(uint32_t *v, int n, uint32_t const key[4])
  6. {
  7. uint32_t y, z, sum;
  8. unsigned p, rounds, e;
  9. if (n > 1) /* Coding Part */
  10. {
  11. rounds = 6 + 52/n;
  12. sum = 0;
  13. z = v[n-1];
  14. do
  15. {
  16. sum += DELTA;
  17. e = (sum >> 2) & 3;
  18. for (p=0; p<n-1; p++)
  19. {
  20. y = v[p+1];
  21. z = v[p] += MX;
  22. }
  23. y = v[0];
  24. z = v[n-1] += MX;
  25. }
  26. while (--rounds);
  27. }
  28. else if (n < -1) /* Decoding Part */
  29. {
  30. n = -n;
  31. rounds = 6 + 52/n;
  32. sum = rounds*DELTA;
  33. y = v[0];
  34. do
  35. {
  36. e = (sum >> 2) & 3;
  37. for (p=n-1; p>0; p--)
  38. {
  39. z = v[p-1];
  40. y = v[p] -= MX;
  41. }
  42. z = v[n-1];
  43. y = v[0] -= MX;
  44. sum -= DELTA;
  45. }
  46. while (--rounds);
  47. }
  48. }
  49.  
  50.  
  51. int main()
  52. {
  53. uint32_t v[2]= {1,2};
  54. uint32_t const k[4]= {2,2,3,4};
  55. int n= 2; //n的绝对值表示v的长度,取正表示加密,取负表示解密
  56. // v为要加密的数据是两个32位无符号整数
  57. // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
  58. printf("加密前原始数据:%u %u\n",v[0],v[1]);
  59. btea(v, n, k);
  60. printf("加密后的数据:%u %u\n",v[0],v[1]);
  61. btea(v, -n, k);
  62. printf("解密后的数据:%u %u\n",v[0],v[1]);
  63. return 0;
  64. }

加密前原始数据:1 2
加密后的数据:3238569099 2059193138
解密后的数据:1 2 Process returned 0 (0x0) execution time : 0.369 s
Press any key to continue.

【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)的更多相关文章

  1. 基于新唐M0的XXTEA加密解密算法源码

    /*-------------------------------------------------------------------------------------------------- ...

  2. DES加密解密算法C语言代码实现

    代码: #include<stdio.h> #include<string.h> #include<stdlib.h> /*-------------------- ...

  3. 数据的加密传输——单片机上实现TEA加密解密算法

    各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性.常用的加密解密算法比如DES.RSA等,受限于单片机的内存和运算速度,实 ...

  4. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  5. 一组PHP可逆加密解密算法

    对于大部分密码加密,我们可以采用md5.sha1等方法.可以有效防止数据泄露,但是这些方法仅适用于无需还原的数据加密. 对于需要还原的信息,则需要采用可逆的加密解密算法. 下面一组PHP函数是实现此加 ...

  6. RC4加密解密算法

    RC4相对是速度快.安全性高的加密算法.在实际应用中,我们可以对安全系数要求高的文本进行多重加密,这样破解就有一定困难了.如下测试给出了先用RC4加密,然后再次用BASE64编码,这样双重锁定,保证数 ...

  7. java 实现 DES加密 解密算法

    DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...

  8. md5加密以及可逆的加密解密算法

    md5加密 package gov.mof.fasp2.gcfr.adjustoffset.adjust; import java.security.MessageDigest; public cla ...

  9. N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列。设计加密解密算法,且要求K<=15*N.

    N个整数(数的大小为0-255)的序列,把它们加密为K个整数(数的大小为0-255).再将K个整数顺序随机打乱,使得可以从这乱序的K个整数中解码出原序列.设计加密解密算法,且要求K<=15*N. ...

随机推荐

  1. ARMV8体系结构简介

    armv8 1.前言 本文的主要内容来源于ARMV8白皮书v5,对ARMV8做一个概述.包含如下的内容: 首先从背景谈起,讲述ARM的发展历程: 之后介绍ARMV8体系结构的基本特征: 介绍A64指令 ...

  2. PowerShell或命令行运行javac xx.java提示“编码GBK的不可映射字符”

    由于JDK是国际版的,我们在用javac编译时,编译程序首先会获得我们操作系统默认采用的编码格式(GBK),然后JDK就把Java源文件从GBK编码格式转换为Java内部默认的Unicode格式放入内 ...

  3. 【spring源码分析】IOC容器初始化(十二)

    前言:在doCreateBean方法中还遗留一个问题没有分析:循环依赖.循环依赖在Spring中是非常重要的一个知识点,因此单独进行分析. 什么是循环依赖 循环依赖就是循环引用,两个或两个以上的bea ...

  4. Rabbitmq集群高可用

    转载:https://www.cnblogs.com/flat_peach/archive/2013/04/07/3004008.html RabbitMQ是用erlang开发的,集群非常方便,因为e ...

  5. 查询本地电脑IP地址

    使用Windows+R键打开"运行"窗口,然后输入CMD进入命令提示窗口 进入命令窗口之后,输入:ipconfig/all 回车即可看到整个电脑的详细的IP配置信息

  6. ASP.NET Core 下自定义权限验证

    效果图: 如果没有权限时,显示: 代码: public class AuthorizeAdminAttribute : TypeFilterAttribute { #region 字段 private ...

  7. 使用axios 的post请求下载文件,

    axios({ method: 'post', data: param, responseType:'blob', url: _urls + '/Downloaddata' }).then(data= ...

  8. Cookie Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  9. 自然人税收管理系统扣缴客户端Sqlite数据库有密码的,如何破解读取呢

    https://www.cnblogs.com/Charltsing/p/EPPortal.html 有人问我能不能直接读自然人税收管理系统扣缴客户端,因为需要导出数据做处理. 看了一下,这个客户端是 ...

  10. Linux操作系统文件查找

    ++++++++++++++++++++++++++++++++++++++++++++++++标题:Linux操作系统的文件或命令查找内容:命令查找(which和whereis).文件查找(loca ...