64位汇编语言之RSA加密算法(64位汇编语言之RSA加密算法)
RSA算法广泛地应用在计算机行业:应用软件使用数字签名防止软件被篡改那怕只修改一个bit也会被检测到
软件有没有被病毒感染查看数字证书倒是一个好方法
windows驱动程序必须要数字签名才能正常运行,商业软件VMP(VMProtect)使用RSA算法来保护软件的有效使用权限
VMP 保护软件不被逆向跟踪,使付费软件开发者把更多精力放在产品功能上。
VMP保护的代码分析起来让人抓狂,整个代码会被压缩存放,运行时现场解压,正常的API调用会被隐藏,正常的IF ELSE 分支给你用虚拟代码膨胀到几十万行代码.......本人也是研究它RSA加密运算的简便方法时在虚拟代码中迷失了。。。。。.扯得有点远。以下代码参考了它的方法。
option casemap:none
OPTION DOTNAME
include rsa_64.inc
.code
ASCII2HEX proc uses rbx rsi rdi pret_buffer:qword,size_ret_buffer:qword,pascii_buffer:qword,size_ascii_buffer:qword
mov rbx,size_ascii_buffer
.if rbx { rsa_n_length*2
mov rax,-1
ret
.endif
mov rbx,size_ret_buffer
.if rbx { rsa_n_length
mov rax,-1
ret
.endif
mov rcx,size_ascii_buffer
mov rsi,pascii_buffer
mov rdx,size_ret_buffer
mov rdi,pret_buffer
.while sqword ptr rcx } 0 && sqword ptr rdx } 0
and rax,0
and rbx,0
mov al, byte ptr [rsi]
.if al }= "0" && al {= "9"
sub al,"0"
.elseif al }= "A" && al {= "F"
sub al,"0"
sub al,7
.elseif al }= "a" && al {= "f"
sub al,"0"
sub al,27h
.elseif al == 0
; invoke MessageBox,0,addr compcheck1,0,MB_OK
; mov rax,-1
; ret
.else
mov rax,-1
ret
.endif
dec rcx
inc rsi
mov bl, byte ptr [rsi]
.if bl }= "0" && bl {= "9"
sub bl,"0"
.elseif bl }= "A" && bl {= "F"
sub bl,"0"
sub bl,7
.elseif bl }= "a" && bl {= "f"
sub bl,"0"
sub bl,27h
.elseif bl == 0
.else
mov rax,-1
ret
.endif
shl al,4
or al,bl
cld
stosb
dec rcx
dec rdx
inc rsi
.endw
ret
ASCII2HEX endp
HEX2ASCII proc uses rbx rsi rdi pret_buffer:qword,size_ret_buffer:qword,phex_buffer:qword,size_hex_buffer:qword ;16进制转ascii
mov rsi,phex_buffer
mov rdi,pret_buffer
mov rbx,0
mov rdx,0
mov rax,0
mov rcx,size_hex_buffer
.if rcx { rsa_n_length
mov rax,-1
ret
.endif
mov rcx,size_ret_buffer
.if rcx { rsa_n_length
mov rax,-1
ret
.endif
mov rcx,size_hex_buffer
mov rdx,size_ret_buffer
.while sqword ptr rcx } 0 && sqword ptr rdx } 0
mov al,[rsi]
shr al,4
.if al }=0 && al {= 9
add al,30h
.elseif al }=0ah && al {= 0fh
add al,37h
.else
mov rax,-1
; int 3
; ret
.endif
cld
stosb
mov al,[rsi]
and al,0fh
.if al }=0 && al {= 9
add al,30h
.elseif al }=0ah && al {= 0fh
add al,37h
.else
mov rax,-1
; int 3
; ret
.endif
cld
stosb
inc rsi
dec rcx
dec rdx
dec rdx
.endw
;mov dword ptr [rdi],0
ret
HEX2ASCII endp
rsa_calmod proc uses rbx rsi rdi r11 r12 r13 r14 r15 prsa_n_buffer_and_value:qword,_prsacalbuffer_for_mid:qword,count:qword
LOCAL @addflags_craay:qword
mov r12,prsa_n_buffer_and_value
lea r12,[r12 rsa_n_length_8*63]
lea r12,[r12 rsa_n_length_8-8]
mov rbx,rsa_n_length_8*64
.while rbx {} 0
mov rdi,r12
mov rsi,_prsacalbuffer_for_mid
add rsi,rsa_n_length_8-8
mov ecx,rsa_n_length_8/8
std
repz cmpsq
.if ~(CARRY?) && ~ZERO? ;大于就减
mov r15,0
mov @addflags_craay,0
mov rdi,_prsacalbuffer_for_mid
mov rsi,r12
sub rsi,rsa_n_length;定位到头部
.while r15 {} rsa_n_length_8
shr @addflags_craay,1
mov rax,[rsi r15]
sbb [rdi r15],rax
setc byte ptr @addflags_craay ;把进位保存
add r15,8
.endw
.endif
sub rbx,rsa_n_length_8
sub r12,rsa_n_length_8 ;指向上一个中间数据的尾部的8字节
.endw
.if count } 8
nop
mov rsi,_prsacalbuffer_for_mid
lea rsi,[rsi rsa_n_length_8-8-8]
mov rdi,_prsacalbuffer_for_mid
lea rdi,[rdi rsa_n_length_8-8]
mov rcx,rsa_n_length/8 ;少移动8字节,小心内存泄漏
std
rep movsq
mov rsi,_prsacalbuffer_for_mid
mov qword ptr [rsi],0;相当于左移64位 最低位补0
; invoke rsa_calmod,prsa_n_buffer_and_value,_prsacalbuffer_for_mid,0
mov r12,prsa_n_buffer_and_value
lea r12,[r12 rsa_n_length_8*63]
lea r12,[r12 rsa_n_length_8-8]
mov rbx,rsa_n_length_8*64
.while rbx {} 0
mov rdi,r12
mov rsi,_prsacalbuffer_for_mid
add rsi,rsa_n_length_8-8
mov ecx,rsa_n_length_8/8
std
repz cmpsq
.if ~(CARRY?) && ~ZERO? ;大于就减
mov r15,0
mov @addflags_craay,0
mov rdi,_prsacalbuffer_for_mid
mov rsi,r12
sub rsi,rsa_n_length;定位到头部
.while r15 {} rsa_n_length_8
shr @addflags_craay,1
mov rax,[rsi r15]
sbb [rdi r15],rax
setc byte ptr @addflags_craay ;把进位保存
add r15,8
.endw
.endif
sub rbx,rsa_n_length_8
sub r12,rsa_n_length_8 ;指向上一个中间数据的尾部的8字节
.endw
.endif
ret
rsa_calmod endp
rsamul_to_mod proc uses rbx rsi rdi r11 r12 r13 r14 r15 preturn_rsa:qword, pmingma:qword,pmingma1:qword,_prsa_n_buffer_and_value:qword ; pmingma*pmingma1 mod prsa_n_buffer_and_value
LOCAL @addflags_craay:qword ;每次相加产生的进位
LOCAL @flags_c_mod:qword
LOCAL @count:qword
mov rax,0
mov rdi,prsacalbuffer_for_mid
mov rcx,(rsa_n_length_8 )/8
cld
rep stosq
mov rcx,(rsa_n_length_8 )/8
mov rsi,pmingma
mov rdi,pmidvalue ;被乘数的中间值
cld
rep movsq
mov rsi,pmidvalue
mov ebx,63 ;64位系统,单次就可以处理64位长度的数据:我们把pmingma值的总共左移63次的结果全部保存下来,用来加快求余的过程
.while ebx {}0
mov ecx,rsa_n_length_8 ;字节长度 ;每次加密的数据长度是80h字节,我们在内存中按88h字节处理,移位后的进位项需要占用一些内存,最多占用64位
mov @flags_c_mod,0
.while ecx {} 0 ;80h个数据整体左移一位的结果,*2
cld
shr @flags_c_mod,1
lodsq; mov rax,qword ptr [rsi]
rcl rax,1
setc byte ptr @flags_c_mod
stosq; mov qword ptr [rdi],rax
sub rcx,8
.endw
dec ebx
.endw
mov rsi,pmingma1
lea rsi,[rsi rsa_n_length_8 ];定位到最高位
sub rsi,8 ;减去8字节 开始获取最高位的8字节数据
sub rdi,8
mov r12,rdi ;pmidvalue 最高位
mov r13,prsacalbuffer_for_mid
mov r14,_prsa_n_buffer_and_value
mov ebx,rsa_n_length_8
.while ebx {} 0
std ;从高位向低位获取
lodsq
mov r11,rax
mov r14,64
.while r14{}0
shl r11,1 ;从最高位开始测试
.if CARRY?
mov r15,0
mov @addflags_craay,0
sub r12,rsa_n_length;定位到头部 会影响cf标志
.while r15 {} rsa_n_length_8
shr @addflags_craay,1
mov rax,[r12 r15]
adc [r13 r15],rax
setc byte ptr @addflags_craay ;把进位保存
add r15,8
.endw
add r12,rsa_n_length;重新定位到尾部
.endif
sub r12,rsa_n_length_8 ;指向上一个中间数据的尾部的8字节
dec r14
.endw
invoke rsa_calmod,_prsa_n_buffer_and_value,prsacalbuffer_for_mid,rbx
sub ebx,8
mov r12,rdi
.endw
mov rsi,prsacalbuffer_for_mid
mov rdi,preturn_rsa
mov rcx,rsa_n_length/8
cld
rep movsq
ret
rsamul_to_mod endp
rsaenc proc uses rsi rdi rbx r11 r12 r13 r14 r15 preturn_rsa:qword,prsa_n_value:qword,prsa_e_value:qword,pmingma:qword
;加密
LOCAL @flags_c_mod:qword
.if preturn_rsa == 0
mov rax,-1
ret
.endif
.if prsa_n_value == 0
mov rax,-1
ret
.endif
.if prsa_e_value == 0
mov rax,-1
ret
.endif
.if pmingma == 0
mov rax,-1
ret
.endif
mov rax,0
mov rcx,(rsa_n_length_8 )*65/8
mov rdi,prsa_n_buffer_for_value
cld
rep stosq ;缓冲清0
mov rax,0
mov rcx,(rsa_n_length_8 )*65/8
mov rdi,pmidvalue
cld
rep stosq
mov rax,0
mov rcx,(rsa_n_length_8 )/8
lea rdi,@mingma
cld
rep stosq
mov rax,0
mov rcx,(rsa_n_length_8 )/8
lea rdi,@mingma1
cld
rep stosq
mov rsi,pmingma
lea rdi, @mingma
mov ecx,rsa_n_length/8
cld
rep movsq
mov rsi,prsa_n_value
mov rdi,prsa_n_buffer_for_value ;
mov ecx,rsa_n_length/8
cld
rep movsq
add rdi,8
mov rsi,prsa_n_buffer_for_value
mov ebx,63 ;64位系统,单次就可以处理64位长度的数据:我们把n值的总共左移63次的结果全部保存下来,用来加快求余的过程
;;64个80h 8字节的缓冲区,存放x*2^1 到x*2^63 的数据 (2x 4x 8x 16x 32x 64x 128x 256x ....)
.while ebx {}0
mov ecx,rsa_n_length_8 ;字节长度 ;每次加密的数据长度是80h字节,我们在内存中按88h字节处理,移位后的进位项需要占用一些内存,最多占用64位
mov edx,0
mov @flags_c_mod,0
.while ecx {} 0 ;80h个数据整体左移一位的结果,*2
cld
shr @flags_c_mod,1
lodsq; mov rax,qword ptr [rsi]
rcl rax,1
setc byte ptr @flags_c_mod
cld
stosq; mov qword ptr [rdi],rax
sub rcx,8
.endw
dec ebx
.endw
and @flags_c_mod,0
or qword ptr @mingma1,1 ;第一次是1
mov rsi,prsa_e_value
lea rsi,[rsi rsa_n_length];定位到最高位
sub rsi,8 ;减去8字节 开始获取最高位的8字节数据
mov ebx,rsa_n_length
.while ebx {} 0
std ;从高位向低位获取
lodsq
mov r12,rax
mov r13,64 ;每次处理64位数据
.while sqword ptr r13 }0
shl r12,1;从最高位开始测试
setc byte ptr @flags_c_mod ;保存最高位的值
invoke rsamul_to_mod,preturn_rsa,addr @mingma1,addr @mingma1,prsa_n_buffer_for_value
push rsi
mov rsi, preturn_rsa
lea rdi, @mingma1
mov ecx,rsa_n_length/8
cld
rep movsq
pop rsi
shr dword ptr @flags_c_mod,1 ;
.if CARRY? ;最高位的值如果为真
invoke rsamul_to_mod,preturn_rsa,addr @mingma,addr @mingma1,prsa_n_buffer_for_value
push rsi
mov rsi, preturn_rsa
lea rdi, @mingma1
mov ecx,rsa_n_length/8
cld
rep movsq
pop rsi
.endif
dec r13
.endw
sub ebx,8
.endw
;invoke rsa_calmod,prsa_n_buffer_for_value,preturn_rsa,0
ret
rsaenc endp
WinMain proc uses rbx rsi rdi r11 r12 r13 r14 r15 hInst:qword,hPrevInst:qword,CmdLine:qword,CmdShow:qword
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL @hInst:qword
LOCAL @hPrevInst:qword
LOCAL @CmdLine:qword
LOCAL @CmdShow:qword
LOCAL icex:INITCOMMONCONTROLSEX
invoke GetModuleHandle,0
mov hInstance,rax
invoke GetCommandLine
mov CommandLine,rax
invoke RtlZeroMemory,addr wc,sizeof wc
invoke InitCommonControls
mov icex.dwSize,sizeof INITCOMMONCONTROLSEX
mov icex.dwICC,ICC_TAB_CLASSES
invoke InitCommonControlsEx,addr icex
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
lea rax,WndProc
mov wc.lpfnWndProc,rax;offset WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,DLGWINDOWEXTRA
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE 1
mov wc.lpszMenuName,IDM_MENU;0
lea rax,ClassName
mov wc.lpszClassName,rax;offset ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,rax
mov wc.hIconSm,rax
invoke LoadCursor,0,IDC_ARROW
mov wc.hCursor,rax
invoke RegisterClassEx,addr wc
invoke CreateDialogParam,hInstance,IDD_DIALOG,NULL,addr WndProc,NULL
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
.while TRUE
invoke GetMessage,addr msg,0,0,0
.if rax == 0
.break
.endif
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
.endw
invoke ExitProcess,0
mov rax,msg.wParam
ret
WinMain endp
WndProc proc uses rbx rsi rdi r11 r12 r13 r14 r15 hWin:HWND,uMsg:UINT64,wParam:WPARAM,lParam:LPARAM
LOCAL @heap:qword
mov rax,uMsg
.if eax==WM_INITDIALOG
push hWin
pop hWnd
; invoke GetProcessHeap
; mov @heap,rax
; invoke HeapAlloc, @heap, HEAP_ZERO_MEMORY,rsa_n_length_8*68
lea rax,midvalue
mov pmidvalue, rax
; invoke HeapAlloc, @heap, HEAP_ZERO_MEMORY,rsa_n_length_8*68
lea rax,rsa_n_buffer_for_value
mov prsa_n_buffer_for_value,rax
; invoke HeapAlloc, @heap, HEAP_ZERO_MEMORY,rsa_n_length_8*8
lea rax,rsacalbuffer_for_mid
mov prsacalbuffer_for_mid,rax ;相乘的结果
invoke SetDlgItemText,hWin,1001,addr rsa_n_ascii
invoke SetDlgItemText,hWin,1002,addr rsa_e_ascii
invoke SetDlgItemText,hWin,1003,addr rsa_d_ascii
.elseif eax==WM_COMMAND
mov rax,wParam
and rax,0FFFFh
.if rax==IDM_FILE_EXIT
invoke SendMessage,hWin,WM_CLOSE,0,0
.elseif rax==IDM_HELP_ABOUT
invoke ShellAbout,hWin,addr AppName,addr AboutMsg,NULL
.elseif rax==1007;服务端用e 值加密
; int 3
invoke RtlZeroMemory,addr buffer_buffer,sizeof buffer_buffer
invoke GetDlgItemText,hWin,1001,addr buffer_buffer,sizeof buffer_buffer
.if rax { rsa_n_length*2
mov rbx,rsa_n_length*2
sub rbx,rax
invoke RtlZeroMemory,addr buffer_buffer,sizeof buffer_buffer
lea rsi,buffer_buffer
add rsi,rbx
invoke GetDlgItemText,hWin,1001,rsi,sizeof buffer_buffer
invoke MessageBox,hWin,addr error_tips3,addr error_tips3,MB_OK
.endif
invoke ASCII2HEX,addr n_value_buffer,sizeof n_value_buffer,addr buffer_buffer,sizeof buffer_buffer
;内存中的数据需要低位在前高位在后
mov rcx,rsa_n_length
mov rbx,rsa_n_length/2
lea rsi,n_value_buffer
mov rax,0
.while rbx } 0
mov dl,[rsi rax]
xchg [rsi rcx-1],dl
xchg [rsi rax],dl
inc rax
dec rcx
dec rbx
.endw
;内存中的数据需要低位在前高位在后
invoke RtlZeroMemory,addr buffer_buffer,sizeof buffer_buffer
invoke GetDlgItemText,hWin,1002,addr buffer_buffer,sizeof buffer_buffer
.if rax { rsa_n_length*2
mov rbx,rsa_n_length*2
sub rbx,rax
invoke RtlZeroMemory,addr buffer_buffer,sizeof buffer_buffer
lea rsi,buffer_buffer
add rsi,rbx
invoke GetDlgItemText,hWin,1002,rsi,sizeof buffer_buffer
invoke MessageBox,hWin,addr error_tips4,addr error_tips4,MB_OK
.endif
; int 3
invoke ASCII2HEX,addr e_value_buffer,sizeof e_value_buffer,addr buffer_buffer,sizeof buffer_buffer
mov rcx,rsa_n_length
mov rbx,rsa_n_length/2
lea rsi,e_value_buffer
mov rax,0
.while rbx } 0
mov dl,[rsi rax]
xchg [rsi rcx-1],dl
xchg [rsi rax],dl
inc rax
dec rcx
dec rbx
.endw
; int 3
invoke RtlZeroMemory,addr buffer_buffer,sizeof buffer_buffer
invoke GetDlgItemText,hWin,1005,addr buffer_buffer,sizeof buffer_buffer
invoke RtlZeroMemory,addr mingma_buffer,sizeof mingma_buffer
invoke ASCII2HEX,addr mingma_buffer,sizeof mingma_buffer,addr buffer_buffer,sizeof buffer_buffer
lea rax,mingma_buffer
invoke RtlZeroMemory,addr buffer_buffer,sizeof buffer_buffer
; lea rax,ffff
; lea rbx,gggg
; lea rcx,hhhh
; lea rdx,iiii
invoke rsaenc,addr buffer_buffer,addr n_value_buffer,addr e_value_buffer,addr mingma_buffer
; invoke HEX2ASCII,addr mingma_buffer,80h*2,addr buffer_buffer,80h
lea rsi,buffer_buffer
; int 3
; lea rsi,[rsi sizeof buffer_buffer]
; mov qword ptr [rsi-8],0
invoke SetDlgItemText,hWin,1004,addr buffer_buffer;addr error_tips;buffer_buffer;mingma_buffer;buffer_buffer
invoke SetDlgItemText,hWin,1013,addr buffer_buffer;addr error_tips;buffer_buffer;mingma_buffer;buffer_buffer
.elseif rax==1006;客户端用d 值加密3DH
; int 3
invoke RtlZeroMemory,addr buffer_buffer,sizeof buffer_buffer
invoke GetDlgItemText,hWin,1001,addr buffer_buffer,sizeof buffer_buffer
.if rax { rsa_n_length*2
mov rbx,rsa_n_length*2
sub rbx,rax
invoke RtlZeroMemory,addr buffer_buffer,sizeof buffer_buffer
lea rsi,buffer_buffer
add rsi,rbx
invoke GetDlgItemText,hWin,1001,rsi,sizeof buffer_buffer
invoke MessageBox,hWin,addr error_tips1,addr error_tips1,MB_OK
.endif
invoke ASCII2HEX,addr n_value_buffer,sizeof n_value_buffer,addr buffer_buffer,sizeof buffer_buffer
;内存中的数据需要低位在前高位在后
mov rcx,rsa_n_length
mov rbx,rsa_n_length/2
lea rsi,n_value_buffer
mov rax,0
.while rbx } 0
mov dl,[rsi rax]
xchg [rsi rcx-1],dl
xchg [rsi rax],dl
inc rax
dec rcx
dec rbx
.endw
; int 3
invoke RtlZeroMemory,addr buffer_buffer,sizeof buffer_buffer
invoke GetDlgItemText,hWin,1003,addr buffer_buffer,sizeof buffer_buffer
.if rax { rsa_n_length*2
mov rbx,rsa_n_length*2
sub rbx,rax
invoke RtlZeroMemory,addr buffer_buffer,sizeof buffer_buffer
lea rsi,buffer_buffer
add rsi,rbx
invoke GetDlgItemText,hWin,1003,rsi,sizeof buffer_buffer
;invoke MessageBox,hWin,addr error_tips2,addr error_tips2,MB_OK
.endif
invoke ASCII2HEX,addr d_value_buffer,sizeof d_value_buffer,addr buffer_buffer,sizeof buffer_buffer
mov rcx,rsa_n_length
mov rbx,rsa_n_length/2
lea rsi,d_value_buffer
mov rax,0
.while rbx } 0
mov dl,[rsi rax]
xchg [rsi rcx-1],dl
xchg [rsi rax],dl
inc rax
dec rcx
dec rbx
.endw
invoke RtlZeroMemory,addr mingma_buffer,sizeof mingma_buffer
invoke GetDlgItemText,hWin,1004,addr mingma_buffer,sizeof mingma_buffer-1
.if rax } rsa_n_length
.endif
invoke RtlZeroMemory,addr buffer_buffer,sizeof buffer_buffer
; int 3
invoke rsaenc,addr buffer_buffer,addr n_value_buffer,addr d_value_buffer,addr mingma_buffer
invoke HEX2ASCII,addr mingma_buffer,sizeof mingma_buffer,addr buffer_buffer,sizeof buffer_buffer
invoke SetDlgItemText,hWin,1005,addr mingma_buffer
.endif
; .elseif eax==WM_SIZE
.elseif eax==WM_CLOSE
invoke DestroyWindow,hWin
.elseif uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
.endif
xor rax,rax
ret
WndProc endp
end
include win64.inc
include ksamd64.inc
include Macros\x64macros.inc
include Macros\x64calling.inc
include Macros\vasily.inc
include user32.inc
include kernel32.inc
include shell32.inc
include comctl32.inc
include comdlg32.inc
includelib user32.lib
includelib kernel32.lib
includelib shell32.lib
includelib comctl32.lib
includelib comdlg32.lib
WinMain PROTO :QWORD,:QWORD,:QWORD,:QWORD
WndProc PROTO :QWORD,:QWORD,:QWORD,:QWORD
IDD_DIALOG equ 1000
IDM_MENU equ 10000
IDM_FILE_EXIT equ 10001
IDM_HELP_ABOUT equ 10101
rsa_n_length equ 80h ;128字节
rsa_n_length_8 equ 88h
.const
ClassName db 'DLGCLASS',0
AppName db 'Dialog as main',0
AboutMsg db 'MASM64 RadASM Dialog as main',13,10,'Copyright ? masm64 2001',0
;;;;16进制ascii码 高位在前低位在后
align 8
rsa_n_ascii db "DBD088F58896B30ABC25F9405856F910FD4265D8BAC9A8009B550DADBD5F812C0CF8DF40C9"
db "F4F279A8777302BBB5A56F75576CD6955CA4AA83B344ED99773DF6B2BEDB5DE2E5230B2BF4"
db "E24F63E828FE828FDFDAF4B464E02B9B2462D5643C87EA12233E39025DA6B68A37AC460B0A8DFEEA053361F1095D19B98ABCC8822F29",0
align 8
rsa_e_ascii db "541A56BCB3150DCDF6AD04CFF4BCDA3100E58DB83DC7784B3B2370C75FE491B4BC05E0CD9637ED2A5525D6D05DE7A333A10EE12ABD1"
db "D2437C58A2ABE49F090B904A458D09F75517A6C7EFF92C5597AECAD2D394D98D2196EB1E1922DB9230308E8277754EE221A9DB55C87"
db "EADB9805B0B2CA2ACBC3BE88CEB3ADF80C4034F5BD",0
align 8
rsa_d_ascii db "10001",0,0,0,0,0
;rsa_d_ascii db "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
db "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011",0
dq 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dq 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dq 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dq 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
error_tips1 db "11长度不在范围内",0
error_tips2 db "22长度不在范围内",0
error_tips3 db "33长度不在范围内",0
error_tips4 db "44长度不在范围内",0
.data?
hInstance dq ?
CommandLine dq ?
hWnd dq ?
pmidvalue dq ?
prsa_n_buffer_for_value dq ?
prsacalbuffer_for_mid dq ? ;RSA 相乘时用到的中间值,功能类似于prsa_n_buffer_for_value
buffer_buffer dw rsa_n_length_8 dup (?);[88h]:word
aaaa db rsa_n_length_8 dup (?)
n_value_buffer db rsa_n_length_8 dup (?); [88h]:byte
bbbb db rsa_n_length_8 dup (?)
d_value_buffer db rsa_n_length_8 dup (?);[88h]:byte
cccc db rsa_n_length_8 dup (?)
e_value_buffer db rsa_n_length_8 dup (?);[88h]:byte
dddd db rsa_n_length_8 dup (?)
mingma_buffer dw rsa_n_length_8 dup (?);[88h]:word
eeee db rsa_n_length_8 dup (?)
midvalue db rsa_n_length_8*68 dup (?)
ffff db rsa_n_length_8 dup (?)
rsa_n_buffer_for_value db rsa_n_length_8*68 dup (?)
gggg db rsa_n_length_8 dup (?)
rsacalbuffer_for_mid db rsa_n_length_8*8 dup (?)
hhhh db rsa_n_length_8 dup (?)
@mingma db rsa_n_length_8 dup (?)
iiii db rsa_n_length_8 dup (?)
@mingma1 db rsa_n_length_8 dup (?)
jjjj db rsa_n_length_8 dup (?)
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com