TEA(Tiny Encryption Algorithm)是一种小型的对称加密解密算法,支持128位密码,与BlowFish一样TEA每次只能加密/解密8字节数据。TEA特点是速度快、效率高,实现也非常简单,用C语言实现TEA加密/解密算法只需26行代码。由于针对TEA的攻击不断出现,所以TEA也发展出几个版本,分别是XTEA、Block TEA和XXTEA。

TEA加密和解密时都使用一个常量值,这个常量值为0x9e377b9,这个值是近似黄金分割率,注意,有些编程人员为了避免在程序中直接出现"mov 变量,0x9e377b9",以免被破解者直接搜索0x9e377b9这个常数得知使用TEA算法,所以有时会使用"sub 变量,0x61C88647"代替"mov 变量,0x9e377b9",0x61C88647=-(0x9e377b9)。

下面给出一个例子来分析,这个例子同样引入一个加密库,调用加密库中的tea_encrypt函数来实现对数据使用tea_encrypt加密,代码如下:

#include <windows.h>
#include <my_crypto.h>

main()
{
    ]={"Hello"};             //8字节明文数据
    ]={"WORLD!!"};           //128位密码
    unsigned ;             //32轮加密
    tea_encrypt (&data, &key, round);    //TEA加密函数
}

重点关注上面的tea_encrypt函数调用,调用tea_encrypt函数代码的反汇编代码如下:

   mov         eax,dword ptr [ebp-1Ch]    ;eax=32
   push        eax
   lea         ecx,[ebp-18h]              ;ecx指向密码
   push        ecx
   ]                ;edx指向明文数据
0040106C   push        edx
0040106D   call        tea_encrypt (004010c2)     ;TEA加密函数
   add         esp,0Ch

跟进tea_encrypt函数内部,代码如下:

)]

执行上面的跳转指令来到下面的代码,这里是真正的tea_encrypt加密函数入口:

100092D3   mov         eax,dword ptr [esp+10h]  ;eax指向密码
100092D7   mov         edx,dword ptr [eax+0Ch]
1]
100092DD   push        ebx
100092DE   mov         ebx,dword ptr [esp+10h]  ;edx指向明文
100092E2   push        ebp
100092E3   mov         ebp,dword ptr [esp+1Ch]  ;ebp等于迭代次数
100092E7   push        esi
100092E8   mov         esi,dword ptr [eax]
100092EA   mov         dword ptr [esp+0Ch],edx
100092EE   push        edi
1]
100092F2   mov         eax,dword ptr [ebx]
100092F4   xor         edx,edx
100092F6   test        ebp,ebp
100092F8   mov         dword ptr [esp+14h],ecx
1]
1
   mov         dword ptr [esp+20h],ebp
   mov         ebx,ecx
   000930A   add         ebx,edi
1000930C   mov         ebp,ecx
1
   add         ebp,esi
   xor         ebx,ebp
   sub         edx,61C88647h  ;这条指令相当于add edx, 0x9e3779b
1000931B   lea         ebp,[edx+ecx]
1000931E   xor         ebx,ebp
   add         eax,ebx
   mov         ebx,eax

   add         ebx,dword ptr [esp+10h]
1000932B   mov         ebp,eax
1
   add         ebp,dword ptr [esp+14h]
   xor         ebx,ebp
   lea         ebp,[edx+eax]
   xor         ebx,ebp
1000933B   add         ecx,ebx
1

   mov         edx,dword ptr [esp+1Ch]
   pop         edi
   pop         esi
1000934A   pop         ebp
1000934B   mov         dword ptr [edx],eax   ;密文的低32位数据
1],ecx ;密文的高32位数据
   pop         ebx

   ret
   pop         edi
   pop         esi
   pop         ebp
   mov         dword ptr [ebx],eax   ;密文的低32位数据
1],ecx ;密文的高32位数据
1000935D   pop         ebx
1
   ret

10009315处的代码sub edx,61C88647h是识别TEA算法的关键,sub edx,61C88647h = add edx,0x9e377b9。0x9e377b9是TEA算法使用的常数,所以可以初步确定上面的代码是TEA加密代码。

TEA加密的更多相关文章

  1. Tea加密算法和XxTea加密算法

    TEA(Tiny Encryption Algorithm)是一种小型的对称加密解密算法,支持128位密码,与BlowFish一样TEA每次只能加密/解密8字节数据.TEA特点是速度快.效率高,实现也 ...

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

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

  3. 单片机上使用TEA加密通信(转)

    源:单片机上使用TEA加密通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:MDK4.72 单片机:STM32 说 ...

  4. C++ Base64编码解码、MD5及TEA加密解密

    Crypto.h以及Crypto.cpp Crypto.h  123456789101112131415161718192021222324252627282930313233343536373839 ...

  5. TEA加密/解密算法

    在游戏项目中,一般需要对资源或数据进行加密保护,最简单高效的加密算法就是采用位与或之类的,但是比较容易被人分析出来.TEA加密算法不但比较简单,而且有很强的抗差分分析能力,加密速度也比较快.可以根据项 ...

  6. QQ协议的TEA加解密算法

    QQ通讯协议里的加解密算法. #include <stdio.h> #include <stdlib.h> #include <memory.h> #include ...

  7. keil TEA

    http://bbs.mydigit.cn/read.php?tid=545086 #include "reg52.h" void send_char(unsigned char ...

  8. TEA加密算法java版

    这个算法简单,而且效率高,每次可以操作8个字节的数据,加密解密的KEY为16字节,即包含4个int数据的int型数组,加密轮数应为8的倍数,一般比较常用的轮数为64,32,16,推荐用64轮. 源代码 ...

  9. tea加密算法及其变种的研究

    tea 介绍 "TEA" 的全称为"Tiny Encryption Algorithm" 是1994年由英国剑桥大学的David j.wheeler发明的. T ...

随机推荐

  1. gridview列显示,截取其中前面的几个字显示出来,当鼠标放上去的时候显示全部——使用LinkButton的方法

    使用LinkButton的方法<asp:LinkButton ToolTip ='<%#Eval("FilePath") %>' runat="serv ...

  2. 实用的VIM配置文件

    VIM配置文件名为.vimrc,默认在用户根目录下,或者在命令模式下输入:version可以获取配置文件路径. 在VIM命令行下输入options,然后回车,可以查看VIM所有的参数选项. 双引号&q ...

  3. B/S 网站技术选型

    Windows平台: http://www.asp.net, http://www.asp.net/mvc Web技术 http://msdn.microsoft.com/ef 数据访问中间件 htt ...

  4. 【HDU1875】畅通工程再续(MST基础题)

    更改成实形数即可.第一次敲完直接交,CE了一次.晕. #include <iostream> #include <cstring> #include <cstdio> ...

  5. the5fire博客对接微信公众平台接口 | the5fire的技术博客

    the5fire博客对接微信公众平台接口 | the5fire的技术博客 the5fire博客对接微信公众平台接口

  6. OpenMeetings(3)----启动顺序解析

    OpenMeetings系统较大,代码量也不小,如果对前端的OpenLaszlo开发不熟悉的话,刚研究代码时,确实有种丈二和尚摸不着头脑的感觉.一番研究之后,终于初步理清了系统的初步动作流程,具体执行 ...

  7. FFmpeg缩放swscale详解 <转>

    利用ffmpeg进行图像数据格式的转换以及图片的缩放应用中,主要用到了swscale.h文件中的三个函数,分别是: struct SwsContext *sws_getContext(int srcW ...

  8. JSP通过SmartUpload上传文件实例

    httpRequest.setCharacterEncoding("gbk"); String preName = genName.doMake();//设置文件前缀名 Strin ...

  9. 地下迷宫(bfs输出路径)

    题解:开一个pre数组用编号代替当前位置,编号用结构题另存,其实也可以i*m+j来代替,我写的有点麻烦了; 代码: #include <iostream> #include <cst ...

  10. To Miss Our Children Time(dp)

    To Miss Our Children Time Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Jav ...