扩展脚本,也可以作为配置文件,易于理解,维护及扩展。开源的Lua提供了Luac支持脚本加密保护,但这一过程不可逆,造成第三方个人或公司无法更新查阅审核脚本;未被加密保护的脚本能够被任意文本编辑工具(如记事本,写字板,SciTE,Sublime,Notepad++等)获取和修改。对于有安全要求且存在第三方介入的项目而言,这是亟待解决的问题。本文通过加密算法保护脚本文本,同时重写Lua 的require函数实现加密脚本加载运行,保证脚本的安全;并提供解密工具供第三方查看审核在线已加密脚本,保证脚本的简易维护。
1 Lua脚本
Lua的目标是通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。很多应用程序、游戏嵌入Lua,实现可配置性,可扩展性,如魔兽世界,愤怒的小鸟等。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译运行,没有提供强大的库,因此不适合作为开发独立应用程序。Lua是一种轻量级脚本语言,官方版本内核仅约120KB,体积小,启动速度快。Lua提供了易于扩展的接口和机制,很容易被其他语言扩展功能。
Lua支持面向过程和函数编程以及面向对象编程;提供通用型table实现数组,集合,对象及用户自定义数据类型(userdata);内置模式匹配方便数据操作;提供协同进程;实现自动内存管理;通过table和闭包可以实现继承重载等;同时lua有丰富的第三方功能库。
2 加密解密脚本及加载运行加密脚本
脚本加密是指以特殊的算法将明文代码隐藏或转译为不可读文本,授权用户能够通过解密获取代码,而未被授权的用户即使已获得加密文本,也无法正确获取脚本代码内容于逻辑运算,其运算方法是:如果a、b两个值不相同,则异或结果为1,如果a、b两个值相同,则异或为0。异或的一个重要特性就是a xor b=c,那么c xor b=a,这样如果b 是密匙的话,原文a被加密为c,c则可以通过解密还原为a。(1)加密函数const char*Lua_Encoding(const char* pBuf,int iLen)将输入的脚本字符串进行异或操作转码。
逐个提取字符,将字符串的长度与该字符所在的位置值取差值,再与字符取异或完成该字符的加密。在字符串加密完成后,在首和尾添加约定字符用以标示。
(2)解密函数const char*Lua_Decoding(const char* pBuf, int iLen) 将输入的字符串进行异或操作转码为正常文本。通过首和尾的约定字符判断是否为异或算法加密,逐个提取字符,将整个字符串的长度减去特定字符长度后与该字符所在的位置值取差,再与该字符取异或完成该字符的解密。■2.2 Lua脚本中调用动态库
加解密函数由C代码完成,通过开源工具tolua++封装实现Lua调用C\C++语言动态库。Tolua++是tolua的扩展版本,极大的简化了C/C++代码与lua代码的集成。首先需要创建package文件,即整理后的头文件,列举出需要导出到lua环境中的常量,变量,函数和类,tolua++中定义的C++对象导入Lua环境后,便被转换为包含原C++对象指针的Lua用户数据类型,并将用户数据类型关联上包含有所有C++对象可以调用方法的metatable。本文的pkg内容为:$#include “coding.hpp”const char *Lua_Encoding(const char*pBuf,int iLen);const char* Lua_Decoding(const char*pBuf,int iLen);tolua++解析该文件并创建绑定C/C++代码到Lua的文件。extern“C” int luaopen_libcoding(lua_State*state)函数封装入口函数tolua_coding_open(lua_State*state),执行tolua_ open在Lua注册表中写入键值并对公用table进行初始
58  |  电子制作    2020年01月
计算机教学
化,tolua_reg_types在Lua环境中注册类型,tolua_ module创建元表,tolua_beginmodule(tolua_S,NULL)使用元表把对应的module表压入栈,tolua_function将加密解密方法导入元表中,至此完成C/C++至lua脚本接口的实现。将tolua++生成的代码文件加入动态库工程中,编译成功后生成名为libcoding的动态库,在脚本里执行require(“libcoding”)即可在lua中加载并使用动态库。■2.3 require重写
通过重写require函数实现Lua加载加密脚本文件。首先判断文件是否已经加载,读取加密文件并通过Lua_ Decoding解密,loadstring将解密后的字符串加载到lua环境。local function getfile(name)
local f=io.open(s,”r”)
c=f:read(“*a”)
f:close()
c= Lua_Decoding(c,#c)
return c
lua字符串转数组end
function my_require(name)
if not package.loaded[name] then
local c=getfile(name)
m,err=loadstring(c)
package.loaded[name]=true
_m[name]=m()
return_m[name]
else
if(_m[name])then return_m[name] end
end
end
my_require脚本不需要修改,可以通过luac进行不可逆加密保护。
3 功能测试
对生成的libcoding进行功能测试,测试步骤为:(1)使用Sublime创建待加密脚本lua脚本文件,test(par)函数打印输入参数;(2)使用Lua_Encoding加密后使用文本工具打开加密后文件;(3)使用Lua_Decoding解密经过加密的脚本,并与待加密脚本比较。
对my_require函数测试的内容为:使用my_require 加载运行加密的脚本文件。
■3.1 加解密测试
编写lua脚本读取待加密脚本文件内容,调用加密函数Lua_Encoding函数进行加密,写入文件:
local f=io.open(“test.lua”,”r”)--test.lua为待加密的脚本。
local s=f:read(“*a”)
f:close()
local x=io.open(“test_coding.lua”,”w”)--test_ coding.lua为加密的脚本。
x:write(Lua_Encoding(s,#s))
x:close()
使用sublime打开加密后的脚本文件,显示结果如图1是不可读字符,达到了脚本保密的目的。
图1
编写lua脚本读取已经加密的脚本文件内容,调用Lua_Dncoding函数进行解密,并写入文件:local f=io.open(“test_coding.lua”,”r”)--test_ coding.lua为加密的脚本。
local e=f:read(“*a”)
f:close()
local x=io.open(“test_decoding.lua”,”w”)--test_decoding.lua为解密的脚本。
x:write(Lua_Decoding(e,#e))
x:close()
使用sublime打开解密后的脚本文件,脚本内容为明文可读字符,且和加密前的脚本完全一样,达到了脚本解密目的。■3.2 加载运行加密脚本测试
编写脚本调用my_require加载加密脚本,如下:require“my_require”--加载重写的reqiure函数x=my_require“test_coding”
图2(下转第32页)
www�ele169�com  |  59
实验研究
报警器则是多个信号相互公用的一个输出点,各种报警原因都会根据逻辑关系而并联,最后则是接入到报警器的输出点。■2.3 PLC抗干扰设计
PLC控制系统抗干扰设计属于一个全面的系统工程设计,并且对制造单位的设计要求非常高,需要能设计出具有强大抗干扰能力的作品出来,并且要在PLC整个设备中进行全方位的考虑,同时还需要将综合情况进行具体的分析设计,才可以保障PLC皮带运输机具备极高的抗干扰性,同时还需要注意对其设备
的选择和综合型设计这两个问题,在进行设备选择的过程中,需要利用非常强干扰能力产品,该产品还需要具备电磁兼容性和康维部干扰能力,其次则是需要了解其干扰能力指标和系数,是否能运用在电场强度非常大的高频率磁场工作环境当中;综合设计主要是针对系统外部的多方面抑制措施,其中保护线路对PLC系统的防空间辐射干扰和外引线屏蔽等功能,利用合理的方式对接地装置的设计,从而完善的制造接地系统,从全方位的提高了PLC 控制系统的安全性与稳定性。
3 结论
本文通过不断的研究与设计,完成了对PLC控制系统的相关研究,通过此次的生产线皮带运输机的PLC控制系统的设计,让本人对PLC控制系统的设计原理和方法优劣深入的了解。随着PLC系统的不断完成过程中,学习到了大量知识的实践与利用,同时还得到了不少启发,从最初对生产向皮带运输机的资料查询,到方案的制定、实施与设计,每一步都可以了解到所学知识的重要性。在现实运用中,能够运用于各种产品的流水生产线当中,并且能够大大的提高产品的生产效率。随着知识的不断学习与深入,本文所设计的PLC控制系统还需要不断的改进当中,因此在今后的学习当中,能够利用多方面的知识,对该系统进行更高的完善,以期可以在PLC控制系统这一方面能够进一步的提高。
参考文献
* [1]李东君.皮带运输机的PLC控制系统设计[J].机械研究与应用(6) : 82-83.
* [2]毛震,王得仓.皮带运输机的智能控制监控系统的设计分析[C].2015年5月建筑科技与管理学术交流会. 2015.
* [3]赵勇刚.皮带运输机电气控制系统优化设计[J].机械研究与应用, 2019(3) : 197-198.
微控制器STM32内存更高,运算速度更快;彩LCD,交互菜单更加人性化,交互性更高;二者都具有较低的功耗,满足日常测试和外出调试长时间待机的需求;从开发周期方面比较,二者初次开发周期都较长,但是在熟悉嵌入式操作系统及相关接口后,嵌入式手持终端的开发明显更加高效。该款手持终端已应用于无线智能仪表的生产测试及现场调试中,提高了生产及现场调试的效率。
5 结语
嵌入式二次开发手持终端为生产测试与现场调试提供了便捷,缩短了研发周期,避免重复造轮子,对于非标准协议及硬件多样化需求的快速开发提出了新思路。该设备可扩展使用红外通讯、条码扫描等多种方式,为以后测试提供良好的硬件基础。
参考文献
* [1]张颖,李忆昕.基于MSP430便携式掌机的设计与实现[J/ OL].电子技术与软件工程, 2019(18) : 109-110
* [2]吴琼,杜博,苏全志,王珏,张秋月.基于超高频RFID的手持抄表终端的设计[J].电测与仪表, 2018, 55(09) : 108-112.
(上接第4页)
(上接第59页)
通过lua运行,执行结果如图2所示。
加密后的脚本文件可以正常加载并正确执行,成功实现lua加载运行加密脚本文件。
4 结束语
本文通过C/C++封装的加密解密动态库,实现Lua脚本的加密解密功能,同时重写require函数,成功实现Lua 加载执行加密脚本,实现第三方可视化查阅审核代码,保障了Lua脚本的安全性。
参考文献
* [1]王云泽.Lua——一种高效的脚本语言[J].科技广场, 2010, (1) : 205-207.
* [2]姜波,张智斌,李国,姚文伟.Lua脚本文件的加密解密研究[J].郑州轻工业学院学报. 2011, 26(6) :
43-46.
32  |  电子制作    2020年01月

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。