首页
社区
课程
招聘
Tea 加密算法的疑问?
2007-1-31 10:54 9276

Tea 加密算法的疑问?

2007-1-31 10:54
9276
小弟最近刚看完Win32,想写Tea算法来练习一下
于是上网查询了一些资料找到了一个C++版的Tea源码
核心的加密,解密部分代码如下:
加密:
for(i=0; i<32; i++)
{
    sum += delta;
    y += (z<<4) + a^z + sum^(z>>5) + b;
    z += (y<<4) + c^y + sum^(y>>5) + d;
}
解密:
for(i=0; i<32; i++)
{
    z -= (y<<4) + c^y + sum^(y>>5) + d;
    y -= (z<<4) + a^z + sum^(z>>5) + b;
    sum -= delta;       
}
自己参照下载的电子书-<<计算机密码学-计算机网络中的数据保密和安全 第3版>> P149页的Tea算法叙述
核心加密算法
sum <- sum + delta
y <- y + (z<<4) + a^z + sum^(z>>5) + b;
z <- z + (y<<4) + c^y + sum^(y>>5) + d;
其中有 <<,>>,^,+ 运算
其顺序为先 <<,>>,在做^运算,最后为+运算
于是我写下了如下汇编代码:
.while        @_Count > 0
  mov        eax,@Sum              ; Sum <- Sum + Delata
  add         eax,@Delta
  mov        @Sum,eax
  ;----------------------------
  ;y <- y +(z<<4)+a^z+Sum^(z>>5)+b
   mov        eax,@z                ;  z << 4 --> eax
   shl        eax,4                     
   mov        ebx,@a_                 ;  a ^ z --> ebx
   xor        ebx,@z               
   mov        ecx,@z                ;  Sum ^ ( z >> 5) --> ecx
   shr        ecx,5
   xor        ecx,@Sum               
   add        eax,ebx                ;  eax + ebx + ecx + b + y -->y
   add        eax,ecx
   add        eax,@b_
   add        eax,@y       
   mov        @y,eax
                                       
   ;------------------------------
   ;z <- z +(y<<4)+c^y+Sum^(y>>5)+d
    mov        eax,@y                ;y << 4 --> eax
    shl        eax,4               
    mov        ebx,@c_                ;c ^ y --> ebx
    xor        ebx,@y
    mov        ecx,@y                ; Sum ^ (y>>5) --> ecx
    shr        ecx,5
    xor        ecx,@Sum               
    add        eax,ebx                   ; eax+ebx+ecx+d+z --> z
    add        eax,ecx
    add        eax,@d_
    add        eax,@z                                       
    mov        @z,eax
               
    dec        @_Count
.endw
结果测试结果于C++源码的结果不同;
最后找出问题,查询了一下C++的书籍
参考了<<C++ primer 第3版>> P144页 优先级的叙述
发现C++源码的预先级与-<<计算机密码学-计算机网络中的数据保密和安全 第3版>>叙述的不一样,结果根改了C++的代码
for(i=0; i<32; i++)
{
    sum += delta;
    y += (z<<4) + (a^z) + (sum^(z>>5)) + b;
    z += (y<<4) + (c^y) + (sum^(y>>5)) + d;
}
解密:
for(i=0; i<32; i++)
{
    z -= (y<<4) + (c^y) + (sum^(y>>5)) + d;
    y -= (z<<4) + (a^z) + (sum^(z>>5)) + b;
    sum -= delta;       
}
终于得到了与自己一样的结果
后又查询了C语言的核心加密算法
while (n-->0)
{                                             /* basic cycle start*/
  sum += delta ;
  y += (z<<4)+a ^ z+sum ^ (z>>5)+b;
  z += (y<<4)+c ^ y+sum ^ (y>>5)+d;    /* end cycle */
}
问题:想知道Tea算法的核心加密方式的优先级方式是怎么的?
PS:不更改C++的代码时,加密解密都正常。改了代码后加密解密也同样正常。
   只是两者结果不一样。
PS:希望有高手能帮帮忙谢谢~!

PS:通过大家的帮助Tea算法终于搞懂了,实践写了一个Tea算法的文件加密程序
   无权上传,放到了自己的网络E盘里:下载地址

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (8)
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
jjnet 5 2007-1-31 20:07
2
0
delphi:

for a:=0 to 31 do
begin
dec(z,((y shl 4)+key[2]) xor (y+sum) xor ((y shr 5)+key[3]));
dec(y,((z shl 4)+key[0]) xor (z+sum) xor ((z shr 5)+key[1]));
dec(sum,Delta);
end;

雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
jjnet 5 2007-1-31 20:15
3
0
其中有 <<,>>,^,+ 运算
其顺序为先 <<,>>,在做^运算,最后为+运算
========
这里应该是个笔误, 因为本来就是错误的。
假设这里不是错误, 那么网上所有其他tea都是错误

Symbol Name or Meaning Associativity
Highest Precedence  
++ Post-increment Left to right
-- Post-decrement  
( ) Function call  
[ ] Array element  
-> Pointer to structure member  
. Structure or union member  
++ Pre-increment Right to left
-- Pre-decrement  
! Logical NOT  
~ Bitwise NOT  
- Unary minus  
+ Unary plus  
& Address  
* Indirection  
sizeof Size in bytes  
new Allocate program memory  
delete Deallocate program memory  
(type) Type cast [for example, (float) i]  
.* Pointer to member (objects) Left to right
->* Pointer to member (pointers)  
* Multiply Left to right
/ Divide  
% Remainder  
+ Add Left to right
- Subtract  
<< Left shift Left to right
>> Right shift  
< Less than Left to right
<= Less than or equal to  
> Greater than  
>= Greater than or equal to  
== Equal Left to right
!= Not equal  
& Bitwise AND Left to right
^ Bitwise exclusive OR Left to right
| Bitwise OR Left to right
&& Logical AND Left to right
|| Logical OR Left to right
? : Conditional Right to left
= Assignment Right to left
*=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= Compound assignment  
, Comma Left to right
Lowest Precedence
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
vfer 2007-1-31 20:56
4
0
C中的优先级不是根据算法来决定的
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
iamjoke 2007-2-1 11:38
5
0
谢谢各位了~! 那么书上肯定是叙述错误的了
雪    币: 235
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lemony 1 2007-2-2 13:23
6
0
QQ的协议好像就用了这种算法。。。。
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
EndlessCrash 2007-2-5 09:32
7
0
这里有一个我写的,不过是128轮的.要32轮的把TEALIMIT改一下
cbData要求是8的整数倍

TEADELTA equ 09E3779B9h ;(sqrt(5)-1)*2^31
TEALIMIT equ 01BBCDC80h ;DELTA * 128

TEAEncrypt proc uses ebx esi edi lpData:DWORD,cbData:DWORD,lpKey:DWORD
        .if cbData==0
                ret
        .endif
        push ebp
        ;sub esp,8
       
        mov eax,cbData
        .if eax & 7
                or eax,7
                inc eax
        .endif
        add eax,lpData
        push eax
        push lpData
        mov ebx,lpKey
        .while TRUE
                mov ecx,[esp]
                .break .if ecx==[esp+4]
                add DWORD ptr [esp],8
                mov esi,[ecx]
                mov edi,[ecx+4]
                push ecx
                xor edx,edx
                .while edx!=TEALIMIT
                        mov eax,edi
                        shl eax,4
                        mov ecx,edi
                        shr ecx,5
                        xor eax,ecx
                        mov ebp,eax
                        mov eax,edi
                        xor eax,edx
                        add ebp,eax
                        mov eax,edx
                        and eax,3
                        add ebp,[ebx+4*eax]
                        add esi,ebp
                       
                        add edx,TEADELTA
                       
                        mov eax,esi
                        shl eax,4
                        mov ecx,esi
                        shr ecx,5
                        xor eax,ecx
                        mov ebp,eax
                        mov eax,esi
                        xor eax,edx
                        add ebp,eax
                        mov eax,edx
                        shr eax,11
                        and eax,3
                        add ebp,[ebx+4*eax]
                        add edi,ebp
                .endw
                pop ecx
                mov [ecx],esi
                mov [ecx+4],edi
        .endw
        add esp,8
        pop ebp
        ret
TEAEncrypt endp

TEADecrypt proc uses ebx esi edi lpData:DWORD,cbData:DWORD,lpKey:DWORD
        .if cbData==0
                ret
        .endif
        push ebp
        ;sub esp,8
       
        mov eax,cbData
        .if eax & 7
                or eax,7
                inc eax
        .endif
        add eax,lpData
        push eax
        push lpData
        mov ebx,lpKey
        .while TRUE
                mov ecx,[esp]
                .break .if ecx==[esp+4]
                add DWORD ptr [esp],8
                mov esi,[ecx]
                mov edi,[ecx+4]
                push ecx
                mov edx,TEALIMIT
                .while edx
                        mov eax,esi
                        shl eax,4
                        mov ecx,esi
                        shr ecx,5
                        xor eax,ecx
                        mov ebp,eax
                        mov eax,esi
                        xor eax,edx
                        add ebp,eax
                        mov eax,edx
                        shr eax,11
                        and eax,3
                        add ebp,[ebx+4*eax]
                        sub edi,ebp
                       
                        sub edx,TEADELTA
                       
                        mov eax,edi
                        shl eax,4
                        mov ecx,edi
                        shr ecx,5
                        xor eax,ecx
                        mov ebp,eax
                        mov eax,edi
                        xor eax,edx
                        add ebp,eax
                        mov eax,edx
                        and eax,3
                        add ebp,[ebx+4*eax]
                        sub esi,ebp
                .endw
                pop ecx
                mov [ecx],esi
                mov [ecx+4],edi
        .endw
        add esp,8
        pop ebp
        ret
TEADecrypt endp
雪    币: 3686
活跃值: (1036)
能力值: (RANK:760 )
在线值:
发帖
回帖
粉丝
cnbragon 18 2007-2-5 22:55
8
0
很多时候,碰到这种问题,就显示出标准文档的重要性了
在TEA标准文档中,加密过程是这样的:
void code(long* v, long* k) {
unsigned long y=v[0],z=v[1], sum=0, /* set up */
delta=0x9e3779b9, /* a key schedule constant */
n=32 ;
while (n-->0) { /* basic cycle start */
sum += delta ;
y += ((z<<4)+k[0]) ^ (z+sum) ^ ((z>>5)+k[1]) ;
z += ((y<<4)+k[2]) ^ (y+sum) ^ ((y>>5)+k[3]) ;
} /* end cycle */
v[0]=y ; v[1]=z ; }
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
iamjoke 2007-2-7 23:45
9
0
谢谢 各位的指教,我去查阅了 标准文档,确实书上的叙述有误

自己实践写了一个Tea算法文件加密程序,下载地址见1楼最后
:P
游客
登录 | 注册 方可回帖
返回