stc的单片机怎么用id号来加密

stc的单片机怎么用id号来加密,第1张

STC读内部ID号工具组(自解压文件:103K), 原文件是一个自解压文件,这里改为RAR,只有5K,也帮你贴到这里来了。(注意:该工具组好像只能使用在有物理串口的单片机使用。例如STC15F系列因串口需IO模拟,应该是运行后无效的)

解开后有一个EXE文件和一个HEX文件。将HEX文件 ISP写入单片机,运行ShowID.exe, 设置好串口号,波特率随便设,例如9600,按【读取信息】键即可读取ID等信息。

(该工具组主要是方便检验唯一ID的,实际应用请看官方数据表里有C语言的范例。图中为一块STC12C5A08S2为例,请看其显示的结果与使用编程读取以上15位数据通过串口发送,用最新的程序匠人的“串口猎人”V26接收显示是一样的!:) )

不同的芯片的ID都是唯一的,上图是两个不同批次的STC12C5410AD的ID。该ID使用7位字符,可以描述的总数为: 256^7=72,057,594,037,927,936个(天文数字)!应该不会重复了吧。。呵呵。。。

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

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 编译到此结束


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

原文地址: https://outofmemory.cn/yw/11357276.html

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

发表评论

登录后才能评论

评论列表(0条)

保存