作者简介:张小飞(1981-),男,硕士,连云港人,主要研究方向为网络信息安全;李佩娟(1982-),女博士研究生,主要从事测控技术与导航控制方面的研究。
不可逆加密算法和随机算法的分析与实现张 小 飞1 李 佩 娟21(国网南京自动化研究院 信息网络安全实验室 南京 210003)2(东南大学 仪器科学与工程学院 南京210096)摘要:利用明文密码和密文密码之间的不可逆性,对应用软件密码进行加密,可以防止密码被破译或极大地增加其被破译难度和破译时间。
初步探讨了增强这种算法安全性的几种相关加密算法,对其中的随机算法进行重点分析,改进并实现了随机函数的生成算法。
根据分析可以看出这种随机算法很好地提高了不可逆加密算法的加密强度和加密速度。
关键词:加密;不可逆;强度;随机算法Research & Realization of Irreversible Encryption Algorithm and Random AlgorithmZHANG Xiao-fei 1 LI Pei-juan 21(Introduction to Information & Network Security Laboratory of State Grid Corporation of China, Nanjing210003)2(School of Instrument Science and Engineering, Southeast University, Nanjing 210096)Abstract: The irreversibility between plaintext and ciphertext is used to encrypt the cipher of application software. Therefore the decryption time and difficulty can be greatly increased, and the cipher can be protected from decryption in this algorithm. The paper also tentatively discusses several related encryption algorithms, especially improves and realizes the random algorithm. The analyses confirmed that this kind of random algorithm greatly improves the strength and the speed of encryption algorithm.Key words: encryption; irreversibility; strength; random algorithm1 引 言目前,加密算法被广泛地应用于文件、数字签名、计算机网络的保密与安全等方面,其中比较成熟和流行的加密算法有 DES 加密算法、RSA 加密算法等,正在研究和开发的加密算法有刘氏高强度公开加密算法等。
它们将明文用选定的密钥通过某种加密算法把明文变成密文,密文还可以用密钥通过该解密算法变换成原来的明文,即明文和密文之间具有可逆性。
应用软件一般都需要输入正确的密码(即口令)之后,才可以跳过启动界面,进入到软件的使用界面。
这个密码就相当于上面介绍的明文,这种明文被称为明文密码。
它应该存储在应用软件内部的某个文件或某几个文件中,只不过在存储明文密码时,是经过加密的。
这种经过加密后的密码称为密文密码。
对于明文密码和密文密码之间具有可逆性的加密算法研究的比较多,而且比较成熟,下面讨论明文密码和密文密码之间不可逆加密算法。
2 不可逆加密算法应用软件在判断用户输入密码是否正确时,不是采用将密文密码解密成明文密码,再和用户输入的明文密码进行比较来判断用户输入的密码是否正确,而是采用将用户输入的明文密码加密成密文密码后,再和应用软件保存的密文密码进行比较来判断用户输入的密码是否正确。
这样就不需要对密文密码进行解密,即只有加密过程,没有解密过程,可以使用一些不可逆的加密算法来增强加密的安全性。
采用的非线性不可逆加密算法:i i i z Ax y +=其中y i 为加密后的密文密码向量,x i 为待加密的明文密码向量,A 为映射矩阵,z i 为非线性函数向量。
当采用有密钥时,A 为根据密钥选定的一个映射矩阵,A 随着密钥的变化而变化。
当密钥相同时,A 也相同。
z i 也可以和A 相同随着密钥的变化而变化,也可以不变。
当采用无密钥时,A 可以是系统中给定的一个固定的映射矩阵或随机的映射矩阵。
明文密码向量 x r = ′i x = [x 1, x 2,…, x m ] 密文密码向量 y v = ′i y = [y 1, y 2,…, y n ]非线性函数向量 z v = ′i z = [z 1,z 2,…, z n ] 映射矩阵 A = ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡………nm n n m m a a a a a a a a a 212222111211::: 如果最后密文密码为 )~,~,(i i z A y f y =,当将映射矩阵A 的特征信息A ~和非线性函数向量i z 的特征信息i z ~保存到密文密码中时,加密就具有可逆性。
如果采用)(i y f y =,不将映射矩阵A 的特征信息A ~和非线性函数i z 的特征信息i z ~保存到密文密码中,则加密算法就具有不可逆性。
不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文密码后由系统直接经过加密算法处理成密文密码,加密后的密文数据使用穷举法很难破解,只有重新输入明文密码,并再次经过同样不可逆的加密算法处理,得到相同的密文密码并被系统重新识别后,才能真正解密。
显然,在不可逆算法的加密过程中,加密是明文密码,解密还得是明文密码,而所谓解密,实际上就是将明文密码重新加一次密,再将得到的密文密码进行比对。
在此基础上可以采用其他手段增强加密的可靠性。
如可以将密文密码保存于文件制定位置或者拆开保存在几个文件中;可以采用密文密码长度为定长的加密方式,使破译者不知道原来明文密码是几位;可以采用加密后的密文密码的每个字符与所有明文密码有关系,这样产生的明文密码即使是一位不一样,加密后的密文密码的所有位也都不一样。
3 随机加密算法作为明文密码的字符共有95个(包括26个大写英文字母,26个小写英文字母,10个数字键,键盘上的其他33个符号)。
因此明文密码空间为 95i ,其中 i 为明文密码长度。
密文密码空间的大小与所采用的字符种类、数量和长度有关。
采用随机加密算法,将随机函数生成的非线性函数向量(随机值i z )加入密文(i Ax )中得到新的密文(i i i z Ax y +=)。
显然这种方法得到的密文密码的ASCII 值有可能低于32或超过126,可以采用与126取余、低于32重新生成、输出比例变化等各种办法,来保证密文密码的ASCII 值在32至126内。
也可以不做这一步,使密文密码有一部分(ASCII码值在32-126以外)是乱码,但这样做容易引起攻击者的怀疑。
加密后的密文密码中的前若干位可以用来保存随机加密函数的特征信息值,但不保存其它特征值。
这样就会产生一个密文密码对应多个明文密码的现象,使攻击者利用密文盲检测出明文的几率大大降低。
4 随机数生成器随机加密算法最核心的问题是随机数的生成。
最常用算法是通过取系统时间作为随机加密函数,也可以通过随机函数Random(Limit)来实现。
约翰.冯诺伊曼在1946年提出了以下的计算随机数列的机制:取一个N位数,将其平方,并从结果(表示为一个2N位的数,如果需要在左补0)中取出中间的N位作为数列里的下一个数。
例如,如果N取4,并以1234作为起始点,那么随机数列中的后面几个数分别为5227、3215、3362、3030和1809,这种方法称为中方方法(middle-squared method)。
编程实现如下:Var MidSqSeed : integer;Function GetMidSquareNumber : integer;Var Seed : longint;BeginSeed := longint (MidSqSeed) * MidSqSeed;MidSqSeed := (Seed div 100) mod 10000;Result := MidSqSeed;End;中方方法在实际应用中有很大的限制。
例如以1234作为种子开始,中方方法可以生成55个随机数,而所有后续的随机数都将是0。
另外,如果从一个特殊的数例如4100开始,则得到的数列将是8100、6100、2100、4100,无限循环下去。
还有一些诸如此类的不合理数列。
即使采用16位整数作为种子,大约生成了50到60个随机数后,也可能生成一个循环数列或者是一系列0。
所以加密算法中的随机数生成器不建议采用中方方法。
1949年D.H.Lehmer提出了另一种随机数生成方法,即线性同余方法(linear congruential method)。
选择三个数,m、a和c,并由一个开始的种子X0使用以下公式(mod为取模运算)来生成X i的数列:X n+1= (aX n+c) mod m如果适当地选择了这三个数,所生成的数列则是随机的。
在Delphi中标准系统随机数生成器分别使用以下值:即a=134775813($8088405),c=1,而m=232;其中的X0(随机数种子全局变量RandSeed),可以直接设置,也可以使用Randomize过程由系统时钟来设置。
这样很好地保证了随机数种子的随机性,否则很有可能由于每次选取的X0相同而造成数列的一致,这是由算法的确定性造成的。
既然这样,就可以考虑选择使用自己设定的合理的a、c和m值,增强这种线性同余方法的随机性。
设定a、c和m有一些规则,一般会将m选择为尽可能地大,从而使得重复的周期也尽可能大。
它至少要大到操作系统的字长,例如32位的操作系统选取m的大小为32位,64位的操作系统选取m的大小为64位。
a要与m互质,c通常选择0或1,不过一般规则是如果选择一个非0的值,就必须保证c和m互质。
如果选择c为0。
生成器就称为乘法线性同余生成器(multiplicative linear congruential generator)。
为了确保利用此生成器可以得到一个最大的周期,就必须保证m是质数。
此类随机数生成器中,最著名并且经受住大量统计测试的要算最小标准随机数生成器(minimal standard random number generator),是由Stophen Park和Keith Miller于1988年提出的,此生成器的a=16807,m=2147483647(或231-1)。