首页
社区
课程
招聘
算法分析[求助]
发表于: 2004-12-16 14:01 8012

算法分析[求助]

2004-12-16 14:01
8012
求字符串加密函数算法:

待加密字符串:
03400974  66 70 63 6A 31 32 30 30  fpcj1200
0340097C  31 33                    13

加密后的密文为64位(定长,不管有多长字符串加密后定长64位):
03400984  FE 1B E4 01 77 B0 7F 3D  ??w?=
0340098C  F6 DA 31 7F F8 BC CA FA  鲒1?竖
03400994  6A 2A 27 53 80 78 4E 59  j*'S?NY
0340099C  08 EB 68 8F E1 35 E3 F1  腓?5泷
034009A4  BC 62 48 C7 ED 5F C1 0F  尖H琼_?
034009AC  8E 5D 57 B3 C1 C9 39 19  ?W沉?
034009B4  C5 37 34 96 7C 6C 4F DD  ?4?lO
034009BC  A6 1E 62 55 12 FB 78 AF  ?bU?

具体详细代码及密钥请看:
http://bbs.pediy.com/showthread.php?s=&threadid=8465

请问高手这是什么算法?我的Delphi错在哪里??用其它语言实现也行。

用我的Delphi函数加密上面的结果是对的,其它的字符串就有问题了!!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (20)
雪    币: 397
活跃值: (799)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wsy
2
猜测应该是512比特的rsa,或者是类似的公钥密码算法

试试加密超过64字节的字符串,看看结果是不是还是64字节
2004-12-17 16:51
0
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
3
字符串:
033D09A4  66 70 63 6A 31 32 33 34  fpcj1234
033D09AC  35 36 37 38 39 30 31 32  56789012
033D09B4  33 34 35 36 37 38 39 30  34567890
033D09BC  31 32 33 34 35 36 37 38  12345678
033D09C4  30 30 31 31 32 33 34 35  00112345
033D09CC  36 37 38 39 30 31 32 33  67890123
033D09D4  34 35 36 37 38 39 30 31  45678901
033D09DC  32 33 34 35 36 37 38 39  23456789
033D09E4  30 31 32 33 34 35 36 37  01234567
033D09EC  38 39 30                 890

加密后:
033D09F4  B2 54 CA A5 5A 7D D6 16  苍圣Z}?
033D09FC  BE 79 9F BD D3 D9 9B 1B  均?淤?
033D0A04  37 5D F4 D3 DC E2 5A B3  7]粲茆Z
033D0A0C  B8 82 BB EA C1 98 1D 74  ?魂?t
033D0A14  89 6B 4A 9E 7E 71 79 D0  ?J?qy
033D0A1C  9B 18 BD 46 38 59 55 26  ?狡8YU&
033D0A24  D1 A0 47 2F 6C CB 1E 9A  堰G/l?
033D0A2C  B6 DB 2D F6 D5 FB 5B 54  钝-稣?T
2004-12-17 21:48
0
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
4
我个人认为不是RSA 我没看到 三个数 p, q, r的形式
2004-12-17 21:53
0
雪    币: 3246
活跃值: (374)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
5
“不管多长,加密后都是64字节”。如果确实这样,那就是hash算法,不是加密算法,因为信息丢失了。
2004-12-17 22:05
0
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
6
blowfish 版主,你说的不错.信息确实会丢失,我看了一下

是通过循环将ASCII码的高低位分别于密钥表数据累加计算,循环变量就是0-63,这好像不符合hash,应该是软件作者自己的算法?
2004-12-18 20:53
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
最初由 baby2008 发布
blowfish 版主,你说的不错.信息确实会丢失,我看了一下

是通过循环将ASCII码的高低位分别于密钥表数据累加计算,循环变量就是0-63,这好像不符合hash,应该是软件作者自己的算法?


type
  Tmw = array[1..64] of Byte;
...
function EnCrypt(aStr: string): Tmw;
...
EnCrypt := mw;

虽然不懂delphi,还是可以看出是结果是64字节,512位。应该是hash算法,不过还没有听说哪个hash函数是512位的。:)
2004-12-21 21:53
0
雪    币: 3246
活跃值: (374)
能力值: (RANK:20 )
在线值:
发帖
回帖
粉丝
8
SHA就有512的:D
2004-12-21 22:56
0
雪    币: 397
活跃值: (799)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wsy
9
SHA就有512的?

好像没听说过啊。
2004-12-22 09:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ASM
10
sha512("fpcj120013")=hex2char("A1A04CF7EB0A64EA75A44E563129E322D79FEE3F0A59BFA45F5A469F1B48B248C0B421DF71571A6C52926F6ED7F2C9101B5059FAEC833DF063925707C830C19E")
2004-12-22 10:00
0
雪    币: 3686
活跃值: (1036)
能力值: (RANK:760 )
在线值:
发帖
回帖
粉丝
11
最初由 wsy 发布
SHA就有512的?

好像没听说过啊。


:)
2004-12-22 11:16
0
雪    币: 295
活跃值: (461)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
12
可以看看汇编的代码流程
2004-12-22 11:36
0
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
13
荣幸,一个问题引来这么多位热心的版主,万分感谢!!

function EnCrypt(aStr: string): Tmw;
var
  i, j, k: Integer;
  mw: Tmw;
  ASCII, ASCII_H, ASCII_L, aKey, aKey_H, aKey_L: Byte;
begin
  for i := 0 to 63 do
  begin
    aKey := lc_key[i];
    for j := 0 to Length(aStr) - 1 do
    begin
      k := (i + j) mod Length(aStr);
      ASCII := Ord(aStr[k + 1]);

      aKey_H := aKey shr 4;
      aKey_L := aKey and $0F;
      if aKey_L = 0 then aKey_L := ((aKey_L - 1) or $F0) + 1;

      ASCII_H := ASCII shr 4;
      ASCII_L := ASCII and $0F;
      if ASCII_L = 0 then ASCII_L := ((ASCII_L - 1) or $F0) + 1;

      ASCII_H := ASCII_H xor aKey_H;
      ASCII_L := ASCII_L xor aKey_L;
      aKey := (ll_key[ASCII_H] shl 4) + ll_key[ASCII_L];

      if (ASCII > $7F) then aKey := 0; //中文ascii处理
      if aKey = 0 then aKey := k + 1;

    end;

    if aKey = 0 then aKey := i + 1;
    mw[i + 1] := aKey;
  end;
  EnCrypt := mw;
end;

数字、字母“加密”结果是正确的,有中文字符就有可能出错,我一直改不好。

03551060     55                push ebp
03551061     8BEC              mov ebp,esp
03551063     81EC AC000000     sub esp,0AC                          
03551069     53                push ebx
0355106A     56                push esi
0355106B     57                push edi
0355106C     8DBD 54FFFFFF     lea edi,dword ptr ss:[ebp-AC]
03551072     B9 2B000000       mov ecx,2B
03551077     B8 CCCCCCCC       mov eax,CCCCCCCC
0355107C     F3:AB             rep stos dword ptr es:[edi]           ; 43个CCCCCCCC
0355107E     8B45 08           mov eax,dword ptr ss:[ebp+8]          ; 累计后的字符串
03551081     50                push eax
03551082     E8 89020000       call zt_etax.03551310                 ; 计算长度
03551087     83C4 04           add esp,4
0355108A     8945 AC           mov dword ptr ss:[ebp-54],eax         ; var21=待长度
0355108D     C745 A4 00000000  mov dword ptr ss:[ebp-5C],0           ; var23=0
03551094     EB 09             jmp short zt_etax.0355109F
03551096     8B4D A4           mov ecx,dword ptr ss:[ebp-5C]
03551099     83C1 01           add ecx,1
0355109C     894D A4           mov dword ptr ss:[ebp-5C],ecx
0355109F     837D A4 40        cmp dword ptr ss:[ebp-5C],40          ; var23 不能大于64 密码表取值范围 初值=0
035510A3     0F8D E5000000     jge zt_etax.0355118E
035510A9     8B55 A4           mov edx,dword ptr ss:[ebp-5C]         ; var23
035510AC     8B0495 B0BA5703   mov eax,dword ptr ds:[edx*4+357BAB0]
035510B3     8945 B8           mov dword ptr ss:[ebp-48],eax         ; var18 密码值
035510B6     C745 A8 00000000  mov dword ptr ss:[ebp-58],0           ; var22=0
035510BD     EB 09             jmp short zt_etax.035510C8
035510BF     8B4D A8           mov ecx,dword ptr ss:[ebp-58]         ; var22循环变量
035510C2     83C1 01           add ecx,1                             ; 循环变量+1
035510C5     894D A8           mov dword ptr ss:[ebp-58],ecx         ; 循环变量
035510C8     8B55 A8           mov edx,dword ptr ss:[ebp-58]
035510CB     3B55 AC           cmp edx,dword ptr ss:[ebp-54]         ; var21=字符串长度
035510CE     0F8D 9C000000     jge zt_etax.03551170                  ; >=长度

035510D4     8B45 A8           mov eax,dword ptr ss:[ebp-58]
035510D7     0345 A4           add eax,dword ptr ss:[ebp-5C]         ; var23
035510DA     99                cdq
035510DB     F77D AC           idiv dword ptr ss:[ebp-54]
035510DE     8955 A0           mov dword ptr ss:[ebp-60],edx         ; var24
035510E1     8B45 08           mov eax,dword ptr ss:[ebp+8]
035510E4     0345 A0           add eax,dword ptr ss:[ebp-60]
035510E7     0FBE08            movsx ecx,byte ptr ds:[eax]           ; 取字符

035510EA     894D 94           mov dword ptr ss:[ebp-6C],ecx         ; var27存放字符 Or $FFFFFF00;

035510ED     8B45 B8           mov eax,dword ptr ss:[ebp-48]         ; var18 计算结果
035510F0     99                cdq
035510F1     83E2 0F           and edx,0F
035510F4     03C2              add eax,edx
035510F6     C1F8 04           sar eax,4

035510F9     8945 B4           mov dword ptr ss:[ebp-4C],eax         ; var19 var18高4位

035510FC     8B55 B8           mov edx,dword ptr ss:[ebp-48]
035510FF     81E2 0F000080     and edx,8000000F
03551105     79 05             jns short zt_etax.0355110C
03551107     4A                dec edx
03551108     83CA F0           or edx,FFFFFFF0
0355110B     42                inc edx
0355110C     8955 B0           mov dword ptr ss:[ebp-50],edx         ; var20 var18的低4位
0355110F     8B45 94           mov eax,dword ptr ss:[ebp-6C]         ; var27 ASCII
03551112     99                cdq
03551113     83E2 0F           and edx,0F
03551116     03C2              add eax,edx
03551118     C1F8 04           sar eax,4
0355111B     8945 9C           mov dword ptr ss:[ebp-64],eax         ; var25 ASCII高
0355111E     8B45 94           mov eax,dword ptr ss:[ebp-6C]         ; var27 ASCII字符
03551121     25 0F000080       and eax,8000000F
03551126     79 05             jns short zt_etax.0355112D
03551128     48                dec eax
03551129     83C8 F0           or eax,FFFFFFF0
0355112C     40                inc eax
0355112D     8945 98           mov dword ptr ss:[ebp-68],eax         ; var26 ASCII低
03551130     8B4D 9C           mov ecx,dword ptr ss:[ebp-64]         ; var25
03551133     334D B4           xor ecx,dword ptr ss:[ebp-4C]         ; var19 计算结果var18 sar4
03551136     894D 9C           mov dword ptr ss:[ebp-64],ecx         ; var25=var25 or var19
03551139     8B55 98           mov edx,dword ptr ss:[ebp-68]         ; var26
0355113C     3355 B0           xor edx,dword ptr ss:[ebp-50]         ; var20
0355113F     8955 98           mov dword ptr ss:[ebp-68],edx         ; var26=var26 or var20
03551142     8B45 9C           mov eax,dword ptr ss:[ebp-64]
03551145     8B0C85 30BA5703   mov ecx,dword ptr ds:[eax*4+357BA30]  ; 取密码
0355114C     C1E1 04           shl ecx,4
0355114F     8B55 98           mov edx,dword ptr ss:[ebp-68]
03551152     030C95 30BA5703   add ecx,dword ptr ds:[edx*4+357BA30]
03551159     894D B8           mov dword ptr ss:[ebp-48],ecx         ; var18
0355115C     837D B8 00        cmp dword ptr ss:[ebp-48],0
03551160     75 09             jnz short zt_etax.0355116B
03551162     8B45 A0           mov eax,dword ptr ss:[ebp-60]
03551165     83C0 01           add eax,1
03551168     8945 B8           mov dword ptr ss:[ebp-48],eax
0355116B   ^ E9 4FFFFFFF       jmp zt_etax.035510BF
03551170     837D B8 00        cmp dword ptr ss:[ebp-48],0
03551174     75 09             jnz short zt_etax.0355117F
03551176     8B4D A4           mov ecx,dword ptr ss:[ebp-5C]
03551179     83C1 01           add ecx,1
0355117C     894D B8           mov dword ptr ss:[ebp-48],ecx
0355117F     8B55 A4           mov edx,dword ptr ss:[ebp-5C]         ; var23
03551182     8A45 B8           mov al,byte ptr ss:[ebp-48]
03551185     884415 BC         mov byte ptr ss:[ebp+edx-44],al
03551189   ^ E9 08FFFFFF       jmp zt_etax.03551096
0355118E     8B4D A4           mov ecx,dword ptr ss:[ebp-5C]
03551191     C6440D BC 00      mov byte ptr ss:[ebp+ecx-44],0
03551196     8D55 BC           lea edx,dword ptr ss:[ebp-44]
03551199     52                push edx
0355119A     8B45 0C           mov eax,dword ptr ss:[ebp+C]
0355119D     50                push eax
0355119E     E8 7D000000       call zt_etax.03551220
035511A3     83C4 08           add esp,8
035511A6     B8 01000000       mov eax,1
035511AB     5F                pop edi
035511AC     5E                pop esi
035511AD     5B                pop ebx
035511AE     81C4 AC000000     add esp,0AC
035511B4     3BEC              cmp ebp,esp
035511B6     E8 D5010000       call zt_etax.03551390
035511BB     8BE5              mov esp,ebp
035511BD     5D                pop ebp
035511BE     C2 0800           retn 8

估计问题是在处理:
035510E7     0FBE08            movsx ecx,byte ptr ds:[eax] ;movsx 字符扩展  中文的高位全是FFFFF

还有cdq的处理上
035510ED     8B45 B8           mov eax,dword ptr ss:[ebp-48]         ; var18 计算结果
035510F0     99                cdq
035510F1     83E2 0F           and edx,0F
035510F4     03C2              add eax,edx
035510F6     C1F8 04           sar eax,4

0355110F     8B45 94           mov eax,dword ptr ss:[ebp-6C]         ; var27 ASCII
03551112     99                cdq
03551113     83E2 0F           and edx,0F
03551116     03C2              add eax,edx
03551118     C1F8 04           sar eax,4

商业软件不便放上来,但我提炼了一下做了个CrackMe
http://bbs.pediy.com/showthread.php?s=&threadid=8558

虽然我已经爆破了它,还有通过修改dll文件中的函数返回值能做出注册机,但是我觉的不是很完美,能吧本贴问题解决掉,那真的是太完美了,哪位高人能帮帮我? 第一次搞破解,而且是PB程序,不容易啊!
2004-12-22 12:09
0
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
14
最初由 ASM 发布
sha512("fpcj120013")=hex2char("A1A04CF7EB0A64EA75A44E563129E322D79FEE3F0A59BFA45F5A469F1B48B248C0B421DF71571A6C52926F6ED7F2C9101B5059FAEC833DF063925707C830C19E")


是的,但不是我要的。
2004-12-22 16:10
0
雪    币: 3686
活跃值: (1036)
能力值: (RANK:760 )
在线值:
发帖
回帖
粉丝
15
最初由 baby2008 发布
荣幸,一个问题引来这么多位热心的版主,万分感谢!!

function EnCrypt(aStr: string): Tmw;
var
i, j, k: Integer;
........


中文字符可能和编码有关,UNICODE
2004-12-22 16:12
0
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
16
估计问题是在处理:
035510E7     0FBE08            movsx ecx,byte ptr ds:[eax] ;movsx 字符扩展  中文的高位全是FFFFFFXX
2004-12-22 17:11
0
雪    币: 397
活跃值: (799)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wsy
17
你是用什么写程序?
汇编还是c,或是其他高级语言。

你把数据类型变一下看看。
我碰到这种情况一般定义的数据类型为 无符号
2004-12-22 17:22
0
雪    币: 442
活跃值: (1216)
能力值: ( LV12,RANK:1130 )
在线值:
发帖
回帖
粉丝
18
最初由 wsy 发布
你是用什么写程序?
汇编还是c,或是其他高级语言。

你把数据类型变一下看看。
我碰到这种情况一般定义的数据类型为 无符号


都会一点,最近玩delphi多点,我试过byte、integer、dword三种数据类型都不行。:(
2004-12-22 19:10
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
if (ASCII > $7F) then aKey := 0; //中文ascii处理

用两个byte表示一个汉字,第一个byte的头一位是1,(基本字符头一位是0).第二个就不一定是了吧.

仅仅是瞎猜,基础知识掌握地不牢靠:p
2004-12-22 22:39
0
雪    币: 397
活跃值: (799)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wsy
20
两个字节的最高位比特应该都是1

我不懂delphi,但我想道理都是一样的
如果数据类型时有符号的,最高位比特是符号位

如果是有符号数,7F应该是最大的
2004-12-23 08:40
0
雪    币: 211
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
delphi的很多库函数都是直接调用的API,在声明的时候后缀有A和W的分别,应该就是字符集的区别。看楼主也没有用什么库函数,如果是数据类型的问题,试试把关键部分改成嵌入汇编以后怎么样?
2004-12-26 12:36
0
游客
登录 | 注册 方可回帖
返回
//