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. QDataStream类参考(串行化数据,可设置低位高位,以及版本号),还有一个例子

    QDataStream类提供了二进制数据到QIODevice的串行化. #include 所 有成员函数的列表. 公有成员 QDataStream () QDataStream ( QIODevice ...

  2. PowerShell_零基础自学课程_9_高级主题:静态类和类的操作

    上次我们说到了,wmi对象和com组件,今天我们继续来看PS中对象的相关内容.主要说一下静态对象和对象的基本操作. 一.静态对象 在PS中有一类特殊的对象,我们不能同过这些类创建新的对象,这些类是不能 ...

  3. unix c 04

      系统调用(System Call)   文件的操作函数(Unix/Liunx系统内部提供的函数)   time 可以查看程序的运行时间,包括用户层时间和系统层的时间.   系统调用其实就是一系列的 ...

  4. poj 3579 Median (二分搜索之查找第k大的值)

    Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numb ...

  5. visual studio 2015离线版msdn下载和安装

    2014年11月13日,微软发布了Visual Studio 2015 Preview,但是Visual Studio 2015 的msdn该如何安装呢?下面脚本之家就为大家分享一篇visual st ...

  6. kaggle之Grupo Bimbo Inventory Demand

    Grupo Bimbo Inventory Demand kaggle比赛解决方案集合 Grupo Bimbo Inventory Demand 在这个比赛中,我们需要预测某个产品在某个销售点每周的需 ...

  7. ORACLE序列的使用总结

    1.创建序列ORACLE序列的语法格式为: CREATE SEQUENCE 序列名[INCREMENT BY n][START WITH n][{MAXVALUE/ MINVALUE n|NOMAXV ...

  8. struts2必需jar包

    asm-3.3.jar                   commons-logging-1.1.3.jarasm-commons-3.3.jar           freemarker-2.3. ...

  9. 16. Linux 文件目录权限

    # 文件参数 d:表示是一个目录-:表示这是一个普通的文件l: 表示这是一个符号链接文件,实际上它指向另一个文件b.c:分别表示区块设备和其他的外围设备,是特殊类型的文件s.p:这些文件关系到系统的数 ...

  10. JavaScript获取css 行间样式,内连样式和外链样式的方式

    [行间样式获取] <div id='div1' style="backgroud:red">测试</div> <script> var odiv ...