一种字符数据线性随机加密和解密算法
技术领域
本发明涉及计算机技术领域,尤其涉及一种字符数据线性随机加密和解密算法。
背景技术
对于明文字符串数据加密的应用场景存在我们生活各个方面,例如QQ账号密码以及其他网络账户密码的加密,产品验证序列号的生成等。对于字符数据的加密分为可逆和不可逆两种,例如著名MD5加密算法是不可逆的,经MD5加密后的密文无法还原出原始数据,其加密合法性验证原理是用户原始数据经过MD5加密算法处理后再与之前相同算法加密的密文进行比较,这种加密方法的好处是任何人都无法修改加密的密文,安全性极高。但因为数据加密后无法解密,在需要还原出原有数据的应用业务中无法使用。目前,互联网应用中很多对于账户密码的加密是不可逆的,用户丢失密码后只能绑定的手机号或邮箱重置原来的密码,无法找回原来的密码。在有些加密方法即使可逆,但加密速度慢,消耗大,通过蛮力穷举法可以在短时间内暴力破解。
此外不同的数据经MD5加密后有可能形成同一密文,虽然概率极低,但还是可能出错。在可逆加密算法中,部分采用约定密文结构,通过算法公式加密原始数据,混合随机数的加密方式。
发明内容
有鉴于现有技术的上述缺陷,本发明所要解决的技术问题是提供一种字符数据线性随机加密和解密算法,以解决现有技术的不足。
为实现上述目的,本发明提供了一种字符数据线性随机加密和解密算法,包括加密步骤和解密步骤:
加密步骤包括:
S11、对需要加密的字符串进行格式判断,如果合法进行下一步处理,如果不合法返回出错;
S12、随机生成线性加密系数k;
S13、根据加密系数k的取值确定加密参数b的取值范围;
S14、计算加密字符串长度的密文存储值L,L=k+原字符串长度;
S15、分别将k、L的值由十进制转换成大写字母,填充密文位0~3位;
S16、根据算法公式y=kx+b,循环生成加密第4位以后的密文位;
S17、混淆排列增加破解难度;
解密步骤包括:
S21、对需要解密的密文进行格式判断,如果合法进行下一步处理,如果不合法返回出错;
S22、还原混淆排列前的密文结构顺序;
S23、提取线性系数K值以及字符串长度,并判断解密后的字符串长度是否等于原始字符串长度,如果不等于返回密文错误,如果等于原始字符串长度进入下一步骤;
S24、提取第一位密文的加密参数b值和y值,根据算法公式y=kx+b解密第一位密文;
S25、循环步骤S24,解密原始字符串所有位密文。
进一步地,所述算法公式y=kx+b中,其中y表示加密后的数值,x表示原始数值,k和b为随机数且采用线性同余法生成;y,k,b均为正数,x为原字符串经过ASC码转换成十进制数,范围33到126;y采用两位二十六进制表示,根基算法公式和密文组成原则y的二十六进制取值范围AA到ZZ,对应十进制数据为0到675。
进一步地,步骤S15具体为:分别将k、L的值由十进制转换成大写字母,填充密文位0~3位,其中第0位填充随机数,第1位填充加密后的k值,第2位填充随机数,第3位填充加密后的L值。
进一步地,所述步骤S16具体为:
第4位填充随机数,在b的取值范围内随机生成第一位密文的b值,将b值转换成二十六进制数存储在第5位和第6位;
加密第一位密文,将原始密文的字符转换成ASC码的十进制数,根据公式:y=kx+b求得y值,将y值由十进制数转换成二十六进制数存储在第7位和第8位;
第9位填充随机数,在b的取值范围内随机生成第二位密文的b值,将b值转换成二十六进制数存储在第10位和第11位;
加密第二位密文,将原始密文的字符转换成ASC码的十进制数,根据公式:y=kx+b求得y值,将y值由十进制数转换成二十六进制数存储在第12位和第13位;
依次类推,加密所有位数的原始字符密文。
进一步地,所述解密步骤中:密文第5位和第6位存取第一位密文的b值,第7位和第6位存取第一位原始字符加密后y值,将b和y值由二十六进制转换成十进制后,根据算法公式:y=kx+b求得原始字符在ASC码中的十进制数,再转换成对应的字符。
本发明的有益效果是:
(1)加密算法可逆,字符串数据通过线性随机加密后可以通过逆算法还原最初的数据。这对于远程访问数据库,本地于服务器之间的数据同步提供了便利,也为用户密码丢失提供了找回密码的可能。
(2)加密后破解难度大,加密密文采用二十六进制大写英文字母A~Z表示,即使原始字符是数字,小写字符或特殊字符在密文中都被掩盖,破解规律难,寻几乎没有,比如对12位字符串加密,组合数为94的12次方,等于475920314814253376475136,按照目前主流cpu i7处理器每秒50亿的运算速度,如果想破解这12位加密的字符串至少也要300万年。
(3)加密速度快,消耗低。加密算法使用线性二元一次方程y=kx+b,计算密文迭代次数少,通过在特定范围内随机生成线性系数k的取值,再根据k值确定b值得范围,便可以计算出某一位字符的密文,对于***资源的消耗非常低。
以下将结合附图对本发明的构思、具体结构及产生的技术效果作进一步说明,以充分地了解本发明的目的、特征和效果。
附图说明
图1是本发明实施例的加密算法流程图。
图2是本发明实施例的解密算法流程图。
具体实施方式
本发明提供了一种字符数据线性随机加密和解密算法,包括加密步骤和解密步骤:
加密步骤包括:
S11、对需要加密的字符串进行格式判断,如果合法进行下一步处理,如果不合法返回出错;
S12、随机生成线性加密系数k;
S13、根据加密系数k的取值确定加密参数b的取值范围;
S14、计算加密字符串长度的密文存储值L,L=k+原字符串长度;
S15、分别将k、L的值由十进制转换成大写字母,填充密文位0~3位;
S16、根据算法公式y=kx+b,循环生成加密第4位以后的密文位;
S17、混淆排列增加破解难度;
解密步骤包括:
S21、对需要解密的密文进行格式判断,如果合法进行下一步处理,如果不合法返回出错;
S22、还原混淆排列前的密文结构顺序;
S23、提取线性系数K值以及字符串长度,并判断解密后的字符串长度是否等于原始字符串长度,如果不等于返回密文错误,如果等于原始字符串长度进入下一步骤;
S24、提取第一位密文的加密参数b值和y值,根据算法公式y=kx+b解密第一位密文;
S25、循环步骤S24,解密原始字符串所有位密文。
其中,所述算法公式y=kx+b中,其中y表示加密后的数值,x表示原始数值,k和b为随机数且采用线性同余法生成;y,k,b均为正数,x为原字符串经过ASC码转换成十进制数,范围33到126;y采用两位二十六进制表示,根基算法公式和密文组成原则y的二十六进制取值范围AA到ZZ,对应十进制数据为0到675。
其中,步骤S15具体为:分别将k、L的值由十进制转换成大写字母,填充密文位0~3位,其中第0位填充随机数,第1位填充加密后的k值,第2位填充随机数,第3位填充加密后的L值。
其中,所述步骤S16具体为:
第4位填充随机数,在b的取值范围内随机生成第一位密文的b值,将b值转换成二十六进制数存储在第5位和第6位;
加密第一位密文,将原始密文的字符转换成ASC码的十进制数,根据公式:y=kx+b求得y值,将y值由十进制数转换成二十六进制数存储在第7位和第8位;
第9位填充随机数,在b的取值范围内随机生成第二位密文的b值,将b值转换成二十六进制数存储在第10位和第11位;
加密第二位密文,将原始密文的字符转换成ASC码的十进制数,根据公式:y=kx+b求得y值,将y值由十进制数转换成二十六进制数存储在第12位和第13位;
依次类推,加密所有位数的原始字符密文。
其中,所述解密步骤中:密文第5位和第6位存取第一位密文的b值,第7位和第6位存取第一位原始字符加密后y值,将b和y值由二十六进制转换成十进制后,根据算法公式:y=kx+b求得原始字符在ASC码中的十进制数,再转换成对应的字符。
以下结合具体实例说明本发明的原理方法:
本加密只对ASC码十进制范围内33到126的可见字符数据进行有效加密,本实例以12位字符数据进行算法加解密设计和实现。ASC码中33到126范围包括所有的英文字母,数字,标点符号等。
这里设计出一个线性加密算法y=kx+b,其中y表示加密后的数值,x表示原始数值,k和b为随机数,随机数采用线性同余法生成。y,k,b均为正数,x为原字符串经过ASC码转换成十进制数,范围33到126。y采用两位二十六进制表示,根基算法公式和密文组成原则y的二十六进制取值范围AA到ZZ,对应十进制数据为0到675。
根据算法公式:y=kx+b(0<y<675,33<x<126)
y采用两位二十六进制表示,当y=675,b=0时,x取最大值126,得到k的整数值为5。从算法公式可以看到,当b值增大时k值减小,为了缩小范围我们取k值的范围为1,2,3,4,5。根据算法设计,k的取值采用线性同余法随机生成。当k取不同的值时我们可以确定b值的范围。
当k=1时,0<b<549
当k=2时,0<b<423
当k=3时,0<b<297
当k=4时,0<b<171
当k=5时,0<b<45
b为随机数,当k值确定后,再根据上述取值范围在此区间内随机生成b值,b值最终转换成二十六进制数,在密文结构中分配两位进制存储。
密文结构设计:
以加密12位的字符串数据为例,加密后的密文由64位大写字母组成,每一位数据使用大写字母A~Z表示,使用2个大写字母表示每一位原始字符经过线性加密后的密文,使用1个大写字母表示线性加密系数k值,2个大写字母表示b值,1个大写字母表示加密字符串数据的长度,为了使长度位变成随机数,设计长度值等于实际字符长度加k值,随机数使用1个大写字母表示。
根据上述设计可以确定以下变量的取值和加密方式:
线性系数k:取值范围0<k<6,依次对应的大写字母A到E,即1代表A,5代表E。
b变量值:根据随机生成的k值,确定范围后,随机生成十进制数后再转换成二十六进制即两位大写字母,使用两位密文位存储。
密文x:每一位原始字符先根据ASC码转换成十进制数,取值范围33~126,再根据线性公式:y=kx+b求出y值,每个y值代表一位加密后的密文。
y变量值:取值范围0<y<675,由公式:y=kx+b求出y值后再转换成二十六进制,使用两位密文位存储。
为了增加密文的随机复杂度,每一位密文都对应一位随机数b。在64位数据中除了密文位其他数据位使用随机数填充,数据按照算法公式线性加密后再进行错位混淆排列以增加破解的难度。
本例算法使用以下密文结构:
第0位:随机数
第1位:加密后的k值
第2位:随机数
第3位:加密后的数据长度L=k+原字符串长度
第4位:随机数
第5~6位:b值随机数
第7~8位:第1位加密后的原始数据
第9位:随机数
第10~11位:b值随机数
第12~13位:第2位加密后的原始数据
以此类推
第59位:随机数
第60~61位:b值随机数
第62~63位:第12位加密的原始数据
本实施例的加密和解密算法流程图如图1、2所示:
加密流程描述:
(1)对需要加密的字符串进行格式判断,如果合法进行下一步处理,如果不合法返回出错。
(2)在1到5范围内随机生成线性加密系数k值。
(3)根据k的取值确定b的取值范围。
(4)计算加密字符串长度的密文存储值L,L=k+原字符串长度。
(5)分别将k、L的值由十进制转换成大写字母,填充密文位0~3位,其中第0位填充随机数,第1位填充加密后的k值,第2位填充随机数,第3位填充加密后的L值。
(6)第4位填充随机数,在b的取值范围内随机生成第一位密文的b值,将b值转换成二十六进制数存储在第5位和第6位。
(7)加密第一位密文,将原始密文的字符转换成ASC码的十进制数,根据公式:y=kx+b求得y值,将y值由十进制数转换成二十六进制数存储在第7位和第8位。
(8)循坏第6和第7加密步骤,依次加密12位原始字符。
(9)错位混淆排列增加破解的难度。
解密流程描述:
(1)对需要解密的密文进行格式判断,如果合法进行下一步处理,如果不合法返回出错。
(2)还原混淆排列前的密文结构顺序。
(3)提取加密字符长度位,解密后是否等于12,如果不等于返回密文错误。
(4)提取第一位密文的b值和y值,解密第一位密文。第5位和第6位存取第一位密文的b值,第7位和第6位存取第一位原始字符加密后y值。将b和y值由二十六进制转换成十进制后,根据算法公式:y=kx+b求得原始字符在ASC码中的十进制数,再转换成对应的字符。
(5)循坏第4步解密步骤,依次解密12位加密后的密文。
同一段字符串数据每一次加密得到的密文都是随机的如下表1所示,12位字符的组合数为94的12次方,等于475920314814253376475136,按照目前主流cpu i7处理器每秒50亿的运算速度,如果想破解这12位加密的字符串至少也要300万年,在实际的业务应用中往往会加入图片、数字等验证技术,使得破解者不可能在一秒内输入这么多次,要破解几乎不可能。
表1加密和解密实例
综上所述,本发明的加密解密算法具有以下优势:
(1)加密算法可逆,字符串数据通过线性随机加密后可以通过逆算法还原最初的数据。这对于远程访问数据库,本地于服务器之间的数据同步提供了便利,也为用户密码丢失提供了找回密码的可能。
(2)加密后破解难度大,加密密文采用二十六进制大写英文字母A~Z表示,即使原始字符是数字,小写字符或特殊字符在密文中都被掩盖,破解规律难,寻几乎没有,比如对12位字符串加密,组合数为94的12次方,等于475920314814253376475136,按照目前主流cpu i7处理器每秒50亿的运算速度,如果想破解这12位加密的字符串至少也要300万年。
(3)加密速度快,消耗低。加密算法使用线性二元一次方程y=kx+b,计算密文迭代次数少,通过在特定范围内随机生成线性系数k的取值,再根据k值确定b值得范围,便可以计算出某一位字符的密文,对于***资源的消耗非常低。
以上详细描述了本发明的较佳具体实施例。应当理解,本领域的普通技术人员无需创造性劳动就可以根据本发明的构思做出诸多修改和变化。因此,凡本技术领域中技术人员依本发明的构思在现有技术的基础上通过逻辑分析、推理或者有限的实验可以得到的技术方案,皆应在由权利要求书所确定的保护范围内。