吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8206|回复: 58
收起左侧

[其他原创] [原创][首发]汇编语言实现DES加解密的完整代码

  [复制链接]
longs75 发表于 2021-10-21 21:13
本帖最后由 苏紫方璇 于 2021-10-22 11:31 编辑

因为工作需要对大批量DES加密数据还原,在VS2010通过调用内置的DES功能很容易实现,另外调试了网上几个VB6.0的DES源程序,也顺利通过。总感觉DES加解密是通过大量比特位的变换实现的,用汇编语言应该更容易实现,可是网上目前没有发现用汇编语言实现DES的源程序。于是自己尝试着编写汇编代码,今天终于调试成功了,开源共享给大家,希望多提宝贵建议。
整个代码由两个子程序组成,一个KEY生成代码,一个是DES加解密代码。为了提高通用性,把DES的所有转换表数据都放在代码段中,数据读取使用相对寻址,通过堆栈传递参数,所以代码不存在重定位问题,通用性非常好。
使用中有什么不明白的地方可以给我留言。不多说了,源代码奉上:

[Asm] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
;================================
;作者:longs75
;时间:2021年10月21日
 
 
;公开源码,转载请保持以上信息完整。
;=================================
 
.386
.model flat, stdcall
option casemap :none
 
.data
strKey db 13h,34h,57h,79h,9Bh,0BCh,0DFh,0F1h     ;64位Key
SubKey dq 16 dup(0)                              ;16个48位子Key,每个子Key占用8字节空间
lResult dd 0                                     ;保留(用于VB6.0内嵌汇编编程)
;
DataIn db 01h,23h,45h,67h,89h,0ABh,0CDh,0EFh     ;64位输入数据(明文)
;DataIn db 85h,0E8h,13h,54h,0Fh,0Ah,0B4h,05h      ;64位输入数据(密文)
DataOut db 8 dup(0)                              ;64位输出数据
WorkMode db 0                                    ;工作模式 0:加密,非0:解密
;WorkMode db 8
 
.code
START:
        lea eax,lResult                               ;保留
        push eax
        lea eax,SubKey                                ;子密钥数组首地址
        push eax
        lea eax,strKey                                ;密钥地址
        push eax
        push 0                                        ;保留
        call KEYPROC
         
        lea eax,lResult                               ;保留
        push eax
        lea eax,DataIn                                ;64位输入数据地址
        push eax
        lea eax,DataOut                               ;64位输出数据地址
        push eax
        lea eax,SubKey                                ;子密钥数组首地址
        push eax
        lea eax,WorkMode                              ;工作模式变量地址
        push eax
        push 0                                        ;保留
        call DESPROC
 
        ;说明:上述调用步骤是VB6.0调用类函数时的标准方法,本人用于VB6.0内嵌汇编编程,保留的参数忽略即可。
         
        ret
;************************************
;************************************
;**                                **
;**      计算16组子密钥代码        **
;**                                **
;************************************
;************************************
KEYPROC:
        mov ebp,esp
        pushad
        call NEXT1
         
        ;  PC-1置换表:
        db 57,49,41,33,25,17,09,01
        db 58,50,42,34,26,18,10,02
        db 59,51,43,35,27,19,11,03
        db 60,52,44,36,63,55,47,39
        db 31,23,15,07,62,54,46,38
        db 30,22,14,06,61,53,45,37
        db 29,21,13,05,28,20,12,04
         
        ;  PC-2置换表:
        db 14,17,11,24,01,05,03,28
        db 15,06,21,10,23,19,12,04
        db 26,08,16,07,27,20,13,02
        db 41,52,31,37,47,55,30,40
        db 51,45,33,48,44,49,39,56
        db 34,53,46,42,50,36,29,32
         
        db 16 dup(90h)
 
NEXT1:       
        pop ebx                 ;EBX的值为PC-1的首地址
         
        ;取出64位strKey的首地址,交换高低位后放入EDX:EAX
        mov ecx,[ebp+8]
        mov dh,byte ptr[ecx]
        mov dl,byte ptr[ecx+1]
        shl edx,16
        mov dh,byte ptr[ecx+2]
        mov dl,byte ptr[ecx+3]
        mov ah,byte ptr[ecx+4]
        mov al,byte ptr[ecx+5]
        shl eax,16
        mov ah,byte ptr[ecx+6]
        mov al,byte ptr[ecx+7]
 
        ;=====================================================
         
        ;PC-1置换
        xor esi,esi             ;EDI、ESI清零
        xor edi,edi             ;转换后的结果放在:EDI:ESI
        mov ch,1                ;计数器置1
CHG_PC1_1:                 ;由于没有第32位、64位的移位操作,无须特殊处理。(移动次数为0或寄存器长度的整数倍时,均为移动0次,对标志位无影响)
        mov cl,byte ptr[ebx]
        cmp cl,32               ;位数大于32,对EAX操作
        ja PC1_A32_1
        push edx                ;否则对EDX操作
        rol edx,cl
        pop edx
        jmp PC1_EDI
PC1_A32_1:
        push eax
        rol eax,cl
        pop eax
PC1_EDI:
        rcl edi,1               ;前28位数据(高位)放在EDI
        inc ebx
        inc ch
        cmp ch,28
        jbe CHG_PC1_1
         
CHG_PC1_2:
        mov cl,byte ptr[ebx]
        cmp cl,32               ;位数大于32,对EAX操作
        ja PC1_A32_2
        push edx                ;否则对EDX操作
        rol edx,cl
        pop edx
        jmp PC1_ESI
PC1_A32_2:
        push eax
        rol eax,cl
        pop eax
PC1_ESI:
        rcl esi,1               ;后28位数据(低位)放在ESI
        inc ebx
        inc ch
        cmp ch,56
        jbe CHG_PC1_2       
        mov edx,edi             ;转换后结果重新放入EDX:EAX,EBX的值为PC-2置换表首地址
        mov eax,esi
         
        ;=====================================================
         
        ;16轮循环计算SubKey(1)-SubKey(16)
        xor ecx,ecx             ;ECX计数器初值0,终值15
FOR_ECX:
        cmp ecx,0               ;判断循环轮数,0表示第1轮,依次类推
        jz  SHL_1
        cmp ecx,1
        jz  SHL_1
        cmp ecx,8
        jz  SHL_1
        cmp ecx,15
        jz  SHL_1           ;第1、2、9、16轮左移1位,其它左移2位
        shl edx,4           ;循环左移1位(除第1、2、9、16轮之外)  
        sar edx,4
        rol edx,1
        shl eax,4
        sar eax,4
        rol eax,1
SHL_1:
        shl edx,4           ;循环左移1位(所有16轮)
        sar edx,4
        rol edx,1
        shl eax,4
        sar eax,4
        rol eax,1           ;完成Cn、Dn循环左移
        push eax            ;保护高、低各28位的EDX:EAX,下一轮继续移位
        push edx            ;保护EBX,每轮都要进行PC-2置换
        push ebx
        push ecx
        shl edx,4           ;合并EDX:EAX:高28位:低28位 ——>高32位:低24位(EAX高24位,EAX低8位AL置0)
        shl eax,4           ;EAX先左移4位,低4位补0
        rol eax,4           ;再循环左移4位,将28位有效数据的高4位移到低4位
        add dl,al           ;有效数据追加到EDX低4位
        xor al,al           ;EAX低8位清零
         
 
        xor esi,esi
        xor edi,edi
        mov ch,1             ;PC-2置换,ch计数器初值1,终值48
CHG_PC2_1:
        mov cl,byte ptr[ebx]
        cmp cl,32            ;位数大于32,对EAX操作
        ja PC2_A32_1         ;否则对EDX操作
        push edx
        rol edx,cl
        pop edx
        jmp PC2_EDI
PC2_A32_1:
        push eax
        rol eax,cl
        pop eax
PC2_EDI:
        rcl edi,1            ;前32位数据(高位)放在EDI
        inc ebx
        inc ch
        cmp ch,32
        jbe CHG_PC2_1
 
CHG_PC2_2:
        mov cl,byte ptr[ebx]
        cmp cl,32            ;位数大于32,对EAX操作
        ja PC2_A32_2         ;否则对EDX操作
        je PC2_E32
        push edx
        rol edx,cl
        pop edx
        jmp PC2_ESI
PC2_E32:                       ;当移动次数是寄存器长度倍数时(32、64……),相当于不移动(次数为0),对标志位无影响
        push edx             ;解决办法是:拆分成两次移动,两次移动总和为32
        rol edx,1            ;例如:先移动1位,再移动31位
        dec cl
        rol edx,cl
        pop edx
        jmp PC2_ESI
PC2_A32_2:
        push eax
        rol eax,cl
        pop eax
PC2_ESI:
        rcl esi,1           ;后16位数据(低位)放在ESI
        inc ebx             ;SubKey放在EDI:ESI中,格式为:高32位:低16位(ESI高16位为有效数据,低16位置0)
        inc ch
        cmp ch,48
        jbe CHG_PC2_2
        shl esi,16
 
        ;=====================================================
 
        pop ecx              ;恢复16轮计数器
        mov ebx,[ebp+12]     ;SubKey首地址
        mov [ebx+8*ecx],esi  ;计算SubKey(n)地址,ESI放在低4字节
        mov [ebx+8*ecx+4],edi ;EDI放在高4字节
        pop ebx              ;恢复PC-2表首地址
        pop edx              ;恢复Cn、Dn到EDX:EAX,进入下一轮移位
        pop eax
        inc ecx              ;计数器加1
        cmp ecx,16           ;从0到15,循环16次
        jnz FOR_ECX
         
        popad
        ret 10h
;************************************
;************************************
;**                                **
;**       DES加密/解密代码         **
;**                                **
;************************************
;************************************
DESPROC:
        mov ebp,esp
        pushad
        call NEXT2
         
        ;初始变换置换表 IP:
        db 58,50,42,34,26,18,10,02
        db 60,52,44,36,28,20,12,04
        db 62,54,46,38,30,22,14,06
        db 64,56,48,40,32,24,16,08
        db 57,49,41,33,25,17,09,01
        db 59,51,43,35,27,19,11,03
        db 61,53,45,37,29,21,13,05
        db 63,55,47,39,31,23,15,07
         
        ;扩展置换表 E:
        db 32,01,02,03,04,05
        db 04,05,06,07,08,09
        db 08,09,10,11,12,13
        db 12,13,14,15,16,17
        db 16,17,18,19,20,21
        db 20,21,22,23,24,25
        db 24,25,26,27,28,29
        db 28,29,30,31,32,01
         
        ;S盒1:
        db 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7
        db 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8
        db 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0
        db 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13
         
        ;S盒2:
        db 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10
        db 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5
        db 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15
        db 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9
         
        ;S盒3:
        db 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8
        db 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1
        db 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7
        db 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12
         
        ;S盒4:
        db 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15
        db 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9
        db 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4
        db 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14       
         
        ;S盒5:
        db 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9
        db 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6
        db 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14
        db 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3       
         
        ;S盒6:
        db 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11
        db 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8
        db 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6
        db 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13       
         
        ;S盒7:
        db 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1
        db 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6
        db 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2
        db 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12       
         
        ;S盒8:
        db 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7
        db 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2
        db 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8
        db 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11       
         
        ;P盒置换表:
        db 16,07,20,21,29,12,28,17,01,15,23,26,05,18,31,10
        db 02,08,24,14,32,27,03,09,19,13,30,06,22,11,04,25
         
        ;逆置换表IP_1:
        db 40,08,48,16,56,24,64,32,39,07,47,15,55,23,63,31
        db 38,06,46,14,54,22,62,30,37,05,45,13,53,21,61,29
        db 36,04,44,12,52,20,60,28,35,03,43,11,51,19,59,27
        db 34,02,42,10,50,18,58,26,33,01,41,09,49,17,57,25       
         
        db 16 dup(90h)
         
NEXT2:
        pop ebx                 ;EBX的值为初始变换IP的首地址
         
        ;取出64位DataIn数据的首地址,交换高低位后放入EDX:EAX
        mov ecx,[ebp+20]
        mov dh,byte ptr[ecx]
        mov dl,byte ptr[ecx+1]
        shl edx,16
        mov dh,byte ptr[ecx+2]
        mov dl,byte ptr[ecx+3]
        mov ah,byte ptr[ecx+4]
        mov al,byte ptr[ecx+5]
        shl eax,16
        mov ah,byte ptr[ecx+6]
        mov al,byte ptr[ecx+7]
         
        ;=====================================================
         
        ;初始IP变换
        push edx              ;EDX:EAX做为入口参数入栈,利用堆栈做为临时变量
        push eax
        xor esi,esi           ;EDI:ESI清零,保存IP变换后的结果
        xor edi,edi
        xor eax,eax
        mov ecx,32
IP_L32:
        mov al,byte ptr[ebx]
        cmp al,32
        ja IP_A32L
        neg al
        add al,32              ;AL=32-AL,将DES算法的位顺序转换成CPU默认的位顺序
        bt [esp+4],eax
        jmp IP_EDI
IP_A32L:
        neg al
        add al,64              ;AL=64-AL,将DES算法的位顺序转换成CPU默认的位顺序
        bt [esp],eax
IP_EDI:
        rcl edi,1
        inc ebx
        loop IP_L32       
         
        mov ecx,32
IP_R32:
        mov al,BYTE ptr[ebx]
        cmp al,32
        ja IP_A32R
        neg al
        add al,32
        bt [esp+4],eax
        jmp IP_ESI
IP_A32R:
        neg al
        add al,64
        bt [esp],eax
IP_ESI:
        rcl esi,1
        inc ebx
        loop IP_R32
         
        add esp,8
         
        ;=====================================================
         
        ;开始16轮迭代运算
        ;入口参数Ln、Rn为EDI:ESI
        xor ecx,ecx            ;循环次数初值0
 
Func_16:       
        ;扩展置换E:
        push ebx            ;保护扩展置换E首地址
        push ecx
        push edi              ;Ln入栈
        push esi              ;Rn入栈
        xor edi,edi           ;EDI、ESI清零,用于保存E置换后的48位值
        xor esi,esi           ;格式为:EDI:ESI(高32位:高16位,ESI低16位置0)
        xor eax,eax
         
        mov ecx,32
E_32:
        mov al,byte ptr[ebx]
        neg al
        add al,32
        bt [esp],eax
        rcl edi,1
        inc ebx
        loop E_32       
 
        mov ecx,16
E_16:
        mov al,byte ptr[ebx]
        neg al
        add al,32
        bt [esp],eax
        rcl esi,1
        inc ebx
        loop E_16
        shl esi,16
         
        ;=====================================================
         
        ;与子密钥进行XOR运算
        mov ecx,[esp+8]      ;取出循环次数
        mov eax,[ebp+8]      ;取出WorkMode地址
        cmp BYTE ptr[eax],0          ;0:加密,非0:解密
        jz ENCODE
        neg ecx
        add ecx,15           ;ECX=15-ECX,解密时子密钥顺序相反
ENCODE:       
        mov eax,[ebp+12]     ;取出SubKey首地址
        push [eax+ecx*8+4]   ;SubKey(n)高4字节入栈
        push [eax+ecx*8]     ;SubKey(n)低4字节入栈
XOR_SUBKEY:
        xor edi,[esp+4]      ;与子密钥进行XOR运算
        xor esi,[esp]        ;结果保存在:EDI:ESI(高32位:高16位,ESI低16位置0)
        add esp,8
         
        mov eax,edi
        shl eax,24
        shr esi,8
        add esi,eax         ;结果转换为:EDI:ESI(高24位:高24位,EDI、ESI低8位无意义)
         
         
        ;=====================================================
         
        ;S盒置换:
        xor edx,edx         ;EDX清零,用于保存S盒转换后的结果
        mov ecx,0           ;S盒计数
S0_S7:
        shl edx,4           ;EDX左移4位,准备追加下一组数据
        cmp ecx,4           ;
        jNE S_N4
        mov edi,esi         ;转换后4组数据
S_N4:
        rol edi,6           ;高6位循环左移至低6位
        mov eax,edi         ;保存在AL低6位
        mov ah,al           ;再保存一份到AH
        ror ah,1
        sar ah,4
        rol ah,1
        and ah,3            ;计算AH,AH=S盒的行数
        shr al,1
        and al,0fh          ;计算AL,AL=S盒的列数
        shl ah,4            ;AH=AH*16
        add al,ah           ;AL=AH+AL
        and eax,0FFh        ;EAX高24位清零
        add dl,BYTE ptr[ebx+eax]   ;查找S盒数据,追加到EDX低4位
        add ebx,64          ;下一个S盒首地址
        inc ecx
        cmp ecx,8
        jb S0_S7
         
        ;=====================================================
         
        ;P盒置换:
        xor esi,esi         ;ESI清零,用于保存P盒置换后的结果
        mov ecx,32
P_32:
        mov al,byte ptr[ebx]
        neg al
        add al,32
        bt edx,eax
        rcl esi,1
        inc ebx
        loop P_32       
         
        ;=====================================================
         
        xor esi,[esp+4]      ;P盒结果与L(n-1)异或,得到ESI=Rn
        pop edi              ;Ln=R(n-1),保存到EDI=Ln
        add esp,4            ;恢复堆栈
        pop ecx              ;恢复16轮迭代计数器
        pop ebx              ;恢复扩展置换E首地址
        inc ecx
        cmp ecx,16
        jb Func_16
        xchg edi,esi         ;交换L16和R16
        add ebx,592          ;EBX指向逆置换表IP_1首地址
         
        ;=====================================================
         
        ;逆置换IP_1:
        push edi              ;EDI:ESI做为入口参数入栈,利用堆栈做为临时变量
        push esi
        xor esi,esi           ;EDI:ESI清零,保存IP_1变换后的结果
        xor edi,edi
        xor eax,eax           ;实现代码与初始置换IP完全相同。
        mov ecx,32
IP_1_L32:
        mov al,byte ptr[ebx]
        cmp al,32
        ja IP_1_A32L
        neg al
        add al,32              ;AL=32-AL,将DES算法的位顺序转换成CPU默认的位顺序
        bt [esp+4],eax
        jmp IP_1_EDI
IP_1_A32L:
        neg al
        add al,64              ;AL=64-AL,将DES算法的位顺序转换成CPU默认的位顺序
        bt [esp],eax
IP_1_EDI:
        rcl edi,1
        inc ebx
        loop IP_1_L32       
         
        mov ecx,32
IP_1_R32:
        mov al,BYTE ptr[ebx]
        cmp al,32
        ja IP_1_A32R
        neg al
        add al,32
        bt [esp+4],eax
        jmp IP_1_ESI
IP_1_A32R:
        neg al
        add al,64
        bt [esp],eax
IP_1_ESI:
        rcl esi,1
        inc ebx
        loop IP_1_R32
         
        add esp,8
 
        ;=====================================================
        mov ecx,[ebp+16]       ;交换高低位,结果存放在DataOut变量中
        mov eax,edi            ;后期的Intel CPU 有一个MOVBE指令,可以快速实现换位,但AMD的CPU不支持
        mov [ecx+3],al
        mov [ecx+2],ah
        shr eax,16
        mov [ecx+1],al
        mov [ecx],ah
        mov eax,esi
        mov [ecx+7],al
        mov [ecx+6],ah
        shr eax,16
        mov [ecx+5],al
        mov [ecx+4],ah
 
        popad
        ret 18h
         
        end START
        

免费评分

参与人数 33威望 +2 吾爱币 +133 热心值 +29 收起 理由
hj413811 + 1 用心讨论,共获提升!
caoxiaolin + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
rsr + 1 + 1 谢谢@Thanks!
TIANJIFUYUN + 1 谢谢@Thanks!
xlxjyxs + 1 我很赞同!
杨辣子 + 1 + 1 不明觉厉
xixi2k + 1 谢谢@Thanks!
zhoumeto + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wikiyc + 1 + 1 谢谢@Thanks!
huaishion + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
幼儿园小班 + 1 + 1 我很赞同!
m1n9yu3 + 1 + 1 谢谢@Thanks!
hszt + 1 + 1 感谢分享
1257276297 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
pelephone + 1 + 1 我很赞同!
xmmyzht + 1 + 1 谢谢@Thanks!
solly + 3 + 1 用心讨论,共获提升!
sniper9527 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lyk1115 + 1 谢谢@Thanks!
LegendSaber + 1 + 1 鼓励转贴优秀软件安全工具和文档!
wapj152321 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
zhangbaida + 3 + 1 我很赞同!
香芋 + 1 + 1 用心讨论,共获提升!
yixi + 1 + 1 谢谢@Thanks!
zgrm1000 + 1 + 1 我很赞同!
fengbolee + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
max2012 + 1 热心回复!
gaosld + 1 + 1 谢谢@Thanks!
ygg + 1 + 1 用心讨论,共获提升!
smrjp + 1 用心讨论,共获提升!
苏紫方璇 + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Deteriorator + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

max2012 发表于 2021-10-22 22:54
longs75 发表于 2021-10-22 20:50
感谢提供信息,我到openssl的github页面看了下,果然找到了,可是打开看了下,基本看不懂,不明白它是用 ...

为了最大优化都支持是否开启汇编支持的,aes汇编都在这里,大部分是perl脚本,用来生成汇编算法的
https://github.com/openssl/openssl/blob/master/crypto/aes/asm/aes-x86_64.pl
作为兴趣玩一下就好,太投入造轮子就不要了,把时间拿来做其他的
 楼主| longs75 发表于 2021-10-22 14:25
感谢 苏紫方璇 版主加精置顶!

一点感受:通过编程实践才能提高水平。我在开始编写这个程序时,对汇编指令的理解也是一知半解,刚开始感觉难度很大,有些想放弃,随着边学边干,渐入佳境,然后一气呵成。

DES算法大量用到位操作,在编程过程中逐渐熟悉了逻辑移位、算术移位、循环移位、带进位循环移位这几组传统的位操作指令的特点和用法,同时也掌握了BT指令这个比较“新”的指令,甚至现在对BMI指令集这些更高端的位操作指令也产生了浓厚兴趣。KEYPROC 子程序完全依赖寄存器编程,没有使用堆栈变量,大量使用各种移位指令,通过CF标志实现位变换,没有使用BT指令(因为刚开始我还没接触到这个指令……),编程压力比较大,到编写DESPROC子程序的时候,由于使用了BT指令,并且运用堆栈做为临时变量,编程压力就小了很多,如果用64位汇编指令,我估计除了搞懂算法,就没什么编程压力了……

戰龍在野 发表于 2021-10-21 23:51
chinalys 发表于 2021-10-22 15:24
谢谢 提供好好学习了
舒默哦 发表于 2021-10-22 17:10
本帖最后由 舒默哦 于 2021-10-22 17:13 编辑

openssl提供有汇编,2.26G文件,用DES加密大概需要27秒。
clipboard.png
 楼主| longs75 发表于 2021-10-22 20:50
舒默哦 发表于 2021-10-22 17:10
openssl提供有汇编,2.26G文件,用DES加密大概需要27秒。

感谢提供信息,我到openssl的github页面看了下,果然找到了,可是打开看了下,基本看不懂,不明白它是用的什么格式的语法和编译器,甚至连几个置换表都没找到,惭愧,看来我还得加强学习,知识有些陈旧了
vaycore 发表于 2021-10-22 22:53
不得不说,膜拜汇编大佬
 楼主| longs75 发表于 2021-10-23 00:08
max2012 发表于 2021-10-22 22:54
为了最大优化都支持是否开启汇编支持的,aes汇编都在这里,大部分是perl脚本,用来生成汇编算法的
https ...

明白了,本人非计算机专业,也就是玩玩而已,比专业人士差太远了
wmcn 发表于 2021-10-23 10:22
看到搞汇编的人,就是牛。感谢楼主无私共享。这个转化应该比其他高级语言效率高 。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-13 08:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表