机器码、序列号、认证码、注册码的生成算法(二)
设备动态密码设计
我们再把需求列出来:
(1)密码只能是阿拉伯数字,而且不能太长,一般要求10位以下,否则记不住,或让人感觉厌烦。
(2)密码包含用户信息,系统能知道是谁对设备进行了操作。
(3)密码是动态的,每次都不一样。
(4)密码能够防止恶意篡改。
说白了,就是密码里包含用户信息、时间信息,校验信息,但只能有8个阿拉伯数字。这是可以做到的,为什么?因为我最后做出来了。
好,我们先从8个阿拉伯数字出发,8个数字,最大就是99999999,如果用二进制来看,我们最多用26位(67108864)。
我们使用12位代表4096个不同的用户,基本满足需求。只剩下14位可用了。
时间信息需要保存年月日,如果使用一个字节保存一个数字(例如BCD码),共需要24位(3个字节),一下子就超了。把它们拆分,精确到位,最省的情况如下表所示:
信息 | 年 | 月 | 日 |
所需位 | 6 | 4 | 5 |
这样的话,我们省了很多,但仍然用掉了15位,超出了我们的限额。我们希望在时间信息上挤出空间来。
我们假设有这样一个函数f(y,m,d),它把时间信息转化成一个数,不同的日期对应不同的值,不会重复。考虑最简单的情况,我们把函数定义成如下形式:
f(y,m,d)=ay+bm+cd
那么,另外一个日期对应的值为:
f(y’,m’,d’)=ay’+bm’+cd’
只要在y!=y’,m!=m’,d!=d’的情况下,f(y,m,d)!=f(y’,m’,d’)即满足需求。
f(y,m,d)-f(y’,m’,d’)=(ay+bm+cd)-(ay’+bm’+cd’)
=a(y-y’)+b(m-m’)+c(d-d’)
由于年的变化是很缓慢的,我们考虑在一年内,都没有重复的值。也就是
b(m-m’)+c(d-d’)=bΔm+cΔd!=0
即bΔm!=-cΔd
我们知道,月的变化取值为1-12,日的变化取值为1-31,那么Δm的取值为-11~11,Δd的取值为-30~30。考虑到有负数的存在,上式我们直接可以写成:
b/c!=Δd/Δm
我们可以看出,只要b取31,上式两边就永远不会相等。也就是说,
f(y,m,d)=y+31m+d
在一年内也不会有重复的值。
这样的话,此式最大的值为31*12+31+99(考虑年用到2099)=502,我们用9位(512)即能表示。
经过上面的时间信息缩减之后,我们剩下5位来存放校验信息。常见的一些校验算法根本是无法使用的(MD5要16字节,而且计算复杂,CRC两个字节,最简单的算LRC也要一个字节8位)。如果单纯用5位做校验和,重复的概率是1/32,感觉不够安全。
我们已经没办法再缩减时间信息使用的位数,只能考虑对用户ID开刀。用户ID使用12位存放4096个用户的信息,这是我们考虑极限的用户数。在一开始,或许512个用户就能满足。于是,我们采取这样的折中方案:
(1)用户ID使用9位,把3位让给校验和,这样重复的概率是1/256,应该是可以使用的。
(2)当用户增长超过512时,我们增加数字位数。如果使用9位阿拉伯数字,我们可以存放29位的信息,多出3位,增加在用户ID上,一共可存放4096个用户。
上面的设计,还没有满足需求里的第3、5点。要让密码每次都不一样,其实我们只需要增加几位,放一个随机数就行。但偏偏我们已经没有空间去放这个随机数了。
在这里,我们需要先说明使用何种加密方法。为了足够的简单(保证仪器能快速计算),又不失安全性,我们使用异或的加密方法。只要用户猜不到跟明文异或的密码,数据就是安全的。
我们回到上面的问题。如果我们使用不同的密码去对明文进行异或,得到的结果就是不一样的。所以我们有一种这样的方案:存放N条用于异或的密码,每次用不同的密码去异或,就会产生不同的结果。解密的时候,我们寻回原先异或的密码,就能成功解密。
但是我们马上会发现问题:我们如何知道明文是使用了哪个密码去异或的呢?用户ID和时间信息都是固定的,我们无法从这些信息里面提取出一个索引。那我们可以使用当前时间作为一个索引。假如我们有24个密码,各对应24个小时。这样的话,我们在使用动态密码时,会多出一条限制:从平台上获取密码之后,必须在一个小时内使用。这样的限制并不影响,可行。
在我们使用多个密码去异或时,原来的校验和算法会出现问题。我们必须找出24个异或码,经过跟明文异或之后,不影响原文的校验和。这样的异或码可以使用以下方法得到:
(1)因为我们使用8位校验和,所以我们把数据分成8位一段,不够的使用0补齐。
(2)把(总位数-8)个位随机填充0或1。
(3)求出(总位数-8)个位的校验和。
(4)把这个校验和填充到剩下的8位里面。
最终方案
动态密码的设计如下:
8位阿拉伯数字 | |||
信息 | 时间 | 校验和 | 用户ID |
位数 | 9 | 8 | 9 |
9位阿拉伯数字 | |||
信息 | 时间 | 校验和 | 用户ID |
位数 | 9 | 8 | 12 |
时间=(年-2018)+31*月+日
校验和为8位一段异或。
加密方法是将整个明文跟密钥进行异或。
机器码、序列号、认证码、注册码的生成算法(二)相关推荐
- 怎么用python生成带二维码的照片_怎么制作二维码图片-Python 生成个性二维码
一.实验介绍1.1 实验内容 本课程通过调用MyQR接口来实现生成个人所需二维码,并可以设置二维码的大小.是否在现有图片的基础上生成.是否生成动态二维码. 1.2 知识点 Python3基础 MyQR ...
- 分享一款电脑使用的二维码/条码扫描生成软件--二维码识别精灵
功能: 从摄像头识别二维码.条码 从文件读取二维码.条码 识别屏幕中的二维码.条码 文本生成二维码,支持导出为图片 绿色软件,免安装,使用简单,没有病毒 体积小而效率高,运行速度快 摄像头毫秒级的识别 ...
- thinkphp用phpqrcode生成二维码(含中间带logo、临时二维码)或生成微信二维码海报的方法
前期准备: 1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/ 2.PHP环境必须开启支持GD2扩展库支持(一般情况下都 ...
- 网页前端知识汇总(三)——网页前端利用二维码插件qrcode生成在线二维码
最近几年二维码的广泛应用,方便了很多行业,如支付宝,微信,小程序扫码之类的,这个在二十年前,想都不敢想这么方便,那时候有书刊编码扫一扫都感觉是高科技了,如今,二维码的广泛应用,生活还是方便了不少!这个 ...
- 微信支付 生成付款二维码链接 并生成支付二维码图片 .net C#
//生成付款二维码链接 string pay_url = PayURL(order_id_parent.ToString(), _total_fee.ToString( ...
- 【彩色二维码】处理生成彩色二维码图片
调用草料二维码的API接口 https://cli.im/api/qrcode/code?text=***&mhid=*** mhid:草料二维码的模版样式id,这里选择的是[vUbEWVm7 ...
- vue批量生成二维码,打印生成的二维码,并批量下载生成的二维码,qrcode
通过使用 qrcode 生成二维码, 使用 jszip 打包批量二维码文件, 使用 file-saver 下载打包好的zip文件, 使用 vue-print-nb 打印生成的二维码 生成二维码: 打印 ...
- 公众号文章链接怎么做二维码?在线生成链接二维码的方法
公众号是现在品牌运营时必备的一个渠道,通过不断地发表公众号推文来提高自己的品牌力,那么如果想要将一篇公众号文章生成二维码(二维码在线制作-二维码生成器-音视频二维码制作工具-机制熊二维码)后分享给他人 ...
- jquery.qrcode生成带logo的二维码,同时生成带二维码的好友分享图片(js与canvas实现二维码和图片合成的海报)
首先给大家看一下效果图(纯jQuery前端技术): 提供一下demo 源代码和jquery.qrcode文件下载: https://download.csdn.net/download/qq15577 ...
最新文章
- OVS使用笔记(四十三)
- 软件工程的实践项目课程的自我目标
- 《Adobe Photoshop CS6中文版经典教程(彩色版)》—第2课2.4节在Camera Raw中调整颜色...
- JSFinder—从js文件中寻找敏感接口和子域名
- leetcode214. 最短回文串
- 统计单词个数(codevs 1040)
- 解决 Electron 5.0 版本出现 require is not defined 的问题
- 腾讯云服务器购买与备案
- Linux实用命令杂集
- c语言 如何筛选小数点,怎样在表格里筛选有出整数与有小数点的数值
- 今天你吃粽子了吗?快进来看看你都吃过哪一种粽子吧
- 【Appium】最新版appium-inspector的安装
- 企业托管主机的时候需要考虑哪些影响因素?
- linux系统发育树的构建步骤,megacc构建进化树.mao文件生成方法
- 关于专利书写以及申报的一点心得体会
- 微软CRM系统二次开发步骤以及注意事项
- 低成本复制 ChatGPT 训练流程,仅需 1.68GB GPU 即可使用,方法现已开源!
- 步步高家教机 H8S H9A 破解纯净原生系统 线刷包
- php x7f,这个正则中的x7f-xff是什么意思
- VMware + Ubantu18.04 搭建Hadoop集群环境