51单片机汇编 对四字节数据进行不可逆加密(运算?)为八字节数据


前言

对四个字节的内容进行不可逆加密扩展为八个字节的密钥。
文章中可能会有错误,毕竟我没学过密码学,也没有找到51单片机加密短密码的相关资料,完全是凭着俺寻思之力写的,欢迎大家批评指正。

一、一切的开始

最近想做一个密码锁,网上查阅资料发现大家的密码都是明文存储,直接比较,感觉安全性不高(在有办法从单片机中读取烧录的程序时),所以写了一个这样的单向加密(或者说运算)函数。
为什么把四字节变为八字节?因为能力不够,只能这样来尽量避免不同的数据得到同样的密钥(碰撞)。

二、使用场景?

对密码等数据转换为密钥,当要确定输入的密码时,只需要对输入的密码进行运算,然后比较密钥。
假设:有两个密码锁的密码一致,当一个密码锁被拆解,拆解者只会得到八字节的密钥,在一定时间内可以保证另外一个密码锁不被恶意打开(得到算法和结果可以穷举,算出密码只是时间问题)。

三、代码

;将要计算的四个字节数存入30h-33h,key会放到38h到3fh
GET_KEY:
	;当要加密的字节有规律时,打乱规律
	CLR C
	MOV A,30H
	RRC A
	RRC A
	ORL A,#45	;可以切换来达到更换算法
	MOV 34H,A
	MOV A,31H
	RLC A
	ORL A,#21	;可以切换来达到更换算法
	CPL A
	MOV 35H,A
	MOV A,32H	
	RLC A
	RLC A
	RLC A
	ORL A,#81	;可以切换来达到更换算法
	MOV 36H,A
	MOV A,33H	
	RRC A
	RRC A
	ANL A,#81	;可以切换来达到更换算法
	CPL A
	MOV 37H,A
	;开始运算key
	MOV 30H,34H
	MOV 31H,35H
	MOV 32H,36H
	ACALL F
	MOV 38H,A
	MOV 32H,36H
	ACALL G
	MOV 39H,A
	MOV 30H,35H
	MOV 31H,36H
	MOV 32H,37H
	ACALL F
	MOV 3AH,A
	MOV 32H,37H
	ACALL G
	MOV 3BH,A
	MOV 30H,36H
	MOV 31H,37H
	MOV 32H,34H
	ACALL F
	MOV 3CH,A
	MOV 32H,34H
	ACALL G
	MOV 3DH,A
	MOV 30H,37H
	MOV 31H,34H
	MOV 32H,35H
	ACALL F
	MOV 3EH,A
	MOV 32H,35H
	ACALL G
	MOV 3FH,A
	;清除原始数据
	MOV 30H,#0H
	MOV 31H,#0H
	MOV 32H,#0H
	MOV 33H,#0H
	MOV 34H,#0H
	MOV 35H,#0H
	MOV 36H,#0H
	MOV 37H,#0H
	RET

;A = (30H & 31H) | (~30H & 32H)
F:
	MOV A,30H
	CPL A
	ANL 32H,A
	MOV A,30H
	ANL A,31H
	ORL A,32H
	RET
	
;A = (30H & 32H) | (31H & (~32H))
G:
	MOV A,32H
	CPL A
	ANL 31H,A
	MOV A,32H
	ANL A,30H
	ORL A,31H
	RET

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值