⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jiami.asm

📁 文件加密程序 1. 对指定的文本文件进行加密(应判断其是否已经加密
💻 ASM
字号:
dseg    segment
        ; addition    db     ?
         mark        db     6 dup(1)
         buffer      db     150 dup(?)    ;没读一次文件时,都留出5个字节空位,与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        ;若已加密,结束操作
        
        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          ;将加密过的数据写入新文件
        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          ;将解密过的数据写入新文件
        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
;----------------------------------------------------------------------
;密码加密或解密
;入口参数:  di=要进行操作的缓冲区首地址
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
;-------------------------------------------------------------------------
;打开文件
;入口参数      bx指向存储文件号的内存单元
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
;-------------------------------------------------------------
;读文件
;入口参数      dx=缓冲区首地址     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
;----------------------------------------------------------------------
;加密解密操作
;入口参数:cx=加密的字节数  di=缓冲区首地址
do    proc 
        mov   bp,0 
lp1:    lea   si,psword
        add   si,2
        mov   ax,0
lp2:    mov   bl,[si]        ;内层循环,6次
        xor   [di],bl
        inc   si
        inc   di
        inc   ax
        inc   bp 
        cmp   bp,len       ;判断是否加密到最后一个字节
        jz    outlp1
        cmp   ax,6
        jnz   lp2
        loop  lp1
outlp1: ret
do    endp
;---------------------------------------------------------------------
;写文件
;入口参数    bx=文件号   dx=缓冲区首地址  cx=写入字节数  
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 + -