作者 | 主题 |
---|---|
壶琰棠 侠士 经验值:1042 发帖数:47 精华帖:1 |
楼主 2020-11-03 12:12:52
主题:PLC程序加密的一种方法(密钥授权管理程序) 引文: 前段时间有客户跟我说,他们客户到期没有打款,所以想在PLC中开发一套授权管理程序,这样可以根据实际情况,给予客户不同的授权;
探讨: PLC怎么实现程序授权管理! 对于国内工程师而言,类似问题曾经或者未来可能碰到,也许公司在开发程序阶段没有考虑该问题,所以很多时候都是在现场做一个类似的定时程序,比如时间到某年某月,输出一个信号停止设备的运行,或者等等类似的方法; 也有工程师曾经见过国外公司一言不合就拔钥匙走人,然后设备根本开不起来,更别说运行。
其实,收到这种命题作文一样的任务,首先想到的肯定是一个最简单的方法:类似定时处理,在程序中编写定时程序,到某个日期然后断开设备的运行; 但这可能存在几个问题(一)程序不是太复杂,客户稍微倒腾一下可能就破解了(二)程序倒腾的太复杂了的话,基于保密原则(总不能告诉客户怎么解锁),解锁的时候还得跑到客户现场(三)国内公司文档工作一般都太差,太复杂了自己公司员工因为流动性会造成自己员工的困惑,说不定后续工程师会自己重新编写一套程序;
所以基于以上考虑,我在设计该部分程序的时候基于(一)程序标准化原则,不管那个公司都可以应用(二)规则不能太简单,不能让客户一猜就能猜到(三)解锁过程做成类似软件一样,给一个授权密钥,该密钥里面包含了一些详细具体的信息;这样,公司在管理该部分程序的时候更简便,同时由于授权密钥的多样性,对于公司的管理来说更具有灵活性; 正文 一、 概览 当程序密钥过期(默认密钥无效)以后,程序中随机生成了4组4位整数,该组整数为最新License的种子数,将其称之为请求码(Require Code); 收到请求码(Require Code)后,根据不同情况选择不同有效期的密钥类型(LicenseType)后,根据一定规律生成的5组不同的4位整数; 新生成的5组不同的4位整数就是最新密钥,将该密钥输入到程序中,程序就会根据密钥中的有效期长度时间运行; 二、 随机数 根据上述描述,密钥首先得生成一组随机数。随机数的产生,现在用得较多的是“线性同余法"就是下面这个式子: R(n+1)= [R(n) * a + b] MOD c 为了避免PLC中的数据溢出,所以将c的值取为10000,这样每一次产生的随机数为一个4位(小于4位的话前面需要补0)数。 同时,为了让R(n+1)的值也是一直变化的,在程序中a的值也取为一个变化的整数,比如当前年份。 最终程序中确定的a,b,c 的值分别为 a=当前年份, b=1, c=10000。 程序中的密钥包括4组,得到第一个密钥以后,按照一定的规则得到第2-第4个密钥的种子数,如此4个种子数即可得到。 Figure1:随机数生成请求码程序图示 上图可以看到程序中的4组不同的种子数,通过如此多的变换和组数,这样不断组合之后被破解的难度会得到指数级的增长。 三、 新密钥 得到请求码(RequireCode)后,基于请求码为种子数,再将请求码套入上述公式中,同时a,b,c 的值可以取跟随机数一样的,也可以为了提高破解难度将a,b,c 的值取为不同的值,这样就得到正确密钥的数据。 程序中将收到的数据跟上述规则计算出的新密钥相比较,若相同则意味着密钥是有效的,就可以将程序解锁。 Figure2:新密钥程序图示 四、 密钥有效期 给定的新密钥中需要包含密钥的有效期,否则新密钥输入后不知道可以运行多长时间。目前程序中设置的密钥类型包括6种(一)无限制期限(二)5年期限(三)3年期限(四)1年期限(五)一个季度期限(六)一个月期限;在程序中用一个Int数据来表示当前密钥的类型,与上述6种类型分别一一对应的数值为1-6; 同样,为了将密钥有效期的破解难度增加,也将密钥有效期做一定的规则运算。目前程序中密钥有效期的运算规则为 密钥有效期 = [a* b*密钥类型数值] MOD 10000 程序中的a,b取值为当前年份和当前月份,如此6个不同密钥有效期的最新数据也会一月更新一次,增加破解难度。当然,也可以定义其他更复杂的规则,这样破解难度会成倍增加。 Figure3:密钥有效期程序图示 五、 程序逻辑 当程序的密钥过期以后,程序中将会生成一组4个整数的请求码,这四个请求码可以显示在上位机(HMI)上,如下图所示。 Figure4:上位机请求码 同时画面中有5个文本框用于输入新的密钥,如下图所示。其中第一个框用于输入密钥类型,其他4个框为与Figure4中对应的4组新的解码新密钥。 Figure5:上位机新密钥输入 同时在程序中还需要涉及到以下方面的内容管理:
Figure6:日期结构体数据
Figure7:密钥剩余时间计算 六、 新密钥生成工具 根据上述描述,新密钥和请求码之间有复杂的运算关系,若在收到远程请求码后,新的密钥计算也是一个不小的过程。 所以,为了将过程简化,目前在Excel中利用VBA编写了一个窗体程序,用于生成新的密钥。 Figure8:新密钥生成工具 将上位机系统显示的请求码输入到红色框内,然后在蓝色框中选择一种密钥类型,再点击密钥运行(License Run)即可按照文档中描述的规则在绿色框内生成新的密钥(NewLicense)。然后将绿色框内的数据填入上位机系统的新密钥输入区域即可。
后记 以上就是一个标准的密钥管理程序,在PLC中为一个单独的FB块:FB_License_Manager。 当密钥过期后,上位机系统就会弹出一个请求新密钥画面(包含请求码),同时其他画面被锁定无法进入。这样,只有得到新的有效的密钥后,其他画面才能得到解锁;
【壶琰棠】专注于PLC标准化编程以及功能编程!!
|
yming 至圣 经验值:126866 发帖数:21996 精华帖:824 |
8楼 2020-11-03 23:27:52
主题:回复:PLC程序加密的一种方法(密钥授权管理程序) 我从来程序不加密。也讨厌程序加密。 对于不熟悉的客户,合同价格本来就是合理报价+尾款。 客户有义务保护知识产权。而且交货时会单独给一份程序原始拷贝和简单说明。允许客户自行修改; 更何况机电一体化的成套设备,程序是为具体的设备、工艺服务的。光有全套程序有啥用处? 例如:我设计使用铝合金材料,他改成铸铁的,转动惯量大3倍,源程序直接用? 就像我们的工艺配方,你光有配方没用,你不会调整配方使其达到产品要求。 何况还有很多是KNOW HOW,完全书面描述给你,你也做不出来。(就像炒菜似的,掌握不了火候,就不是那个质量味道。) 仿制的情况,我遇到过几次。没见过仿制成功的。 对于加密。 前两年就遇到过一个事儿,厂里一条购置的产线要改一下,生产某种产品。PLC 是314的,联机要密码。想从触摸屏改一下吧,还有密码。让采购的联系厂家,结果说编程的人癌症死了。没人知道密码。我擦! 好在对PLC、工艺清楚,改改接线,“骗过”PLC,一天完成了“修改”运行。
学而时习之,不亦说乎?温故而知新,不亦乐乎?
|
笨笨笨笨 奇侠 经验值:7127 发帖数:1022 精华帖:2 |
32楼 2020-11-08 23:37:24
主题:回复:PLC程序加密的一种方法(密钥授权管理程序) 费这么大劲,就是害怕工程款拖欠???有这个精力,倒不如花时间想想怎么做好自己的项目,让客户满意!不要本末倒置才好!
心有多远路就有多远
|