❶ 什么是TEA算法
TEA算法被广泛地应用于计算机数据加密领域,OICQ的数据安全采用了TEA算法。本文讨论了TEA的算法的原理及实现,并揭示了QQ中该算法的应用,本文是灵钥科技公司(www.panakes.com)在即时通信密码研究公开的第一篇论文,今后我们将陆续发表相关的论文及相应的产品。
TEA算法简介
TEA算法是由剑桥大学计算机实验室的DavidWheeler和RogerNeedham于1994年发明.TEA是TinyEncryptionAlgorithm的缩写。特点是加密速度极快,高速高效,但是抗差分攻击能力差。
TEA加密算法是一种分组密码算法,其明文密文块64比特(8字节),密钥长度128比特(16字节)。TEA加密算法的迭代次数可以改变,建议的迭代次数为32轮,尽管算法的发明人强调加密16轮就很充分了。两个TEAFeistel周期算为一轮。图1示例了TEA一轮的加密流程。
以下示例了TEA的C语言加密算法,TEA的解密算法与加密算法类似。
#defineTEA_ROUNDS0x20
#defineTEA_DELTA0x9E3779B9
#defineTEA_SUM0xE3779B90
voidtiny_encrypt(unsignedlong*constv,unsignedlong*constw,
constunsignedlong*constk)
{
registerunsignedlong
y=v[0],
z=v[1],
a=k[0],
b=k[1],
c=k[2],
d=k[3],
n=TEA_ROUNDS,
sum=0,
delta=TEA_DELTA;
while(n-->0){
sum+=delta;
y+=(z<<4)+a^z+sum^(z>>5)+b;
z+=(y<<4)+c^y+sum^(y>>5)+d;
}
w[0]=y;
w[1]=z;
}
TEA算法利用的不断增加的(即源程序中的delta)值作为变化,,就是黄金分割率。它的作用是使得每轮的加密是不同。的准确值可能不太重要。但是在这里,它被初始化为
=0x9e3779b
QQ是如何利用TEA进行加密的?
TEA算法被广泛应用于QQ的数据加密中,QQ采用16轮的TEA算法加密,在这时采取16轮加密时而不采取标准的32轮加密时为了减少验证服务器的压力。QQ在数据加密前采用了密码学中的常用的填充及交织技术,减少加密数据的相关性,增加破译者的破解难度。
下表列出了QQ应用TEA算法几个方面
序号
应用
相关文件
1
通讯报文的加密/解密
2
消息记录的加密/解密
MsgEx.db
3
本地消息密码、首次登录时间、提示内容验证密码
Matrix.db
4
消息备份文件
*.bak
QQ的TEA算法源程序分析
QQ在进行TEA加密前采用ntohl函数对原文数据和加密密钥进行了变换,从网络字节顺序转换位主机字节顺序进行加密后,再通过htonl函数将数据转换为网络字节顺序的数据。
为什么要这样做呢?因为不同的计算机使用不同的字节顺序存储数据。因此任何从Winsock函数对IP地址和端口号的引用和传给Winsock函数的IP地址和端口号均时按照网络顺序组织的。
为防止分析者分析出QQ是采用TEA加密算法的,程序的设计者采用了subeax,61C88647h指令,而不采用Addeax9e3779b9h指令。因为分析者只需要判断9e3779b9h(即是我们前面提的黄金分割率的值)就知道采用了TEA加密算法。
sub_409A43procnear;CODEXREF:sub_409B8C+AEp
;sub_409B8C+109p...
var_10=dwordptr-10h
var_C=dwordptr-0Ch
var_8=dwordptr-8
var_4=dwordptr-4
arg_0=dwordptr8
arg_4=dwordptr0Ch
arg_8=dwordptr10h
pushebp
movebp,esp
subesp,10h
pushebx
pushesi
movesi,[ebp+arg_0]
pushedi
pushdwordptr[esi];netlong
callntohl
pushdwordptr[esi+4];netlong
movedi,eax;y
callntohl
movebx,eax;z
moveax,[ebp+arg_4]
leaecx,[ebp+var_10]
leaesi,[ebp+var_10]
subeax,ecx
mov[ebp+arg_0],4
mov[ebp+arg_4],eax
jmpshortloc_409A7C
;哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:00409A79
loc_409A79:;CODEXREF:sub_409A43+49j
moveax,[ebp+arg_4]
loc_409A7C:;CODEXREF:sub_409A43+34j
pushdwordptr[eax+esi];netlong
callntohl;对k[0],k[1],k[2],k[3]进行ntohl变化,
mov[esi],eax
addesi,4
dec[ebp+arg_0]
jnzshortloc_409A79
push10h;做十六轮TEA运算
xoreax,eax
popecx
loc_409A93:;CODEXREF:sub_409A43+88j
movedx,ebx
movesi,ebx
shredx,5;z>>5
addedx,[ebp+var_C];z>>5+k[1]
subeax,61C88647h;sum=sum+deltadelta:0x9e3779b9
shlesi,4;z<<4
addesi,[ebp+var_10];z<<4+k[0]
xoredx,esi;(z>>5+k[1])^(z<<4+k[0])
leaesi,[eax+ebx];sum+z
xoredx,esi;(z<<4+k[0])^(sum+z)^(z>>5+k[1])
addedi,edx;y+=(z<<4+k[0])^(sum+z)^(z>>5+k[1])
movedx,edi
movesi,edi
shredx,5;y>>5
addedx,[ebp+var_4];y>>5+k[3]
shlesi,4;y<<4
addesi,[ebp+var_8];y<<4+k[2]
xoredx,esi;(y>>5+k[3])^(y<<4+k[2])
leaesi,[eax+edi];(sum+y)
xoredx,esi;(y<<4+k[2])^(sum+y)^(y>>5+k[3])
addebx,edx;z+=(y<<4+k[2])^(sum+y)^(y>>5+k[3])
dececx
jnzshortloc_409A93
pushedi;hostlong
callhtonl
movesi,[ebp+arg_8]
pushebx;hostlong
mov[esi],eax;加密结果
callhtonl
mov[esi+4],eax;加密结果
popedi
popesi
popebx
leave
retn
sub_409A43endp
结论
作为一种分组加密算法,TEA加密算法在其发展的过程中,目前出现了几种针对TEA算法设计的缺陷攻击方法,使得原有的TEA加密算法变得不安全,在过去的十几年中,TEA算法进行了若干次的改进,历经XTEA,BlockTEA,XXTEA几个版本。目前最新的算法是XXTEA。
QQ采用了最初的TEA算法做其核心的加密算法,QQ在采用TEA算法时采用了16轮的加密,其加密复杂度比32轮减了许多。利用TEA算法的设计缺陷,使得快速破解QQ密码成为可能。
值得一提的QQ在利用TEA算法做加密时,采用了交织及随机填充随机数的技术,增加了密码分析者分析难度,从一定程度上保护了信息的安全。
更多信息请访问www.panakes.com
TEA(Tiny Encryption Algorithm) 是一种优秀的数据加密算法,虽然它比 DES(Data Encryption Standard) 要简单得多, 但有很强的抗差分分析能力,加密速度也比 DES 快得多,而且对 64 位数据加密的密钥长达 128 位,安全性相当好。 下面的程序来自卢开澄《计算机密码学》(清华大学出版社)。
补充:为了使这段程序更加实用,我将其整理为几个单元, 分别用于 Delphi 和 C++Builder 。包括对数据流 TMemoryStream 和字符串的加密/解密功能, 对字符串的加密/解密还通过 Base64 编码/解码,保持加密后的字符串仍为字符串。
// v[2] : 64bit data, k[4] : 128bit key
void encipher( unsigned long * const v, const unsigned long * const k )
{
register unsigned long y = v[0], z = v[1], sum = 0, delta = 0x9E3779B9,
a = k[0], b = k[1], c = k[2], d = k[3], n = 32;
while ( n-- > 0 )
{
sum += delta;
y += ( z << 4 ) + a ^ z + sum ^ ( z >> 5 ) + b;
z += ( y << 4 ) + c ^ y + sum ^ ( y >> 5 ) + d;
}
v[0] = y;
v[1] = z;
}
void decipher( unsigned long * const v, const unsigned long * const k )
{
register unsigned long y = v[0], z = v[1], sum = 0xC6EF3720, delta = 0x9E3779B9,
a = k[0], b = k[1], c = k[2], d = k[3], n = 32;
// sum = delta << 5, in general sum = delta * n
while ( n-- > 0 )
{
z -= ( y << 4 ) + c ^ y + sum ^ ( y >> 5 ) + d;
y -= ( z << 4 ) + a ^ z + sum ^ ( z >> 5 ) + b;
sum -= delta;
}
v[0] = y;
v[1] = z;
}
❷ TEA加密算法的介绍
TEA算法由剑桥大学计算机实验室的David Wheeler和Roger Needham于1994年发明。它是一种分组密码算法,其明文密文块为64比特,密钥长度为128比特。TEA算法利用不断增加的Delta(黄金分割率)值作为变化,使得每轮的加密是不同,该加密算法的迭代次数可以改变,建议的迭代次数为32轮。
❸ QQ聊天记录加密 - 100分(先给20分,事后再奉送80分)
本地聊天记录的加密方法
事实上以上第二条所说是一个利用已有客户端简单规避本地检查的办法。如果你愿意,可以自己写一个查看聊天记录的工具,因为它的加密方式是如此的脆弱。
首先普及一点常识:TEA算法(Tiny Encryption Algorithm,即微型加密算法)是一个正规的密码学意义上的加密算法,你可以在[url]http://www.ftp.cl.cam.ac.uk/ftp/papers/djw-rmn/djw-rmn-tea.html[/url]找到原作者对其的介绍。QQ的加密,包括本地文件加密和远程数据包加密,主要使用的就是这个算法。值得注意的是原作者使用的是32轮运算(即使是32轮,这个算法也被证明是可以已知明文攻击的),然而TENCENT将其降为了16轮。时间上省了一半,但安全性却严重下降。算法常识以后再讲,我们只要知道该算法是公开的就可以了。(废话,不公开哪来的那么多开源QQ,比如lumaQQ)。
QQ本地历史数据,包括聊天记录和一些日志,用一个key加密后存在本地Msg.db或者MsgEx.db中,但是这个key呢,用QQ号码的MD5加密存在本地同一个文件中,换句话说,知道QQ号码就可以解密这些文件,QQ号码是什么呢?就是所在目录名!
当然,如果你启用了本地消息加密,情况会稍微好那么一点点,要看你的本地加密密码强度了。但是有多少人会去设置呢?
帅哥给分阿
❹ qq聊天记录的加密原理 迫切想了解QQ2009以上版本离线聊天记录的加密原理,最好有专门介绍的文章
qq聊天记录加密是用TEA算法(Tiny Encryption Algorithm,即微型加密算法),你可以自己网络这串英文词。
❺ TEA加密算法的内容
代码如下:
void qq_encipher(unsigned long *const plain, const unsigned long *const key, unsigned long *const crypt)
//参数为8字节的明文输入和16字节的密钥,输出8字节密文
{
unsigned long left = plain[0],right = plain[1],
a = key[0], b = key[1],
c = key[2], d = key[3],
n = 32, sum = 0,
delta = 0x9E3779B9;
// 明文输入被分为左右两部分,密钥分为四部分存入寄存器,n表示加密轮数推荐32。Delta为一常数。
while (n-- > 0) {
sum += delta;
left += ((right << 4) + a) ^ (right + sum) ^ ((right >> 5) + b);
right += ((left << 4) + c) ^ (left + sum) ^ ((left >> 5) + d);
}
crypt[0] = left ;
crypt[1] = right ;
}
void decrypt(unsigned long *v, unsigned long *k) {
unsigned long y=v[0], z=v[1], sum=0xC6EF3720, i; /* set up */
unsigned long delta=0x9e3779b9; /* a key schele constant */
unsigned long a=k[0], b=k[1], c=k[2], d=k[3]; /* cache key */
for(i=0; i<32; i++){ /* basic cycle start */
z -= ((y<<4) + c) ^ (y + sum) ^ ((y>>5) + d);
y -= ((z<<4) + a) ^ (z + sum) ^ ((z>>5) + b);
sum -= delta; /* end cycle */}v[0]=y;v[1]=z;}
虽然TEA算法比 DES(Data Encryption Standard) 要简单得多, 但有很强的抗差分分析能力,加密速度也比 DES 快得多,而且对 64 位数据加密的密钥长达 128 位,安全性相当好。其可靠性是通过加密轮数而不是算法的复杂度来保证的。从中可以看到TEA 算法主要运用了移位和异或运算。密钥在加密过程中始终不变。
❻ Tea算法的疑问
我想你能搜到TEA算法的源码吧,不管如何,我也贴一份, encrypt是加密,decrpty是解密。 第一个输入参数是要被加密/解密的信息,是64bit,也就是一个int32数组,数组是两个元素。 第二个参数是128bit的密钥,也就是4个元素的int32数组。密钥你可以理解成密码,只不过在TEA算法中,要求密钥必须是128bit。
所以,TEA算法一次加密/解密64bit信息,如果你要加密/解密的信息长于64bit,那你要分多次进行,如果小于64bit,比如你只想加密一个数字 123,那你应该把这个信息补全到64bit,比如前32bit是你要加密的数字,后32位随便是什么。
看一下我下面的例子, 我用 "0123456789abcdef" 这个字符串(刚好16个字符,128bit)作为密钥,要加密的信息是 {123, 321} 两个整数 (刚好64bit)。然后打印出加密后得到的内容,以及解密后得到的内容(解密后得到的内容就合加密前一样,是{123,321})
另外,你可能会注意到 加密解密时候用到的 delta=0x9e3779b9; 这个数字的得来是 2^32 除以一个常数,这个常数就是传说中的黄金比例 1.6180339887。
我不了解QQ是如何使用TEA的,但是无非就是将用户密码根据一定的方式转换成 128bit的密钥,然后再应用 encrypt/decrypt 函数来对收发数据进行加密/解密,一次处理64bit,和我的例子没有什么实质性的区别。
#include <stdio.h>
#include <stdint.h>
#include <string.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 schele 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 schele 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()
{
const char *passwd = "0123456789abcdef";
uint32_t value[2] = {123, 321};
uint32_t key[4];
char *p = NULL;
memcpy(key, passwd, sizeof(key));
encrypt(value, key);
printf("After encrypt {%u, %u}\n", value[0], value[1]);
decrypt(value, key);
printf("After descrpt {%u, %u}\n", value[0], value[1]);
return 0;
}
密钥不是胡编乱造的,密钥就相当于密码,不同的人会有不同的密码。但是每个人的密码长度可能与加密算法需要的密码长度不同,这样就要按照一定的规则将用户密码变成符合要求的密钥,比如用 MD5算法 就可以将任意字符串转换成128bit的密钥,然后就可以应用 TEA 来加密数据。要破解这样的数据,除非你知道那个128bit的密钥,也就是只有你知道用户本身的密码是什么,你才能得到128bit的密钥,你才能解密数据。
我的例子里的密钥只是随便写了一个举例用的,你可以改成任何你想要的内容。
❼ 招新——第一次尝试破解tea算法
开始接触逆向分析时,入门级别的一道题目,是一个师兄写的考核题《sotired》,尝试着破解了下,以下是具体的过程。
1、双击发现打不开,应该是linux系统下的文件(事实证明确实如此,我在虚拟机那里验证了一下,随便输入字符串,得到的答案是sorry~,给人crakeme的感觉,哈哈)
2、使用反汇编工具ida64位,将文件拖进去,找到main函数,使用F5大法,得到下面的界面:
看到sorry~和wow!congratulation!的字符串,可以推断出有字符串的对比,看到if语句,没错就是它了,看来temp[k]里面有我们想要的东西(用于匹配比较的正确密文)点进去,得到
这里利用一个小插件lazyida,哈哈哈(我比较懒),得到密文,
在这里需要声明下,因为最后读出来的那个0x00111885B有误(lazyida的原因),其实是0x32111885B才对,所以是 0x572CB9C1, 0x73A6EB63, 0x069E6A55, 0x818E33D9, 0x7ED0A862, 0x3211885B,这些16进制的数就是密文啦!有了密文,我们要破解它,就需要找密钥啦,回去看函数
想象下,用户输入一组字符串,for循环了3次,atoui函数猜测应该是某种转换函数,点进去
果然是移位加密转换,结果是int 型,所以v11[6]的字符数据全部被转换了数字,继续往下
又有3次循环,看到encipher函数应该是加密函数来的,然后传递了两个参数,一个是转化后的v11,另一个v7,这里就可以怀疑了,v7应该是密钥,而且用了引用,难道是地址吗?很奇怪,点进去v7,得到
这里又要怀疑了,前面4个都是?一个数字有4个数据,感觉很像数组的样子,于是尝试一波
转换为数组,然后F5大法刷新下!得到
看来我们的推断是正确的,v7是一个数组,里面的数据应该是密钥了!到此,我们成功地拿到了密文和密钥了,接下来就是解密了,解密前需要知道是怎么加密的,回到刚刚的encipher函数,进去
看到这里有人可能要很激动了,这个算法不就是tea算法吗?!(没错,虽然我一开始也不知道,于是我去谷歌了一波!)
tea算法就是把密文结合密钥进行移位再异或的运算,总共进行32轮。解密则是反过来求解,不过需要先算出delta的值,即9e3779b9*32后得到13c6ef3720,明显溢出了(手贱算了下,溢出。tea算法把溢出的忽略了,emmmm,我也不太懂其中的原因,能用先用着,哈哈哈),于是乎,可以写脚本了,打开c++,写入脚本
我们的密文和密钥修改好后,因为有密文有6个16进制的数,所以解密3次,得到结果
好啦,这就是我们的flag了,但是看不懂是吧,没关系,去转换下,谷歌走起!
大家记得把空格消除,然后把它和在一起转化,好啦,虚拟机linux操作系统打开,文件打开,输入flag,得到的就是WOw!congratulation!
以上便是我花了一个下午整理出来的一个逆向题目,希望对大家有帮助,也希望能多多交流哦,嘻嘻~
❽ tea 算法的原理
TEA加密和解密时都使用一个常量值,这个常量值为0x9e3779b,这个值是近似黄金分割率,注意,有些编程人员为了避免在程序中直接出现"mov 变量,0x9e3779b",以免被破解者直接搜索0x9e3779b这个常数得知使用TEA算法,所以有时会使用"sub 变量,0x61C88647"代替"mov 变量,0x9e3779b",0x61C88647=-(0x9e3779b)。
TEA算法每一次可以操作64bit(8byte),采用128bit(16byte)作为key,算法采用迭代的形式,推荐的迭代轮数是64轮,最少32轮。
❾ 轻量级 加密算法 有哪几种
注:(以下内容我是从网上找的,不知道能不能帮到你..这些问题我也不怎么懂!!)
1.AES(Advanced Encryption Standard),
AES是一个使用128为分组块的分组加密算法,分组块和128、192或256位的密钥一起作为输入,对4×4的字节数组上进行操作。AES的每一轮加密都包含4个阶段,分别是AddRoundKey,SubBytes,ShiftRows,和MixColumns。众所周之AES是种十分高效的算法,尤其在8位架构中,这源于它面向字节的设计。
AES 适用于8位的小型单片机或者普通的32位微处理器,并且适合用专门的硬件实现,硬件实现能够使其吞吐量(每秒可以到达的加密/解密bit数)达到十亿量级。同样,其也适用于RFID系统。[3]高效的实现和算法的免费使用为AES在无线局域网和后来出现的相关协议中的应用铺平了道路。
2.DESL(Data Encryption Standard Lightweight Extension),
数据加密标准(DES)是由美国联邦信息处理标准在1976年为美国选出的一种加密算法。作为一个分组加密算法,DES在64位大小的分组快上进行操作,其密钥同样也是64位。[10]DES的大致结构由Feistel网络组成,此网络中包括含有8个S-Boxes的16次完全相同的基本轮回,一次初始排列,一次最终排列和一个独立的密钥次序表。
3.XXTEA
TEA微型加密算法最初是由David Wheeler和Roger Needham在1994年以Fast Software Encryption工作室的名义发表的,设计的重点在于描述与实现的简单性。它是一种分组加密算法,以128位的密钥对64位的分组块进行操作。[6]TEA遭受到等效密钥的困扰——每个密钥与其他是那个密钥是等效的,也就是说有效的密钥长度只有126位。此算法易受到相关密钥(Related Key)攻击法的攻击。
❿ TEA加密算法的应用
QQTEA 算法建立在标准 TEA算法的基础上,使用16轮的加密(这是最低限,推荐应该是32轮)。QQ在使用这个算法的时候,由于需要加密不定长的数据,所以使用了一些常规的填充办法和交织算法。
1 填充算法
如果明文本身的长度不是8的倍数,那么还要进行填充以使其成为8的倍数。以字节为单位,令N=原始字符串+10+填充字节数n,则N应该是8的倍数。
具体的填充方法:第一个字节为:(random()&0xf8)|n,随后填充(n+2)个字节random()&0xff ,后面接原始数据,最后填充7 个字节0x00 。
因为使用了不同的随机数,所以填充的结果使得即使对于相同的明文,密文的结果也会不同。
2 交织算法
消息被分为多个加密单元,每一个加密单元都是8字节,使用TEA进行加密,加密结果与下一个加密单元做异或运算后再作为待加密的明文。