SM4加密解密/字节集到十六进制

易语言 2020-03-07 16:57:35

SM4加密解密/字节集到十六进制

.子程序 进制_十六进制到字节集_ASM, 字节集, , 返回把指定16进制文本数据还原为字节集.每个字节由2个字符组成
.参数 十六进制文本, 文本型, , 例如 {FF,0A,DA} 或者 FF,0A,DA 或者 FF0ADA 等等
.参数 保留参数, 整数型, 可空, 此参数不需要使用.
.局部变量 字节集, 字节集

字节集 = 到字节集 (十六进制文本)
保留参数 = 取变量数据地址_ASM (字节集, #字节集型)
' 00401226 50 push eax ; 备份寄存器
' 00401227 51 push ecx
' 00401228 52 push edx
' 00401229 53 push ebx
' 0040122A 56 push esi
' 0040122B 57 push edi ; 备份寄存器
' 0040122C 33C0 xor eax, eax
' 0040122E 33C9 xor ecx, ecx
' 00401230 33D2 xor edx, edx
' 00401232 33DB xor ebx, ebx
' 00401234 8B75 08 mov esi, dword ptr [ebp+8] ; ESI=十六文本指针
' 00401237 8B7D 0C mov edi, dword ptr [ebp+C] ; EDI=字节集指针
' 0040123A 85F6 test esi, esi ; 空文本?
' 0040123C 74 04 je short 00401242 ; 空 跳
' 0040123E 8B36 mov esi, dword ptr [esi]
' 00401240 85F6 test esi, esi ; 空文本?
' 00401242 74 53 je short 00401297 ; 空 跳
' 00401244 90 nop
' 00401245 8A1E mov bl, byte ptr [esi] ; 读取1字符
' 00401247 46 inc esi ; 递增进制地址
' 00401248 80FB 30 cmp bl, 30
' 0040124B 72 3D jb short 0040128A ; 非法字 跳
' 0040124D 80FB 39 cmp bl, 39
' 00401250 77 05 ja short 00401257 ; 大于"9"跳
' 00401252 80EB 30 sub bl, 30 ; 0-9
' 00401255 EB 1D jmp short 00401274 ; 数字区 跳
' 00401257 80FB 41 cmp bl, 41
' 0040125A 72 2E jb short 0040128A ; 非法字 跳
' 0040125C 80FB 46 cmp bl, 46
' 0040125F 77 05 ja short 00401266 ; 大于"F"跳
' 00401261 80EB 37 sub bl, 37 ; A-F
' 00401264 EB 0E jmp short 00401274 ; 字母区 跳
' 00401266 80FB 61 cmp bl, 61
' 00401269 72 1F jb short 0040128A ; 非法字 跳
' 0040126B 80FB 66 cmp bl, 66 ; 非法字 跳
' 0040126E 77 1A ja short 0040128A ; a-f
' 00401270 80EB 57 sub bl, 57
' 00401273 90 nop
' 00401274 85C0 test eax, eax ; 有无高位? 正常进制处理
' 00401276 75 05 jnz short 0040127D ; 有高位跳
' 00401278 40 inc eax ; 置有高位
' 00401279 8BD3 mov edx, ebx ; 保存高位
' 0040127B ^ EB C8 jmp short 00401245 ; 继续循环
' 0040127D 48 dec eax ; 置无高位
' 0040127E 41 inc ecx ; 递增长度
' 0040127F C1E2 04 shl edx, 4 ; 左移高位
' 00401282 09DA or edx, ebx ; 合并字节
' 00401284 8817 mov byte ptr [edi], dl ; 保存字节
' 00401286 47 inc edi ; 递增写入
' 00401287 ^ EB BC jmp short 00401245 ; 继续循环
' 00401289 90 nop
' 0040128A 85C0 test eax, eax ; 有无未存? 非法字符处理
' 0040128C 74 05 je short 00401293 ; 无未存跳
' 0040128E 48 dec eax ; 置无未存
' 0040128F 41 inc ecx ; 递增长度
' 00401290 8817 mov byte ptr [edi], dl ; 保存字节
' 00401292 47 inc edi ; 递增写入
' 00401293 85DB test ebx, ebx ; 是否 {0}?
' 00401295 ^ 75 AE jnz short 00401245 ; 继续循环
' 00401297 894D 0C mov dword ptr [ebp+C], ecx ; 参数2=长度
' 0040129A 5F pop edi ; 恢复寄存器
' 0040129B 5E pop esi
' 0040129C 5B pop ebx
' 0040129D 5A pop edx
' 0040129E 59 pop ecx
' 0040129F 58 pop eax ; 恢复寄存器
' 50 51 52 53 56 57 33 C0 33 C9 33 D2 33 DB 8B 75 08 8B 7D 0C 85 F6 74 04 8B 36 85 F6 74 53 90 8A
' 1E 46 80 FB 30 72 3D 80 FB 39 77 05 80 EB 30 EB 1D 80 FB 41 72 2E 80 FB 46 77 05 80 EB 37 EB 0E
' 80 FB 61 72 1F 80 FB 66 77 1A 80 EB 57 90 85 C0 75 05 40 8B D3 EB C8 48 41 C1 E2 04 09 DA 88 17
' 47 EB BC 90 85 C0 74 05 48 41 88 17 47 85 DB 75 AE 89 4D 0C 5F 5E 5B 5A 59 58
置入代码 ({ 80, 81, 82, 83, 86, 87, 51, 192, 51, 201, 51, 210, 51, 219, 139, 117, 8, 139, 125, 12, 133, 246, 116, 4, 139, 54, 133, 246, 116, 83, 144, 138, 30, 70, 128, 251, 48, 114, 61, 128, 251, 57, 119, 5, 128, 235, 48, 235, 29, 128, 251, 65, 114, 46, 128, 251, 70, 119, 5, 128, 235, 55, 235, 14, 128, 251, 97, 114, 31, 128, 251, 102, 119, 26, 128, 235, 87, 144, 133, 192, 117, 5, 64, 139, 211, 235, 200, 72, 65, 193, 226, 4, 9, 218, 136, 23, 71, 235, 188, 144, 133, 192, 116, 5, 72, 65, 136, 23, 71, 133, 219, 117, 174, 137, 77, 12, 95, 94, 91, 90, 89, 88 })