首页
社区
课程
招聘
一个加密算法的汇编程序,看了好几天没看懂。如果有高手有空的话,能不能稍微指点一下,不长。关键给个思路
2004-7-15 21:31 9973

一个加密算法的汇编程序,看了好几天没看懂。如果有高手有空的话,能不能稍微指点一下,不长。关键给个思路

2004-7-15 21:31
9973
* Referenced by a CALL at Address:
|:00444DD3   
|
:00444C96 55                      push ebp
:00444C97 8BEC                    mov ebp, esp
:00444C99 51                      push ecx
:00444C9A 51                      push ecx
:00444C9B 8B4510                  mov eax, dword ptr [ebp+10]        值为 45db38
:00444C9E 8B5508                  mov edx, dword ptr [ebp+08]            后4字节
:00444CA1 8B4D0C                  mov ecx, dword ptr [ebp+0C]            前4位
:00444CA4 56                      push esi 值为 8 /(长度)
:00444CA5 57                      push edi 值为 a661a0, baefe0
:00444CA6 8B38                    mov edi, dword ptr [eax] 值为5073425d
:00444CA8 897D08                  mov dword ptr [ebp+08], edi 值为5073425d
:00444CAB 8B7804                  mov edi, dword ptr [eax+04] 值为7c7f7e59
:00444CAE 897D10                  mov dword ptr [ebp+10], edi
:00444CB1 8B7808                  mov edi, dword ptr [eax+08]           值为384b3a45
:00444CB4 8B400C                  mov eax, dword ptr [eax+0C]           值为74477641
:00444CB7 33F6                    xor esi, esi esi置0
:00444CB9 897DFC                  mov dword ptr [ebp-04], edi    值为384b3a45
:00444CBC 8945F8                  mov dword ptr [ebp-08], eax     值为74477641
:00444CBF C7450C10000000          mov [ebp+0C], 00000010              循环16次

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00444D01(C)
|
:00444CC6 8D0416                  lea eax, dword ptr [esi+edx]
:00444CC9 334508                  xor eax, dword ptr [ebp+08]
:00444CCC 8BFA                    mov edi, edx
:00444CCE C1E704                  shl edi, 04
:00444CD1 03C7                    add eax, edi
:00444CD3 8BFA                    mov edi, edx
:00444CD5 C1EF05                  shr edi, 05
:00444CD8 037D10                  add edi, dword ptr [ebp+10]
:00444CDB 81EE4786C861            sub esi, 61C88647
:00444CE1 33C7                    xor eax, edi
:00444CE3 03C8                    add ecx, eax
:00444CE5 8D040E                  lea eax, dword ptr [esi+ecx]
:00444CE8 3345FC                  xor eax, dword ptr [ebp-04]
:00444CEB 8BF9                    mov edi, ecx
:00444CED C1E704                  shl edi, 04
:00444CF0 03C7                    add eax, edi
:00444CF2 8BF9                    mov edi, ecx
:00444CF4 C1EF05                  shr edi, 05
:00444CF7 037DF8                  add edi, dword ptr [ebp-08]
:00444CFA 33C7                    xor eax, edi
:00444CFC 03D0                    add edx, eax
:00444CFE FF4D0C                  dec [ebp+0C]
:00444D01 75C3                    jne 00444CC6
//这个循环将ECX,EDX加密,并仍旧存在ECX,EDX中,就是没看懂这个循环到地怎么做的。

:00444D03 8B4514                  mov eax, dword ptr [ebp+14]
:00444D06 5F                      pop edi
:00444D07 8908                    mov dword ptr [eax], ecx         //把加密后的ECX存入内存
:00444D09 895004                  mov dword ptr [eax+04], edx      //把加密后的EDX存入内存
:00444D0C 5E                      pop esi
:00444D0D C9                      leave
:00444D0E C3                      ret

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
打赏
分享
最新回复 (4)
雪    币: 3246
活跃值: (339)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
blowfish 2004-7-16 00:19
2
0
好象就是一种简单的分组加密吧,很容易求逆的。好象QQ在某个地方用到类似的算法。算法的迭代采用的是类似Feistel网络的东西。

这个算法是16轮迭代。假定第k轮迭代时,分组的高32-bit为H[k], 低32-bit为L[k]。
进入循环之前的ecx/edx就是算法的输入值,即明文H[0]/L[0];
退出循环之后的ecx/edx就是算法的输出值,即密文H[16]/L[16];
密钥可以认为是128-bit的,暂存在[ebp+08]/[ebp+10]/[ebp-04]/[ebp-08]中,分别称为key1, key2, key3, key4;

根据上面的16轮迭代过程可以得到H[k]/L[k]和H[k+1]/L[k+1]之间的递推关系,这个递推关系是两个等式。

根据上面的汇编代码得到的是从H[k]/L[k]推出H[k+1]/L[k+1]的等式,即正向算法,但根据这两个等式也很容易恒等变换出从H[k+1]/L[k+1]推出H[k]/L[k]的等式,即逆算法。

注意:
在上述算法中,常数esi的值从0每轮递减61C88647,共16轮,得到一个最终值。在逆算法中,这个过程也要反过来变成从终值每轮递加61C88647至0。

下面是我以前分析某个软件得到的类似的算法的代码,32轮的。
#define F_FUNCTION(x, k1, k2, c)  ((((x) >> 5) + (k1)) ^ (((x) << 4) + (k2)) ^ ((c) +(x)))


//软件里面的解密运算过程
//注意:编译器会将有符号数的右移翻译成SAR指令,而我们需要的是SHR指令,所以必须定义成无符号数
void Decrypt(unsigned int &edx, unsigned int &ebx)
{
	static const unsigned int Key1 = 0x13579BDF;
	static const unsigned int Key2 = 0x02468ACE;
	static const unsigned int Key3 = 0x90ABCDEF;
	static const unsigned int Key4 = 0x12345678;
	
	int C1 = 0xC6EF3720;
	for(int k = 0 ; k < 32; k++)
	{
		ebx -= F_FUNCTION(edx, Key1, Key2, C1);
		edx -= F_FUNCTION(ebx, Key3, Key4, C1);
		C1  += 0x61C88647;
	}
}

//上面的函数的逆
void Encrypt(unsigned int &edx, unsigned int &ebx)
{
	static const unsigned int Key1 = 0x13579BDF;
	static const unsigned int Key2 = 0x02468ACE;
	static const unsigned int Key3 = 0x90ABCDEF;
	static const unsigned int Key4 = 0x12345678;
	
	int C1 = 0x00000000;
	for(int k = 0 ; k < 32; k++)
	{
		C1  -= 0x61C88647;
		edx += F_FUNCTION(ebx, Key3, Key4, C1);
		ebx += F_FUNCTION(edx, Key1, Key2, C1);		
	}
}

雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dINO 2004-7-16 11:55
3
0
Blowfish,please tell me how to find the symbol of blowfish?
Include the key.Thanks.
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
softworm 30 2004-7-16 13:02
4
0
最初由 dINO 发布
Blowfish,please tell me how to find the symbol of blowfish?
Include the key.Thanks.


Blowfish的Pbox,Sbox初始值是固定的(Pi)

这里有篇不错的教程.点击下载:附件!Paper.rar
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dINO 2004-7-16 13:19
5
0
Owh,I have find this site for nearly 100 years.
Thank you very much.
游客
登录 | 注册 方可回帖
返回