用汇编语言编写 简易加密解密程序

用汇编语言编写 简易加密解密程序,第1张

本程序通过编译,运行正确

Code Segment

Assume CS:Code,DS:Code

-----------------------------------------

功能:显示指定地址(Str_Addr)的字符

入口:

Str_Addr=字符串地址(要求在数据段)

用法: Output Str_Addr

用法举例:Output PromptStr

Output MACRO Str_Addr

push dx

lea dx,Str_Addr

mov ah,9

int 21h

pop dx

EndM

-----------------------------------------

功能:打开指定路径下的文件。若打开成功,保存文件代号,设置进位标志;

否则,建立文件,保存文件代号,清进位标志

入口参数:dx=文件名地址,bx=文件代号保存地址

Open_File Proc Near

mov ax,3d02h 以读写方式打开文件

int 21h

jc @@Error

mov [bx],ax 成功打开,保存文件代号

stc 设置进位标志

ret

@@Error: Output Open_Error

xor cx,cx 新建文件属性

Create_File:mov ah,3ch 建立文件

int 21h

jc Create_File 建立不成功,尝试再建

mov [bx],ax 成功建立,保存文件代号

clc 清进位标志

ret

Open_File EndP

-----------------------------------------

功能:对字符串缓冲区中的内容逐个字符加密

入口参数:si=字符串地址,cx=字符数

Encode_Str Proc Near

push si

push cx

lea di,Handle_File

mov al,[di][88] 读取密钥

@@Encoding: xor byte ptr [si],al 异或,第一步加密

push cx

mov cx,188

rol byte ptr [si],cl 循环左移188位,第二步加密

pop cx

inc si 下一个字符地址

loop @@Encoding 处理下一个字符

pop cx

pop si

ret

Encode_Str EndP

-----------------------------------------

功能:对字符串缓冲区中的内容逐个字符加密

入口参数:si=字符串地址,cx=字符数

Uncode_Str Proc Near

push si

push cx

lea di,Handle_File

mov al,[di][88] 读取密钥

@@Uncoding: push cx

mov cx,188

ror byte ptr [si],cl 循环右移188位,第一步解密

pop cx

xor byte ptr [si],al 异或,第二步解密

inc si 下一个字符地址

loop @@Uncoding 处理下一个字符

pop cx

pop si

ret

Uncode_Str EndP

-----------------------------------------

Handle_File dw ?,?,? 文件代号

File_Name1 db 'c:\masm\rory00.txt',0 未加密的文本文件

File_Name2 db 'c:\masm\rory01.txt',0 加密后的文本文件

File_Name3 db 'c:\masm\rory02.txt',0 解密后的文本文件

Open_Error db 'Open file error,creat a new file.',13,10,13,10,7,'$'

Input_New db 'Input the new information:',13,10,'$'

Press_Key db 13,10,13,10,'The Encode and Uncode have been completed.',7

db 13,10,13,10,'Press any key to exit...$'

Start: push cs

pop ds

push cs

pop es 使数据段、附加段与代码段同段

-----------------------------------------

打开或建立三个文件

lea dx,Buffer 文本内容处理缓冲区

mov cx,0ffc0h 预留32个字的堆栈空间

sub cx,dx 设置读写一次文件内容的字节数

mov bp,cx 暂存

lea dx,File_Name2 文件名地址

lea bx,Handle_File[2] 文件代号保存地址

call Open_File 打开指定路径下的文件。若打开成功,保存文件代号;否则,建立文件,保存文件代号

lea dx,File_Name3 文件名地址

lea bx,Handle_File[4] 文件代号保存地址

call Open_File

lea ax,@@jump000

push ax

call @@Locate_01

@@Locate_00:lea dx,File_Name1 文件名地址

lea bx,Handle_File 文件代号保存地址

call Open_File

jc Read_File

-----------------------------------------

若是新建文件,输入文件内容,实施加密,写到另一个文件

Input_Str: Output Input_New 提示输入新信息

lea dx,Buffer 文本内容处理缓冲区

mov ah,0ah 键盘输入字符串

int 21h

lea si,Buffer[1] 实际输入的字符个数地址

lodsb 读取实际输入的字符数

test al,0ffh

jz Input_Str 若直接回车,未输入任何字符,再次提示输入新信息

mov dx,si 数据缓冲区地址

mov cl,al 实际输入的字符数

xor ch,ch

mov bx,Handle_File 读取未加密的文本文件代号

Write_Uncod:mov ah,40h

int 21h

jc Write_Uncod 写入失败,尝试再写

call Encode_Str 逐个字符加密

mov dx,si 数据缓冲区地址,要写入的字符数已在cx中

mov bx,Handle_File[2] 文件代号

Write_Coded:mov ah,40h

int 21h

jc Write_Coded 写入失败,尝试再写

jmp @@Uncode

@@Locate_01:pop ax

ret

-----------------------------------------

若成功打开文件,读取文件内容,实施加密,写到另一个文件

Read_File: lea dx,Buffer 文本内容处理缓冲区

mov cx,bp

mov bx,Handle_File 读取未加密的文本文件代号

mov ah,3fh 读文件内容

int 21h

jc Read_File 读文件失败,尝试再读

test ax,0ffffh

jz @@Uncode 若实际读取的字节数为0,结束读写 *** 作

lea si,Buffer

mov cx,ax

call Encode_Str 逐个字符加密

mov dx,si 数据缓冲区地址,要写入的字符数已在cx中

mov bx,Handle_File[2] 读取目标文件代号

Write_File: mov ah,40h 写文件

int 21h

jc Write_File 写文件失败,尝试再写

jmp Read_File

-----------------------------------------

修改子程序Encode_Str和Encode_Str中的循环移位次数

@@jump000: mov byte ptr Encode_Str[13],6

mov byte ptr Uncode_Str[11],6

lea ax,@@Locate_00

push ax

call @@Locate_01

-----------------------------------------

将加密完的内容解密,写入第三个文本文件

@@Uncode: xor dx,dx

xor cx,cx

Loca_Seek1: mov bx,Handle_File[4] 读取解密后的文本文件代号

mov ax,4200h 移动文件指针至文件头

int 21h

jc Loca_Seek1

Loca_Seek2: mov bx,Handle_File[2] 读取加密后的文本文件代号

mov ax,4200h 移动文件指针至文件头

int 21h

jc Loca_Seek2

lea dx,Buffer 文本内容处理缓冲区

Read_File1: mov cx,bp

mov bx,Handle_File[2] 读取加密后的文本文件代号

mov ah,3fh 读文件内容

int 21h

jc Read_File1 读文件失败,尝试再读

test ax,0ffffh

jz Close_File1 若实际读取的字节数为0,结束读写 *** 作,关闭文件

lea si,Buffer

mov cx,ax

call Uncode_Str 逐个字符解密

mov dx,si 数据缓冲区地址,要写入的字符数已在cx中

mov bx,Handle_File[4] 读取解密后的文本文件代号

Write_File1:mov ah,40h 写文件

int 21h

jc Write_File1 写文件失败,尝试再写

jmp Read_File1

Close_File1:mov bx,Handle_File 读取未加密的文本文件代号

mov ah,3eh 关闭文件

int 21h

jc Close_File1

Close_File2:mov bx,Handle_File[2] 读取加密后的文本文件代号

mov ah,3eh 关闭文件

int 21h

jc Close_File2

Close_File3:mov bx,Handle_File[4] 读取解密后的文本文件代号

mov ah,3eh 关闭文件

int 21h

jc Close_File3

Output Press_Key 提示 *** 作完成,按任意键结束程序

mov ah,1

int 21h

Exit_Proc: mov ah,4ch 结束程序

int 21h

ALIGN 10h 节对齐

Buffer db 255 文本内容处理缓冲区

Code ENDS

END Start 编译到此结束

1、p macro buf

lea dx,buf

mov ah,9

int 21h

endm

定义一个宏,名称为p,以后在程序中出现p的地方时,就相当于将中间的三行插入到了那里,这个宏调用了DOS中断,9号,输出DS:DX指向的内存中的一段字符串,以$为结束符,所以

p pp

p qq

等即表示输出pp qq中的字符串

2、mov ah,0

mov al,3

int 10h

mov ah,0bh

mov bh,0

mov bl,3

int 10h

这是BIOS中断,对CRT即显示器进行初始化(功能号AH=0)和设置屏幕彩色背景(AH=0B),具体入口参数你查一下就知道了

3、mov dx,0405h

mov ah,15

int 10h

mov ah,2

inc dl

int 10h

是15号和2号BIOS中断调用,取当前屏幕状态和设置光标位置到第四行第6列(DX=行 列)

4、mov bl,[si]

mov cx,1

mov ah,9

int 10h

inc si

jnz lp

输出qw的字符串

5、 lea dx,bufa

mov ah,10

int 21h

利用DOS中断从键盘输入一段字符串,存到DS:DX的内存区域,其中第二个字节存放实际输入的字符数,具体格式自查

6、lea si,bufa+1

mov ch,0

mov cl,[si]

lea di,bufb

n: mov bx,offset bufa

mov al,0

xlat bufa

mov [di],al

inc di

loop n

mov byte ptr [di],'$'

是将刚才输入的字符串拷贝到bufb缓冲区中,并在结尾加$结束符

7、p info2

p bufb

p info1

输出info2、bufb\info1中的字符串

8、下面的程序与上面的思路和功能相同,结果是要求用户输入4段不超过20个字符的字符串(以回车结束),并将这些字符串原样输出


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7911057.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-11
下一篇2023-04-11

发表评论

登录后才能评论

评论列表(0条)

    保存