SM4加解密解决之前发的有问题

易语言 2020-01-25 14:57:33

SM4加解密解决之前发的有问题

.子程序 进制_字节集到十六进制_ASM, 文本型, , 返回把字节集数据转换为16进制数据文本,每2个字符为1字节数据
.参数 字节集数据, 字节集, , 待转换字节集数据.
.参数 分隔符号, 文本型, 可空, 分隔符的作用就是 FF分隔FF分隔FF 空=""=不分隔.
.参数 保留参数, 整数型, 可空, 此参数不需要使用.
.局部变量 十六进制, 文本型, , , 保存转换后的十六进制.若空,以返回值返回结果

保留参数 = 取字节集长度 (字节集数据)
.如果真 (保留参数 > 0)
十六进制 = 取重复文本 (保留参数, “00” + 分隔符号)
保留参数 = 取变量数据地址_ASM (十六进制, #文本型)
' 0040357E 837D 10 00 cmp dword ptr [ebp+10], 0 ; 分隔为空?
' 00403582 74 17 je short 0040359B ; 为空 跳
' 00403584 FF4D 10 dec dword ptr [ebp+10] ; 分隔长度=0
' 00403589 8B45 0C mov eax, dword ptr [ebp+C] ; EAX=参数2
' 0040358C 85C0 test eax, eax
' 0040358E 74 0D je short 0040359D ; 空参 跳
' 00403590 8B00 mov eax, dword ptr [eax] ; EAX=分隔符
' 00403592 8038 00 cmp byte ptr [eax], 0
' 00403595 74 06 je short 0040359D ; 终止 跳
' 00403597 FF45 10 inc dword ptr [ebp+10] ; 递增长度
' 0040359A 40 inc eax ; 递增地址
' 0040359B ^ EB F5 jmp short 00403592 ; 继续循环
' 0040359D 90 nop
' 0040359E 51 push ecx ; 备份ECX
' 0040359F 52 push edx ; 备份EDX
' 004035A0 53 push ebx ; 备份EBX
' 004035A1 56 push esi ; 备份ESI
' 004035A2 57 push edi ; 备份EDI
' 004035A3 8B45 08 mov eax, dword ptr [ebp+8] ; EAX=参数1
' 004035A6 8B00 mov eax, dword ptr [eax] ; EAX=字节集首
' 004035A8 8B48 04 mov ecx, dword ptr [eax+4] ; ECX=字节集长
' 004035AB 83C0 08 add eax, 8 ; EAX=字节集指针
' 004035AE 8BF0 mov esi, eax ; EBX=字节集指针
' 004035B0 8B7D 14 mov edi, dword ptr [ebp+14] ; EDI=十六文本
' 004035B3 33C0 xor eax, eax ; EAX=0
' 004035B5 BB 10000000 mov ebx, 10 ; EBX=16除数
' 004035BA 90 nop
' 004035BB 85C9 test ecx, ecx ; 长度=0?
' 004035BD 74 23 je short 004035E2 ; 等于0 跳
' 004035BF 49 dec ecx ; 递减长度
' 004035C0 8A06 mov al, byte ptr [esi] ; 取1字节
' 004035C2 33D2 xor edx, edx ; EDX=0 余
' 004035C4 F7F3 div ebx ; 除以16
' 004035C6 83F8 0A cmp eax, 0A ; 商>10
' 004035C9 72 03 jb short 004035CE ; 小于 跳
' 004035CB 83C0 07 add eax, 7 ; 英文 + 55
' 004035CE 0007 add byte ptr [edi], al ; 英文 + 48
' 004035D0 47 inc edi ; 递增文本
' 004035D1 83FA 0A cmp edx, 0A ; 余>10
' 004035D4 72 03 jb short 004035D9 ; 小于 跳
' 004035D6 83C2 07 add edx, 7 ; 英文 + 55
' 004035D9 0017 add byte ptr [edi], dl ; 英文 + 48
' 004035DB 47 inc edi ; 递增文本
' 004035DC 037D 10 add edi, dword ptr [ebp+10] ; 跳过分隔符
' 004035DF 46 inc esi ; 递增字节集
' 004035E0 ^ EB D9 jmp short 004035BB ; 继续循环
' 004035E2 90 nop
' 004035E3 397D 14 cmp dword ptr [ebp+14], edi ; 处理过数据
' 004035E6 74 01 je short 004035E9 ; 未处 跳
' 00401019 2B7D 10 sub edi, dword ptr [ebp+10] ; 递减文本
' 004035E9 880F mov byte ptr [edi], cl ; 截断字符
' 004035EB 5F pop edi ; 恢复EDI
' 004035EC 5E pop esi ; 恢复ESI
' 004035ED 5B pop ebx ; 恢复EBX
' 004035EE 5A pop edx ; 恢复EDX
' 004035EF 59 pop ecx ; 恢复ECX
' 83 7D 10 00 74 17 FF 4D 10 8B 45 0C 85 C0 74 0D 8B 00 80 38 00 74 06 FF 45 10 40 EB F5 90 51 52 53 56
' 57 8B 45 08 8B 00 8B 48 04 83 C0 08 8B F0 8B 7D 14 33 C0 BB 10 00 00 00 90 85 C9 74 23 49 8A 06
' 33 D2 F7 F3 83 F8 0A 72 03 83 C0 07 00 07 47 83 FA 0A 72 03 83 C2 07 00 17 47 03 7D 10 46 EB D9
' 90 39 7D 14 74 01 2B 7D 10 88 0F 5F 5E 5B 5A 59
置入代码 ({ 131, 125, 16, 0, 116, 23, 255, 77, 16, 139, 69, 12, 133, 192, 116, 13, 139, 0, 128, 56, 0, 116, 6, 255, 69, 16, 64, 235, 245, 144, 81, 82, 83, 86, 87, 139, 69, 8, 139, 0, 139, 72, 4, 131, 192, 8, 139, 240, 139, 125, 20, 51, 192, 187, 16, 0, 0, 0, 144, 133, 201, 116, 35, 73, 138, 6, 51, 210, 247, 243, 131, 248, 10, 114, 3, 131, 192, 7, 0, 7, 71, 131, 250, 10, 114, 3, 131, 194, 7, 0, 23, 71, 3, 125, 16, 70, 235, 217, 144, 57, 125, 20, 116, 1, 43, 125, 16, 136, 15, 95, 94, 91, 90, 89 })
.如果真结束
返回 (十六进制)