汇编语言-编写一个加密与解密0~9位字序的程序

作者&投稿:栋食 (若有异议请与网页底部的电邮联系)
编写一个加密与解密0~9位字序列程序,设0123456789对应9082746315,键盘输入任意4位能马上输出4位对应密码~

参考63、数钱数到手抽筋,睡觉睡到自然醒!    

; 本程序通过编译,运行正确
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:\masmory00.txt',0 ;未加密的文本文件
File_Name2 db 'c:\masmory01.txt',0 ;加密后的文本文件
File_Name3 db 'c:\masmory02.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 ;编译到此结束

; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
Output_Chr endp
; -------------------------------------
; 功能:输出回车换行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
; -------------------------------------
Input_Code proc Near ;键盘输入指定位数的明码或密码并保存在数据缓冲区
mov cx,Code_Len
lea di,Buffer ;数据缓冲区地址
@@In_Code: mov ah,1
int 21h
cmp al,'0'
jb @@In_Code
cmp al,'9'
ja @@In_Code
stosb ;保存字符
loop @@In_Code
ret
Input_Code Endp
; -------------------------------------
Code_Len equ 4 ;明码、密码串长度
Table db '9082746315'
prompt_One db 'Please input the plain code(4 digitals): $' ;输入明码提示信息
Resaut_One db CR,LF,'The Encoded: $' ;显示密码提示信息
prompt_Two db CR,LF,CR,LF,'Please input the Encoded(4 digitals): $' ;输入密码提示信息
Resaut_Two db CR,LF,'The plain code: $' ;显示明码提示信息
Press_Key db CR,LF,CR,LF,'Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
cld
; -------------------------------------
; 加密:输入明码,输出密码
Output prompt_One ;提示输入明码
call Input_Code
Output Resaut_One ;提示显示密码
lea bx,Table ;密码表地址
lea si,Buffer ;数据缓冲区地址
mov cx,Code_Len
@@Encoding: lodsb ;取出一个数字
and al,0fh
xlat
mov dl,al
call Output_Chr ;显示输出一个字符
loop @@Encoding
; -------------------------------------
; 解密:输入密码,输出明码
Output prompt_Two ;提示输入密码
call Input_Code
Output Resaut_Two ;提示显示明码
lea si,Buffer ;数据缓冲区地址
mov cx,Code_Len
@@Decoding: lodsb ;取出一个数字
push cx
lea di,Table ;密码表地址
mov cx,10
repnz scasb ;扫描字符
mov dx,di
sub dx,offset Table+1
or dl,30h
call Output_Chr ;显示输出一个字符
pop cx
loop @@Decoding
; -------------------------------------
Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Buffer: ;数据缓冲区
Code ENDS
END Start ;编译到此结束

路过,看不明白。。
帮不上忙


如何用c语言编写一个程序?
include<stdio.h> int main(){ int i,m=0;for(i=2;i<=100;i+=2) m=m+i;printf("%d\\n",m);return 0;} 或 include int main(){ int i,sum=0;for(i=1;i<=50;i++){ sum=sum+2*i;} printf("2+4+6+…+98+100=%d\\n",sum);return 0;} ...

如何使用C语言编写一个文件夹加密器
C语言可以直接加密文件本身。2.加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。例如对称算法亦或加密。3.什么是异或算法 异或的特点是原始值经过两次异或某一个数后会变成原来的值,所以有时利用这个特性来进行加密...

C语言,编写一个程序 用户输入运算符和四则运算符,输出计算结果_百度...
include<stdio.h> int main(){ int a=1,b,c;char op;while(a||b){ printf("请输入一个算式(二数都为0时结束):");scanf("%d%c%d",&a,&op,&b);if(a==0&&b==0)break;if(op=='+')c=a+b;if(op=='-')c=a-b;if(op=='*')c=a*b;if(op=='\/')c=a\/b;if(op=...

用C语言编写一个程序,求a+(b的绝对值)的和.
include<stdio.h> int main(){ int a,b,fb;scanf("%d%d",&a,&b);fb = abs(b);printf("a+|b| = %d\\n", a+fb);return 0;}

C语言编写一个程序求出1+2+3……1000
include<stdio.h>int main(){ int i, sum = 0; for(i = 1; i <= 1000; i++) { sum += i; } printf("结果为:%d", sum); return 0;}书写的时候注意一些规范,包括语句的对齐,一些特定位置的空格使用,初学编程,养成良好的编码习惯很重要 ...

求用vhdl语言编写一个可实现加减乘除、可移位的16位运算器
elsif clk = '1' and clk'event then if sl = '0' then -- adder if cnt \/= "100110011001" then if cnt(3 downto 0) = "1001" then cnt(3 downto 0) <= (others => '0'); -- units cnt(7 downto 4) <= cnt(7 downto 4) + '1'; -- tens else cnt(3 downto...

请用程序设计语言编写一个计算1~1000之间所有偶数和的程序?
1~1000之间所有偶数的和的程序代码如下:include <stdio.h> void main(){ int i,sum;for(i=2,sum=0;i<1001;i=i++)if(i%2==0){sum=sum+i;} printf("1~1000之间所有偶数的和:");printf("sum=%d",sum);} for循环语句由循环判定条件和循环体组成,它是C语言中使用最为灵活的循环...

...用C语言在DEV(4.9.9.2)编译器上编写了一个加密程序,编译出现问题...
1、将encode,decode函数前面的char改成int;可以不必预先申明。2、#include <ctype.h>,toupper()函数在里面。另外,这个函数只处理一个字符,你的意思恐怕是处理整个字符串s,应该使用循环:3、功能上没有什么大的区别。dev是免费的,开源的,执行C标准比较严。Turbo C不支持中文,DEV支持。4、经过...

用C++语言编写一个“学生成绩管理系统”。
采纳率:0% 帮助的人:5.9万 我也去答题访问个人页 关注 展开全部 用java写过很多次了。 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 1条折叠回答 其他类似问题 2008-12-17 用C++语言编写一个简单的“学生成绩管理系统” 9 2007-06-29 用C++编写学生成绩管理系统 17 2011-05-11 ...

如何用c语言编写一个程序,实现按从大到小的顺序排序输出10个数
用选择排序法编写c语言,实现从键盘上输入10个数,按从大到小的顺序排序输出。代码如下:include<stdio.h> int main(){ int i,j,a[10],t;printf("输入数");for (i = 0; i < 10; i++)scanf("%d",&a[i]);for (i = 0; i < 10; i++){ for (j = i + 1; j < 10;j...

筠连县13246866711: 数据加密及解密的程序 (汇编语言) -
郁顺干复: IO MACRO X,YPUSH AXLEA DX,XMOV AH,YINT 21HPOP AXENDM STACKS SEGMENTDB 512 DUP(0) STACKS ENDS DATAS SEGMENT COUNT = 8 MLAB DB 'liuchengzyxwvtsrqpomkjfdba' ;密码表 JLAB DB '...

筠连县13246866711: 汇编语言写个凯撒密码加密和解密的! -
郁顺干复: 著名的凯撒加密算法就是一种简单的替代加密法,它是将明文中每一个字符用右移3位并以26个字符为模的替代(A由D替代,B由E替代,··…—,W由Z替代,X由A替代,Y由B替代,Z由C替代).所以你的汇编很简单呀,按1的时候,你用一个寄存器指向明文,然后对寄存器指向的数据做加3,然后mod26的处理,解密是按2的时候,你用一个寄存器指向密文,然后然后对寄存器指向的数据做减3,然后mod26的处理.

筠连县13246866711: 汇编语言设计 对数据进行加密 -
郁顺干复: DATA SEGMENT TABLE DB 39H,30H,38H,32H,37H,34H,36H,33H,31H,35H;密码表 RESULT DB 4 DUP(?);四位十进制数对应的密码 DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE MAIN PROC FAR MOV AX,DATA ...

筠连县13246866711: 用汇编语言编写程序:从键盘输入5个数(0~9),找其中最大值并显示!急求!!谢谢!!! -
郁顺干复: ;程序硬性规定了输入要1 2 8 6 1 这样输入, 即每输入1数字就要空一格assume cs:code, ds:data data segment STR db 0AH,0DH,"Please input five number(0~9): $" BUF db 20 db ? db 20 dup (?) MAX db ? CRLF db 0AH,0DH,'$' ...

筠连县13246866711: 什么是汇编语言
郁顺干复: 汇编语言(Assembly Language)是面向机器的程序设计语言. 汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码.这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言.于是...

筠连县13246866711: 用汇编语言编写程序.完成0~9的BCD数累加,并储存在内存RAM的60H单元中.
郁顺干复: 1.使用什么BCD码?(以下程序以8421码为例) 2.存在内存的60H单元中?而不是当前数据段的60H偏移地址处?(以下程序以当前数据段为例) 没有注释,有问题找书,看不懂就问. D SEGMENT TABLE DB 0,1,2,3,4,5,6,7,8,9 D ENDS ...

筠连县13246866711: 51单片机怎么用汇编语言让8个数码管不停的 显示0 - 9(最好要接74HC595) 加分 -
郁顺干复: 我用的是汇编:org startstart: mov p2,#0xfe mov r3,#0x00 mov dptr,#display mov a,#0x00 loop: movc a,@a+dptr...

筠连县13246866711: 求帮忙编一段 汇编语言,基于51单片机的密码锁,要求在下面.真心求帮忙啊 -
郁顺干复: ;根据题目要求,本设计操作如下: ; ;1.初始状态数码管全显示0,然后按键盘输入4个数字,输入完成后按键盘的 ;“F”键,将输入的4为密码与原始密码1234比较,如果正确相同则P0.0口接的继电器 ;工作灯亮.如果错误不相同,则恢复初始状态全显示0. ;2.输入过程中,led会逐位'-',直到密码输入完成 ;3.密码正确以后,led显示open ;4.若要重新输入密码,按单片机复位键或者按键盘的“D”键即可重新输入原理图和代码详见附件. 原理图用proteus绘制,并仿真成功. 代码用汇编编写,keil u4下编译成功. 有问题请追问.

筠连县13246866711: 急求用汇编语言编写一个键盘锁的程序 -
郁顺干复: 调用user32.dll中的BlockInput函数.该函数可锁鼠标键盘.BlockInput只有一个参数,1为锁定,0为解锁 在masn32中引入user32库,然后直接用【 invoke BlockInput 1 】就行了. .386 .model flat,stdcall option casemap:none include \masm32\...

筠连县13246866711: 什么是汇编语言 -
郁顺干复: ■什么是汇编语言 汇编语言(Assembly Language)是面向机器的程序设计语言. 在汇编语合中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址妈.这样用符号代替机器语盲的二进制码,就把机器语音变成...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网