前言
对四个字节的内容进行不可逆加密扩展为八个字节的密钥。
文章中可能会有错误,毕竟我没学过密码学,也没有找到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