?? jiami.asm
字號:
dseg segment
; addition db ?
mark db 6 dup(1)
buffer db 150 dup(?) ;沒讀一次文件時,都留出5個字節(jié)空位,與addition合起來正好可以存放密碼
len dw 0 ;文件長度
filename db 20,?,20 dup(?)
psword db 7,?,7 dup (?)
handle1 dw ?
handle2 dw ?
enword db 8,8,8,8,8,8
msg db 'input filename',0dh,0ah,'$'
msgnewf db 'save as:',0dh,0ah,'$'
msgno db 'can not open the file',0dh,0ah,'$'
cerr db 'error', 0dh,0ah,'$'
msgmerr db 'move pointer error',0dh,0ah,'$'
msgin db 'encrypt,press 0;disencrypt press 1',0dh,0ah,'$'
msgwrong db 'poor choice',0dh,0ah,'$'
msgwrps db 'password wrong',0dh,0ah,'$'
msgbuilderr db 'can not build file',0dh,0ah,'$'
msgpw db 'input a password with 6 chars',0dh,0ah,'$'
msgenc db 'the file has been encrypted',0dh,0ah,'$'
msgexit db 'press any key to continue',0dh,0ah,'$'
werror db 'error while writing',0dh,0ah,'$'
dseg ends
cseg segment
assume cs:cseg,ds:dseg
start: mov ax,dseg
mov ds,ax
mov dx,offset msg ;提示輸入文件名
mov ah,9
int 21h
mov dx,seg filename
mov ds,dx
mov dx,offset filename ;輸入文件名
mov ah,0ah
int 21h
mov al,filename+1 ;將輸入字符串的最后一個回車字符改為0
mov ah,0
mov si,ax
mov filename[si+2],00h
mov bx,offset handle1 ;打開文件
call opfile
mov dx,offset buffer ;讀文件
mov bx,handle1
call rdfile
mov ah,42h ;將讀寫指針移動到文件開始
mov bx,handle1
mov cx,0ffffh
mov si,len
neg si
mov dx,si
mov al,2
int 21h
jnc chooce
mov dx,offset msgmerr ;移動指針出錯,輸出信息后退出
mov ah,9
int 21h
jmp done
chooce:
mov dx,offset msgin ;提示選擇操作類型
mov ah,9
int 21h
mov dl,0dh
mov ah,2
int 21h
mov ah,1 ;選擇
int 21h
mov bl,al
mov dl,0dh
mov ah,2
int 21h
cmp bl,30h ;判斷選擇是否正確
jb exit
jz encrypt
cmp bl,31h
ja exit
jmp disencrypt ;disencrypt
exit: ;選擇操作時錯誤
mov dx,offset msgwrong
mov ah,9
int 21h
jmp done
encrypt: ;加密
mov cx,6 ;判斷文件是否加密過
lea bx,buffer
again2:
cmp byte ptr [bx],1
jnz outlp
inc bx
loop again2
outlp: cmp cx,0
jz encrypted ;若已加密,結(jié)束操作
mov bx,handle1 ;將加密標志寫入原文件
mov dx,offset mark
mov cx,len
add cx,6
call wtfile
call inputpsword ;輸入密鑰
mov cx,len
lea di,buffer
call do ;加密操作
call infname ;建立新文件
call newf
mov di,offset psword
add di,2
call enpsword ;將密碼加密
mov bx,handle2 ;將加密過的密碼寫入文件頭
mov dx,offset psword
add dx,2
mov cx,6
call wtfile
mov bx,handle2 ;將加密過的數(shù)據(jù)寫入新文件
mov dx,offset buffer
mov cx,len
call wtfile
jmp done
encrypted:
mov dx,offset msgenc ;加密過,輸出信息
mov ah,9
int 21h
jmp done
disencrypt: ;解密
call inputpsword ;輸入密鑰
lea di,buffer ;將文件的密碼解密
call enpsword
mov si,offset buffer ;判斷密碼是否正確
mov di,offset psword
add di,2
mov cx,6
again4: mov al,[si]
cmp [di],al
jnz out4
inc si
inc di
loop again4
mov cx,len
sub cx,6
lea di,buffer
add di,6
call do ;解密操作
call infname ;建立新文件
call newf
mov bx,handle2 ;將解密過的數(shù)據(jù)寫入新文件
mov dx,offset buffer
add dx,6
mov cx,len
sub cx,6
call wtfile
jmp done
out4: mov dx,offset msgwrps
mov ah,9
int 21h
done:
mov dx,offset msgexit
mov ah,9
int 21h
mov ah,1
int 21h
mov ah,4ch
int 21h
;----------------------------------------------------------------------
;密碼加密或解密
;入口參數(shù): di=要進行操作的緩沖區(qū)首地址
enpsword proc
mov cx,6
lea si,enword
again3: mov al,[si]
xor [di],al
inc si
inc di
loop again3
ret
enpsword endp
;----------------------------------------------------------------------
;輸入文件名
infname proc
mov dx,offset msgnewf ;提示輸入文件名
mov ah,9
int 21h
mov dx,seg filename
mov ds,dx
mov dx,offset filename ;輸入文件名
mov ah,0ah
int 21h
mov al,filename+1 ;將輸入字符串的最后一個回車字符改為0
mov ah,0
mov si,ax
mov filename[si+2],00h
ret
infname endp
;-------------------------------------------------------------------------
;打開文件
;入口參數(shù) bx指向存儲文件號的內(nèi)存單元
opfile proc
mov ah,3Dh
mov dx,offset filename ;打開文件操作
add dx,2
mov al,2
int 21h
mov [bx],ax
jc m1
ret
m1: mov dx,offset msgno ;找不到文件時,輸出提示信息
mov ah,9
int 21h
jmp done
ret
opfile endp
;---------------------------------------------------------------------
;建立新文件
newf proc
lea dx,filename
add dx,2
mov cx,00
mov ah,3ch
int 21h
mov handle2,ax
jc builderr
ret
builderr:
mov dx,offset msgbuilderr
mov ah,9
int 21h
ret
newf endp
;-------------------------------------------------------------
;讀文件
;入口參數(shù) dx=緩沖區(qū)首地址 bx=文件號
rdfile proc
again1:
mov ah,3Fh
mov cx,1
int 21h
inc dx
add len,ax
cmp ax,0
jnz again1
ret
rdfile endp
;----------------------------------------------------------------------
;輸入密碼
inputpsword proc
mov dx,offset msgpw ;提示輸入密碼
mov ah,9
int 21h
mov dl,0dh
mov ah,2
int 21h
mov dx,offset psword ; 輸入密碼
mov ah,10
int 21h
ret
inputpsword endp
;----------------------------------------------------------------------
;加密解密操作
;入口參數(shù):cx=加密的字節(jié)數(shù) di=緩沖區(qū)首地址
do proc
mov bp,0
lp1: lea si,psword
add si,2
mov ax,0
lp2: mov bl,[si] ;內(nèi)層循環(huán),6次
xor [di],bl
inc si
inc di
inc ax
inc bp
cmp bp,len ;判斷是否加密到最后一個字節(jié)
jz outlp1
cmp ax,6
jnz lp2
loop lp1
outlp1: ret
do endp
;---------------------------------------------------------------------
;寫文件
;入口參數(shù) bx=文件號 dx=緩沖區(qū)首地址 cx=寫入字節(jié)數(shù)
wtfile proc
mov ah,40h
int 21h
jc wterr
ret
wterr: ;寫文件時出錯
mov dx,offset werror
mov ah,9
int 21h
ret
wtfile endp
cseg ends
end start
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -