📄 encrypt.asm
字号:
data SEGMENT
cps DB 255 DUP(0) ;正确的密码
psf DB 0 ;密码标志位
cpslen DB ? ;c ps len
fname LABEL BYTE ;file name
fmaxlen DB 254
flen DB ?
pathstr DB 254 DUP(' ')
hinfo DB 255 DUP (?) ;head info
hf DB 0 ;head info flag
endf DB 0 ;exit flag
fhandle DW ? ;file handle
password LABEL BYTE
pwmaxlen DB 254
pslen DB ?
psstr DB 254 DUP (?)
rcount DW ? ;read count
buf DB 255 DUP(0) ;buffer
bufend DB '$'
endl DB 0dh,0ah,'$'
error DB 'error',0dh,0ah,'$'
intr DB '******************************************************************************',0dh,0ah
DB ' File encryption/decryption System 2000 CS 3 Wufan 00204083 ' ,0dh,0ah
DB '******************************************************************************',0dh,0ah,'$'
inputps DB 'Please input password:$'
message1 DB 'The file is encrypted! Need password!$'
message2 DB 'The file content is ......',0dh,0ah,'$'
message3 DB 'Would you want to encrypt the file?(y/n) $'
openfailed DB 'open failed',0dh,0ah,'$'
readfailed DB 'read failed',0dh,0ah,'$'
succes DB 'The file is encrypted successfully!$'
message4 DB 'please input the filename:$'
data ENDS
code SEGMENT
start PROC FAR
ASSUME CS:code,DS:data
MOV AX,data
MOV DS,AX
MOV ES,AX
LEA DX,intr
CALL outstr
LEA DX,message4
CALL outstr
CALL fnamein
CMP endf,0
JNZ exit
CALL fopen
CMP endf,0
JNZ exit
CALL hinfor
CMP hf,1
JE s1
LEA DX,message2
CALL outstr
CALL display
LEA DX,endl
CALL outstr
LEA DX,message3
CALL outstr
MOV AH,01
INT 21h
CMP AL,121
JNE exit
MOV AH,09h
LEA DX,endl
INT 21h
CALL encrypting
JMP exit
s1:
LEA DX,message1
CALL outstr
LEA DX,endl
CALL outstr
CALL encrypted
exit:
MOV AX,4c00h
INT 21h
start ENDP
encrypting PROC NEAR
MOV AH,42h
MOV AL,00
MOV BX,fhandle
XOR CX,CX
XOR DX,DX
INT 21h
JC e3
CALL psin
CMP endf,0
JNZ e3
CALL mkhinfo
e1:
CALL fread
CMP endf,0
JNZ e2
CALL encrypt
CALL bufw
JMP e1
e2:
CALL hinfow
LEA DX,succes
CALL outstr
e3:
RET
encrypting ENDP
display PROC NEAR ;display the file content
MOV AH,42h
MOV AL,00
MOV BX,fhandle
XOR CX,CX
XOR DX,DX
INT 21h
JC d1
d2:
CALL fread
CMP endf,0
JNZ d1
CALL printbuf
JMP d2
d1:
MOV endf,0
RET
display ENDP
encrypted PROC NEAR
MOV CX,3
ec1:
CALL psin
CMP endf,0
JNZ ec2
MOV SI,0
XOR BL,BL
MOV BL,cpslen
CMP BL,pslen
JNE ec2
ec3:
MOV AL,psstr[SI]
CMP AL,cps[SI]
JNZ ec2
INC SI
CMP SI,BX
JNZ ec3
MOV psf,1
JMP ec4
ec2:
LOOP ec1
ec4:
CMP psf,1
JNE ec7
MOV AH,42h
MOV AL,00
MOV BX,fhandle
XOR CX,CX
XOR DX,DX
INT 21h
JC ec6
ec5:
CALL fread
CMP endf,0
JNZ ec6
MOV SI,254
MOV AL,buf[SI]
CMP AL,255
JE ec5
CALL encrypt
CALL printbuf
JMP ec5
ec7:
CALL display
ec6:
RET
encrypted ENDP
printbuf PROC NEAR ;print buffer
LEA DX,buf
CALL outstr
RET
printbuf ENDP
fnamein PROC NEAR ;input filename
MOV AH,0ah
LEA DX,fname
INT 21h
LEA DX,endl
CALL outstr
CMP flen,0
JNE fni1
LEA DX,error
CALL outstr
MOV endf,01h
RET
fni1:
XOR AX,AX
MOV AL,flen
MOV DI,AX
MOV pathstr[DI],AH
RET
fnamein ENDP
psin PROC NEAR ;input password
LEA DX,inputps
CALL outstr
MOV AH,0aH
LEA DX,password
INT 21h
LEA DX,endl
CALL outstr
CMP pslen,0
JE ps1
RET
ps1:
LEA DX,error
CALL outstr
MOV endf,01h
RET
psin ENDP
fopen PROC NEAR ;open file
MOV AH,3dh
MOV AL,02h
LEA DX,pathstr
INT 21h
JC f1
MOV fhandle,AX
RET
f1:
MOV endf,01h
LEA DX,openfailed
CALL outstr
RET
fopen ENDP
bufw PROC NEAR
MOV BX,fhandle
MOV CX,0
MOV DX,0
SUB DX,rcount
CMP DX,0
JGE bw2
NOT CX
bw2:
MOV AL,1
MOV AH,42h
INT 21h
JC bw1
LEA DX,buf
MOV AH,40h
MOV CX,255
INT 21h
JC bw1
CMP AX,255
JNE bw1
RET
bw1:
LEA DX,error
CALL outstr
MOV endf,01h
RET
bufw ENDP
fread PROC NEAR ;file read
MOV AH,3fh
MOV BX,fhandle
MOV CX,255
LEA DX,buf
INT 21h
JC fr1
CMP AX,0
JE fr3
MOV rcount,AX
CMP rcount,255
JE fr4
MOV SI,rcount
MOV buf[SI],36
fr4:
RET
fr1:
LEA DX,readfailed
CALL outstr
JMP fr3
fr3:
MOV endf,01h
RET
fread ENDP
mkhinfo PROC NEAR ;make head info
XOR AX,AX
MOV AL,flen
MOV DI,AX
DEC DI
MOV AL,pathstr[DI]
MOV SI,0h
MOV hinfo[SI],AL
MOV CL,pslen
mh1:
MOV AL,psstr[SI]
XOR hinfo[SI],AL
MOV AL,hinfo[SI]
INC SI
MOV hinfo[SI],AL
LOOP mh1
MOV AL,255
MOV SI,254
MOV hinfo[SI],AL
DEC SI
MOV AL,pslen
XOR AL,255
MOV hinfo[SI],AL
RET
mkhinfo ENDP
hinfor PROC NEAR ;read head info
MOV AH,42h
MOV AL,2
MOV BX,fhandle
XOR CX,CX
MOV DX,-2
NOT CX
INT 21h
LEA DX,cps
MOV AH,3fh
MOV CX,2
INT 21h
JC hr2
CMP AX,2
JNE hr2
MOV SI,1
MOV AL,cps[SI]
CMP AL,255
JNE hr2
MOV hf,1
DEC SI
MOV CL,cps[SI]
XOR AL,CL
MOV cpslen,AL
XOR CX,CX
NOT CX
MOV DX,-255
MOV AH,42h
MOV AL,2
INT 21h
JC hr1
LEA DX,cps
MOV AH,3fh
MOV CX,255
INT 21h
JC hr2
CMP AX,255
JNE hr2
XOR CX,CX
MOV CL,cpslen
DEC CL
MOV SI,CX
MOV DI,CX
DEC DI
hr3:
MOV AL,cps[DI]
XOR cps[SI],AL
DEC DI
DEC SI
LOOP hr3
XOR CL,CL
MOV CL,flen
MOV DI,CX
DEC DI
MOV AL,pathstr[DI]
MOV SI,0
XOR cps[SI],AL
RET
hr2:
MOV hf,0
RET
hr1:
MOV endf,1
LEA DX,error
CALL outstr
RET
hinfor ENDP
outstr PROC NEAR ;output string
MOV AH,09h
INT 21h
RET
outstr ENDP
encrypt PROC NEAR ;encrypt the buffer
MOV CX,255
XOR BX,BX
MOV BL,pslen
MOV SI,0h
MOV DI,0h
ecd1:
CMP DI,BX
JNE ecd2
MOV DI,0h
ecd2:
MOV AL,psstr[DI]
XOR buf[SI],AL
INC DI
INC SI
LOOP ecd1
RET
encrypt ENDP
hinfow PROC NEAR ;write the head info
MOV AH,42h
MOV AL,2
MOV BX,fhandle
MOV CX,0
MOV DX,0
INT 21h
JC hw1
LEA DX,hinfo
MOV AH,40h
MOV CX,255
INT 21h
JC hw1
CMP AX,255
JNE hw1
RET
hw1:
LEA DX,error
MOV endf,1
CALL outstr
RET
hinfow ENDP
code ENDS
END start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -