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. 微软官方的Unity支持组件

    https://unity.codeplex.com/ http://www.nuget.org/packages/Unity.Interception/ http://www.nuget.org/p ...

  2. 查看mysql字符集及修改表结构--表字符集,字段字符集

    MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令.包括查看 MySQL 数据库服务器字符集.查看 MySQL 数据库字符集,以及数据表和字段的 ...

  3. 低效的SQL引发的cache buffers chains latch

    1.低效的SQL 低效的SQL语句时发生cache buffers chains 锁存器争用的最重要原因.多个进程同时扫描大范围的索引或表时,可能广泛 地发生cache buffers chains ...

  4. mybatis和hibernate对比

    Hibernate是一个数据库表和java对象之间完全映射的框架,java开发人员直接对java对象操作,而不对数据库表进行操作: Mybatis是对SQL语句和java对象进行映射,仍需要开发人员编 ...

  5. Android Studio 配置SVN实现代码管理

    Refference From:http://iaiai.iteye.com/blog/2267346 一.Android Studio配置SVN Android Studio关联配置SVN很简单,在 ...

  6. java 实现排序

    package com.cjs.sort; /** * 此类用来提供针对整数的各种排序算法 * * @author S * @version 1.0 */ public class MySort { ...

  7. 【HDU1102】Constructing Roads(MST基础题)

    最小生成树水题.prim一次AC #include <iostream> #include <cstring> #include <cstdlib> #includ ...

  8. win10无法使用内置管理员账户打开

    对于这种问题其实对于专业版用户倒不是难事,很容易解决,具体方法如下: 首先WIN+R输入:gpedit.msc,打开组策略,找到“计算机配置”里面的“Windows设置”,打开“安全设置” -> ...

  9. hdu 5611 Baby Ming and phone number(模拟)

    Problem Description Baby Ming collected lots of cell phone numbers, and he wants to sell them for mo ...

  10. XShell连接CentOS 7.2显示中文乱码问题的解决方法

    背景 使用U盘往Windows主机.Linux主机传文件还是经常的事,但有时候文件名有中文, 传到Linux机器会有乱码,选择起来也很麻烦,最近刚好遇到,写下解决方法. 环境 Linux [root@ ...