A. 求一汇编语言所写简单数据加密程序(求急,加分)
去掉了那个中断部分。
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
Encode
db
'7846302951'
Prompt_Str1 db
'Please input the orical code: $'
Prompt_Str2 db
7,13,10,13,10,'The encode: $'
Prompt_Str3 db
13,10,13,10,'Please record the encode and than press any key to continue...$'
String
db
20,?,20 p(?) ;明码输入缓冲区
Start:
push cs
pop ds
push cs
pop es
Output Prompt_Str1 ;提示输入明码
cld
lea
di,String ;明码字符串地址
mov
cx,20 ;明码数字个数,可以不到20个数字,回车键结束明码输入
Read_Encode:mov
ah,1
int
21h
cmp
al,13 ;回车?
jz
Disp_Encode
cmp
al,'0'
jb
Read_Encode
cmp
al,'9'
ja
Read_Encode
stosb
loop Read_Encode
Disp_Encode:mov
cx,di
sub
cx,offset String ;实际输入的明码数字个数
lea
si,String ;明码字符串地址
lea
bx,Encode ;密码地址
Encoding: lodsb ;读入1位明码
and
al,0fh
xlat ;查表,取得对应的密码
mov
[si-1],al ;写密码
loop Encoding
mov
byte ptr [si],'$' ;显示字符串采用DOS调用,9号功能,要求字符串以“$”结尾
Output Prompt_Str2 ;提示显示密码
Output String ;显示密码
Output Prompt_Str3 ;提示用户记录密码
mov ah,1
int 21h
Exit_Proc: mov
ah,4ch ;结束程序
int
21h
Code
ENDS
END
Start ;编译到此结束
补充回答:未知楼主要怎样的原创,这个是我百分之百的原创。此前提供的连接,也是我百分之百的原创。不知楼主用什么方法来判断回答者的答案是否原创。
B. 在程序中如何将字符串常量进行加密
首先,要对这个常量字符串进行加密。
然后,加密用的密码(密钥)需要进行特殊处理。
比如:要保护字符串123456,用密钥13579进行加密。
密钥13579的16进制数组形式为:{0x31, 0x33, 0x35, 0x37, 0x39, 0x00}
你可以对这个数组进行数据干扰。比如:高位乱填数据(因为你知道是3),低位都加/减某数值:
变为了:{ 0xA3, 0xF5, 0x67, 0xD9, 0x3A, 0x00 }
你在代码中对每一位进行恢复:
*p &= 0x0F, *p |= 0x30, *p -= 0x02,如此得到你的原始密码:13579;
反汇编看到的你的密钥串为:0xA3, 0xF5, 0x67, 0xD9, 0x3A, 0x00。
不知道你思路的话,只能碰运气猜啦。
在上面两种干扰方法基础上,你甚至还可以把高低位调换,这样就又加了一层干扰信息。
别人想破解也得好好猜一会了。