本发明涉及数据加解密技术领域,具体来讲是一种基于arm(移动端的cpu处理器)指令构造数据加解密算法的方法及系统。
背景技术:
目前,在移动端程序中都会对比较重要的数据进行加密或者解密。现有的加解密算法大多都采用比较成熟的公开的算法,虽然公开算法本身是安全的,但是带来的问题则是hack(黑客)也可以获取到同样的加解密算法来对数据进行解密,从而获取到原始的数据。例如,对于直播app(application,应用程序)来说,每个房间的观看人数的数据是比较关键的数据,通常的做法是服务器会发送请求验证数据给客户端,客户端回复服务器正确的数据则表明是一个正常的客户端登录到这个房间;如果回复的数据是错误的则认为是一个非法的伪造用户。
但实际应用中,此方法的弊端是hack可以通过直播app来获取到直播app回复服务器数据的计算方法,从而可以将功能移植到性能较好的服务器来计算正确的回复数据,而在性能更好的服务器甚至可以同一时间伪造大量的虚假用户登录到房间。由此可见,现有的加解密算法还是可能会遭到hack的破解,安全性较低,进而使得应用中的某些数据还是可能会被机器程序来利用伪造。
因此,如何有效避免数据加解密被恶意破解,提高数据的加解密的安全性,是本领域技术人员亟待解决的问题。
技术实现要素:
本发明的目的是为了克服上述背景技术的不足,提供一种基于arm指令构造数据加解密算法的方法及系统,能有效避免数据加解密被恶意破解,提高数据加解密的安全性。
为达到以上目的,本发明采取的技术方案是:提供一种基于arm指令构造数据加解密算法的方法,该方法包括以下步骤:
s1:设置用于构造加解密算法的加法运算操作,所述加法运算操作基于arm指令实现加法操作;
s2:设置用于构造加解密算法的减法运算操作,所述减法运算操作基于arm指令实现减法操作;
s3:设置用于构造加解密算法的左移运算操作,所述左移运算操作基于arm指令实现数据逻辑左移操作;
s4:设置用于构造加解密算法的右移运算操作,所述右移运算操作基于arm指令实现数据逻辑右移操作;
s5:利用设置好的加法运算操作、减法运算操作、左移运算操作、右移运算操作进行随机组合,构造出加密算法;并根据构造出的加密算法,生成与该加密算法对应的解密算法。
本发明还提供一种基于arm指令构造数据加解密算法的系统,该系统包括加法运算设置单元、减法运算设置单元、左移运算设置单元、右移运算设置单元以及加解密算法构造单元。所述加法运算设置单元用于:设置用于构造加解密算法的加法运算操作,该加法运算操作基于arm指令实现加法操作。所述减法运算设置单元用于:设置用于构造加解密算法的减法运算操作,该减法运算操作基于arm指令实现减法操作。所述左移运算设置单元用于:设置用于构造加解密算法的左移运算操作,该左移运算操作基于arm指令实现数据逻辑左移操作。所述右移运算设置单元用于:设置用于构造加解密算法的右移运算操作,该右移运算操作基于arm指令实现数据逻辑右移操作。所述加解密算法构造单元用于:利用设置好的加法运算操作、减法运算操作、左移运算操作、右移运算操作进行随机组合,构造出加密算法;并根据构造出的加密算法,生成与该加密算法对应的解密算法。
本发明的有益效果在于:
本发明通过使用arm的特殊指令设置(设计)出用于构造加解密算法的基本算术运算操作(加法运算操作、减法运算操作、左移运算操作、右移运算操作);再利用这些基本的算术运算操作进行大量的组合和重复来构造成加解密算法。
与现有技术相比,本发明设置的基本算术运算操作是基于arm的特殊指令来实现的,该指令只能运行于arm的芯片上,从而使得hack即使获取到了数据的加解密算法,但是由于该算法只能在arm芯片上运行,而arm芯片的运算能力有限,所以hack也没有办法在arm上同时构造大量的伪造用户登录数据,从而避免了加解密算法被恶意破解。与此同时,本发明构造的加解密算法是对基本运算操作的随机组合和任意多条运算的叠加,对于这种基于任意多条运算操作构造的加解密算法,可以不断的去变换其运算数和条数,使得算法可以不断的更新,进一步提高了加解密算法的安全性。
附图说明
图1为本发明实施例中基于arm指令构造数据加解密算法的方法的流程图;
图2为本发明实施例中基于arm指令构造数据加解密算法的系统的结构框图。
具体实施方式
下面结合附图及具体实施例对本发明作进一步的详细描述。
本发明是一种基于arm特殊指令来构造数据的加解密算法的方案。其设计思路是:首先,通过使用arm的特殊指令来设置(设计)用于构造加解密算法的基本算术运算操作,该基本算术运算操作包括:加法运算操作(2个数据相加)、减法运算操作(2个数相减)、左移运算操作(一个数据逻辑左移几位)和右移运算操作(一个数据逻辑右移几位)。然后,利用这些基本的算术运算操作大量的组合和重复来组合成加密算法。同时,根据组合成的加密算法,生成与该加密算法对应的解密算法,该解密算法与加密算法是对等的操作。例如,在加密算法中设置了一条对一个数据相加5的操作,那么相对应的在解密算法中就会设计一条对一个数据减去5的操作,同样的在加密算法中将一个数据左移3位,那么相对应的在解密算法中则将这个数据右移3位等等。通过这种多条逻辑运算叠加在一起形成一套加解密算法。一套加解密算法可以使用十几条甚至几十条逻辑运算叠加,同时可以用同样的操作随机的生成多套加解密算法。
基于上述设计思路,参见图1所示,本发明实施例提供一种基于arm指令构造数据加解密算法的方法,包括以下步骤:
步骤s1:设置用于构造加解密算法的加法运算操作,该加法运算操作基于arm指令实现加法操作。
实际操作中,步骤s1具体包括以下操作:
步骤s101:定义一个宏的加法运算操作符_add_(r,x,y),其中参数r存放加法的结果,参数x存放被加数,参数y存放加数,该加法运算操作符完成的运算即是r=x+y操作。
步骤s102:为该加法运算操作符_add_(r,x,y)设置arm指令,使得该加法运算操作符_add_(r,x,y)按照设置的arm指令完成加法操作。
具体来说,该加法运算操作符_add_(r,x,y)按照设置的arm指令完成加法操作的具体流程为:
步骤s102a:执行寄存器切割为半字后执行半字加法;
步骤s102b:读取cpsr寄存器的值;
步骤s102c:分离出溢出标志;
步骤s102d:检查前面的半字加法的结果是否有溢出;
步骤s102e:判断标志寄存器中的零标志z是否等于0;
步骤s102f:将溢出计入最终结果。
与上述内容对应的arm指令实现代码可如下:
#define_add_(r,x,y)
__asm____volatile__(
"uadd16%0,%1,%2"//执行寄存器切割为半字后执行加法
"mrslr,cpsr"//读取cpsr寄存器的值
"andlr,lr,#0x30000"//分离出溢出标志
"tstlr,#0x30000"//检查前面的半字加法是否有溢出
"itne"//判断标志寄存器z是否等于0
"addne%0,%0,#0x10000"//将溢出计入最终结果
:"=r"(r)
:"r"(x),"r"(y)
:"lr"
);
可以理解的是,本实施例中通过提供一个宏的加法运算操作符来实现基于arm指令的加法操作。不使用函数而使用宏的好处是编译器会对宏进行展开,从而使得该段代码更大更复杂。其实现的基本原理是:将加法操作变换为等价的arm平台其他指令序列的操作,实现算法对平台的绑定。最简单的方案是使用半字加法,将字切割为半字分别实施加操作,为保证最终结果与原生算法一致,需要将后半字加法的溢出加到前半字结果中。半字加法指令会影响cpsr寄存器的bit16~19(16~19位),即ge[3:0]标志,其中ge[1:0]为后半字加法的溢出标志,ge[3:2]为前半字加法的溢出标志,因此通过常数0x30000可以检测出后半字加法是否有溢出。该算法会用到栈,通过影响声明由编译器完成现场保护和恢复。
步骤s2:设置用于构造加解密算法的减法运算操作,该减法运算操作基于arm指令实现减法操作。
减法运算操作的设置原理与加法运算操作的设置原理相同,此处原理部分不赘述。实际操作中,步骤s2具体包括以下操作:
步骤s201:定义一个宏的减法运算操作符_sub_(r,x,y),其中参数r存放减法的结果,参数x存放被减数,参数y存放减数,该减法运算操作符完成的运算即是r=x-y操作。
步骤s202:为该减法运算操作符_sub_(r,x,y)设置arm指令,使得该减法运算操作符_sub_(r,x,y)按照设置的arm指令完成减法操作。
具体来说,该减法运算操作符_sub_(r,x,y)按照设置的arm指令完成减法操作的具体流程为:
步骤s202a:执行寄存器切割为半字后执行半字减法;
步骤s202b:读取cpsr寄存器的值;
步骤s202c:分离出借位标志;
步骤s202d:检查前面的半字减法的结果是否有借位;
步骤s202e:判断标志寄存器中的零标志z是否等于1;
步骤s202f:将借位计入最终结果。
与上述内容对应的arm指令实现代码可如下:
#define_sub_(r,x,y)
__asm____volatile__(
"usub16%0,%1,%2"//执行寄存器切割为半字后执行减法
"mrslr,cpsr"//读取cpsr寄存器的值
"andlr,lr,#0x30000"//分离出借位标志
"tstlr,#0x30000"//检查前面的半字减法是否有借位
"iteq"//判断标志寄存器z是否等于1
"subeq%0,%0,#0x10000"//将借位计入最终结果
:"=r"(r)
:"r"(x),"r"(y)
:"lr"
);
步骤s3:设置用于构造加解密算法的左移运算操作,该左移运算操作基于arm指令实现数据逻辑左移操作。
实际操作中,步骤s3具体包括以下操作:
步骤s301:设定执行左移运算操作的进入条件。可以理解的是,所设定的进入条件,可根据具体情况需要由设计人员进行自行设置。
本实施例中,是利用了hi/ls条件,即cpsr寄存器的c/z标志位。由于该算法可能插入代码任何地方,因此c/z标志位是随机的,为保证算法的确定性,需要人为准确地确定这两个标志位。这两个标志位的置位和复位可以通过算术或逻辑运算来间接操纵。但是直接加载常数来操纵标志位不足以迷惑反编译器,因此算法中通过算术右移指令在源操作数rs的rs[7:0]>=32和rs[31]==1条件下会置最终结果为0xffffffff的特性,间接构造出常数0xffffffff,再对该常数进行算术运算即可得到确定的条件标志。
步骤s302:定义一个宏的左移运算操作符_lsl_(v,s),其中参数v存放被移位数和结果,参数s存放移动的位数,该左移运算操作符完成的运算即是v=v<<s(将v左移s位)操作。
步骤s303:为该左移运算操作符_lsl_(v,s)设置arm指令,使得该左移运算操作符_lsl_(v,s)在满足设定的进入条件时按照设置的arm指令完成数据逻辑左移操作,并在移位后利用空闲指令槽实施一次函数切割,以进一步干扰反编译器;在不满足设定的进入条件时陷入一个错误的算法分支。
可以理解的是,本实施例中通过提供一个宏的左移运算操作符来实现基于arm指令的左移操作。不使用函数而使用宏的好处是编译器会对宏进行展开,从而使得该段代码更大更复杂。整体思路上移位操作仍然使用arm原生的移位指令来实现,但在实施移位操作前对算法做了条件修饰,满足设定的进入条件后进入正确的算法分支,否则会陷入错误的算法分支。并且,在移位后利用空闲指令槽实施一次函数切割,可进一步干扰反编译器,具体来说,由于条件操作的四条指令槽只使用了两条(一条期待的正确操作,一条干扰性的错误操作),因此余下两条刚好能容下一次基于lr寄存器的跳转,该跳转将诱导反编译器判定为此处为该函数的结尾,其内容为:a.加载该算法的尾后指令地址作为跳转的目标地址;b.执行条件跳转。
具体来说,与上述内容对应的arm指令实现代码可如下:
#define_lsl_(v,s)
__asm____volatile__(
".code16"
"movr4,0x80000000"
常数设置lr[31]
"addr4,0x20"
常数设置lr[7:0]>=32
"orrlr,r4"
加载常数到
"asrslr,lr"
使得lr<=0xffffffffsetc
"cmpr0,3"
"addslr,3"
clearz
"itetthi"
条件执行
"lslhi%0,%0,%1"
v<<s实现了v左移s位的操作
"lsrls%0,%0,%1"
假操作指令
"addhilr,pc,1"
加载blxhi之后的一条指令地址
"blxhilr"
执行后续一条指令
:"+r"(v)
:"i"(s)
:"lr","r4"
);
步骤s4:设置用于构造加解密算法的右移运算操作,该右移运算操作基于arm指令实现数据逻辑右移操作。
右移运算操作的设置原理与左移运算操作的设置原理相同,此处原理部分不赘述。实际操作中,步骤s4具体包括以下操作:
步骤s401:设定执行右移运算操作的进入条件。
步骤s402:定义一个宏的右移运算操作符_lsr_(v,s),其中参数v存放被移位数和结果,参数s存放移动的位数,该右移运算操作符完成的运算即是v=v>>s(将v右移s位)操作。
步骤s403:为该右移运算操作符_lsr_(v,s)设置arm指令,使得该右移运算操作符_lsr_(v,s)在满足设定的进入条件时按照设置的arm指令完成数据逻辑右移操作,并在移位后利用空闲指令槽实施一次函数切割,以进一步干扰反编译器;在不满足设定的进入条件时陷入一个错误的算法分支。
具体来说,与上述内容对应的arm指令实现代码可如下:
#define_lsr_(v,s)
__asm____volatile__(
".code16"
"movr4,0x80000000"
常数设置lr[31]
"addr4,0x20"
常数设置lr[7:0]>=32
"orrlr,r4"
加载常数到lr
"asrslr,lr"
使得lr<=0xffffffffsetc
"addslr,3"
clearz
"itetthi"
条件执行
"lsrhi%0,%0,%1"
v>>s实现将v数据右移s位
"lslls%0,%0,%1"
假操作指令
"addhilr,pc,1"
加载blxhi之后的一条指令地址
"blxhilr"
执行后续一条指令
:"+r"(v)
:"i"(s)
:"lr","r4"
);
步骤s5:利用上述设置好的基本运算操作(加法运算操作、减法运算操作、左移运算操作、右移运算操作)进行随机组合,构造出加密算法;并根据构造出的加密算法,生成与该加密算法对应的解密算法,该解密算法与加密算法是对等的操作。
可以理解的是,本发明中的每一个基本运算操作可使用不同的参数,基于不同的参数可形成不同的运算操作,例如,基于加法运算操作,可形成一条a=a+3的操作,还可形成一条a=a+15的操作,同样的对于减法和移位也可以是减不同的数、移不同的位。这样一来,利用每一个基本运算操作,就可随机组合出任意多条不同的运算操作。而在此基础上,多个不同的基本运算操作又可进行随机的任意组合,从而就可以构造出任意复杂的加解密算法,进而提高了加解密算法的安全性。除此之外,基于arm特殊指令构造的加解密算法,只能在arm芯片上运行,而同一个设备上能够同时运行的加解密算法是非常有限的。而对于这种任意多条逻辑运算操作构造的加解密算法可以不断的去变换其运算数和条数,使得算法可以不断的更新,从而避免了加解密算法被恶意破解,进一步提高了加解密算法的安全性。
参见图2所示,本发明还提供了一种基于arm指令构造数据加解密算法的系统,包括加法运算设置单元、减法运算设置单元、左移运算设置单元、右移运算设置单元以及加解密算法构造单元。
加法运算设置单元用于:设置用于构造加解密算法的加法运算操作,所述加法运算操作基于arm指令实现加法操作。减法运算设置单元用于:设置用于构造加解密算法的减法运算操作,所述减法运算操作基于arm指令实现减法操作。左移运算设置单元用于:设置用于构造加解密算法的左移运算操作,所述左移运算操作基于arm指令实现数据逻辑左移操作。右移运算设置单元用于:设置用于构造加解密算法的右移运算操作,所述右移运算操作基于arm指令实现数据逻辑右移操作。加解密算法构造单元用于:利用设置好的加法运算操作、减法运算操作、左移运算操作、右移运算操作进行随机组合,构造出加密算法;并根据构造出的加密算法,生成与该加密算法对应的解密算法。
上述各设置单元的具体设置流程与上述方法的各部分相对应,此处不赘述!
需要说明的是:上述实施例提供的构造数据加解密算法的系统在进行具体操作时,仅以上述各功能单元的划分进行举例说明,实际应用中,可根据需要将上述功能分配由不同的功能单元完成,即将系统的内部结构划分成不同的功能单元,以完成以上描述的全部或者部分功能。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。