浅析用Java编程实现RSA算法的过程

2017-03-17 11:07周君
电脑知识与技术 2016年32期

周君

摘要:随着计算机技术迅速发展,人们已然步入数字化的时代,网络拉进了人与人之间的距离,愈发成熟的网络技术支持使得信息的处理与交流变得迅速且普遍,同时信息的存储与传递安全也一直为人们所追求,Java致力于开发网络应用程序,对于网络处理能力非常出色,不仅如此,因其对于安全性本身就具有很高要求的特性,加上RSA算法这种加密算法具有优越性,所以在Java语言的环境下来实现RSA算法可谓两全其美。

关键词:Java;RSA算法;公开秘钥密码

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)32-0040-03

由于Java语言应用于网络时的安全特性和RSA算法独具优越性,通过Java编程去实现RSA公钥密码算法,需要分析RSA公钥密码这一体制概念和相应所需数学算法的原理,在数学算法基础上去研究可行性。公开密钥密码是指使用一对不同的密钥,一个密钥是公开的,另一个是私密的,这种体制是为了验证在知道加密密钥前提时,推算出解密密钥在计算上很难真正实行。RSA算法是就目前来说,针对公钥密码十分安全,广泛应用于信息通讯和数字签名方面。

1 Java编程语言

1.1 Java语言由来

Java是由Sun公司根据嵌入式软件的需求,将C++语言进行了更改,开发出的命名为Oak的面向对象语言更名而来,在1995年Sun正式发布了Java和HotJava浏览器后,IBM,Apple,微软等各大公司,都争相购买Java的使用许可证,并建立了相应新的Java平台来研发自己的产品。在2006年,Sun公司宣布要将Java技术免费让外界使用,在2007年Java的源代码已可以让任何开发人员使用并修改,为Java语言的发展和其他语言的诞生奠定了良好的基础。

1.2 Java语言的特点

Java由C++衍生而来,属于计算机高级语言之一,剔除了C++一些不会经常使用的语句,比C++更加简单占用内存也变得比较少,更容易让人熟悉,与底层硬件无关,只需要一次编写就能完成在各个不同平台环境下运行,这是Java语言与生俱来的优势。随着Java语言的发展,其程序的编写难度是不断降低的,程序员也把重心放在为Java语言编写与框架设计,Java变得更具规模化且实用性得到提升。

1.3 Java语言当前发展情况

就目前的发展情况来看,Java编程语言深受程序云喜爱,各大知名企业都很热衷于购买Java的许可证,进而深入对Java语言的开发研究,开发与应用系统不断增多使得Java语言也在不断地完善与被创新,无形中对各个领域的蓬勃发展注入了生机与活力。

1.3.1 常用环境

Java经过几十年的不断发展,拥有了一些较为清晰的框架,进而发展为多种分支,如根据Java2为中心可以分成企业版的J2EE平台,标准版J2SE平台及微型版的J2ME,每个平台具有不同的特点,在长期实践下发现还是标准版J2SE广为大众所接受,在企业中的应用也很广泛。基于Java语言使用是自由的前提下,更多用于企业环境,随着科技水平日新月异,IT产业得到顺利发展,许多企业也在不断地转型中,企业版本中的J2SE平台促使Java编程显著提升,使得计算机的变成占用内存更小,服务器增大。

1.3.2 促进PC时代到来

计算机是IT领域发展的基础,然而计算机现在已经不是访问互联网的唯一方式,目前各种电子产品已经涌入了IT领域,大大推动了IT领域发展与创新,由于传统的客户机已经不能很好地满足系统的要求,PC比较传统客户机却具有更大的优势,另外Java语言应对PC的要求都能一一满足,且降低了内存直接可以在不同终端运行,其被识别范围也是非常之广,所以最终PC时代极大可能会成为将来的主流。

2 RSA算法研究

2.1 RSA算法簡析及信息交换过程

2.1.1算法简析

RSA算法属于公钥密码体制,是目前使用最为广泛的,在经过各种各样攻击的影响下,RSA算法的安全性受到了比较大的冲击,但同时其算法也在一直进行改进,模在持续增多,由于RSA算法一般都是大整数间进行模的幂计算与模的相乘计算,造成其运行速度比较慢。RSA的体制在理论上是安全的,但在实际运用中发生的情况都是不一定的,由于不同的系统对于速度与安全性等有不同的要求,造成攻击者可以根据系统特性去攻击RSA密码体制,从而成功破译,所以需要不断改进RSA算法来提高其安全性。

2.1.2 实现信息交换过程

当双方进行信息交换时,一方生成出一对密钥后需要将其中一把密钥作为公开密钥提供给另一方,另一方需要使用已知公钥再加密信息后发送给对方,之后在进行一系列加密措施,这样的好处在于无须让用户交换密钥,这样的运作是为了让密钥不那么容易被解密,但是同时也有一些不足,即加密与解密所花时间也会相应增长,由于这个因素导致只适合于对少量数据加密保证实施进度。

2.2 RSA算法基础计算

RSA算法体制需要数学基本知识作为基础,涉及素数、模运算、单向函数等大量数学知识,这些即为其算法的本质。下面是RSA算法的基本流程图

2.2.1 素数

定义是一个大于1的整数,如果这个数它的整因数只有1与本身,那么这个数就称为素数(或者质数),不然就是合数,例如2,3,5等等这样的数即为素数。

2.2.2 模数计算

这里假设一个正整数N,如果用N去分别除以a,b两个整数,计算出的结果的余数相同,就可称a,b对于模数N来说同余数,记作a=b(modm),如果不一样就说a,b对模数N来说不同余,则记作a≠b(modm)

2.2.3 单向函数计算

将f设为一个函数,在任意给定x情况下,轻易可以计算出y使y= f(x),但相反任意给定y,计算x使f(x)=y却很难,这样的情况下就可以将f称为一个单项函数。例如函数式f(x)=a^x,根据基本的数学知识知道a^x可以将x个a相乘算出结果,但是如果面对的是给定任意y,计算a^x = y这样的计算还没用发现一个很有效的计算出的方法,这里也可以将f(x)=a^x看作单项函数。

2.3 針对RSA密码体制的解析

从现有理论分析,RSA密码的安全性是取决于大模数因数分解结果,越困难越难破解,在实际中从技术分析来说这是不一定的,因为没有任何数据证明分解大模数就可以保证一定能攻击破解RSA密码,实际上大模数的因数分解一直难以找到有效解决方法,对业界专家来说是十分头疼的问题,但是在广泛应用中证明了RSA算法安全性是十分可靠的,但是在一些情况下如果密钥的设置不当则会带来相应安全问题,通过分析可以发现RSA存在目前几种缺陷。

2.3.1 运行速度较慢

在大数分解过程中,模数的大小造成分析是否困难,大数的模幂运算是算法的核心,通常来说,RSA安全系数与模数长度成正比,模数越大影响造就算法安全性提升,同时也会造成解析时间变长,所以运行的速度受到影响就会大大减慢了。应对这样的问题,技术人员找出了一些应对方法,如使用专门的硬件去实现其算法,以及适当选择实现算法参数也能加快运行速度。

2.3.2 素数问题

早在2000多年前,就有古希腊学者给出了证明素数是无穷无尽的,而且因为素数毫无规律可循的原因,导致根本无法找到一个可以代表全体素数的公式,现在素数产生都是随机生成的,然后通过素数判别法来判断是否是素数,可以通过确定性素数判定法和概率性素数判定法来判定。

2.3.3 安全性面临新考验

3 用Java语言实现RSA算法

3.1编程中算法的描述

RSA加密算法属于非对称加密算法的一种,与对成加密不同的就是需要两个密钥,已知RSA公钥体制是以数论的寻求两个大素数当它们相乘的乘积足够大的情况下,按照现今条件很难将它们的乘积分解,在这样的体制中,每个用户拥有一对密钥,公开密钥与私密密钥,公开密钥知道的,但是私密密钥是保密的,加密算法公开但是私密密钥由公开密钥决定,但由于大素数相乘结果来分解非常困难,所以难以根据公钥计算出私钥。

RSA的构造过程即根据用户所输入的p(公开)与q(私密)的bits随机产生的大素数,公式是:n = p*q选择Java语言作为编程语言是因为由于安全要求,n的位数要尽可能大一些,甚至达到1024b以上,Java则可以很方便地处理大数据。随机选择密钥e,e的要求是和(p-1)*(q-1)相互为质数。解密密钥d要满足n与d互质,最后e和n作为公钥,d是私钥。加密信息的密文为: ci = mi^e(mod n)解密密文为:mi = ci^d(mod n)。

3.2 秘钥对的产生与源程序

实现RSA算法的重要技术就是产生随机数,密码的安全性也是建立在随机数基础上的,因而大素数都是由随机数产生而来,大素数直接影响着密码是否安全,另一个技术方面体现在素数检测方面,当产生了两个随机大素数后,要检测两个大素数是否是由随机序列构成的整数,避免被重复会造成的安全性降低。在程序中根据输入的p,q位数值Bit,用BigInteger(Bit,10,rand)方法随机产生素数p,q,e,t = (p-1)*(q-1),因为e的位数和p,q相同,则一定满足e

Do{

P = new bigInteger(Bit,10,rand);

q = new bigInteger(Bit,10,rand);

e = new bigInteger(Bit,10,rand);

t = (p.substract.multiply);

}

while(!(e.gcd(t).equal));

n = p. multiply(q);

bigInteger tmp[] = Euclid(E.T);

D = tmp[0];

}

由于在Java语言中大数bigInteger具有应对大数处理和将大数进行运算等功能,用Java编程就可以很轻易地获取大数数据并且编写RSA公钥算法的程序,

4总结

由于Java语言具有平台无关性特点,若是不对编写后的语言进行加密很容易使用户经过一些手段获取源码使信息发生泄漏,运用RSA加密算法对文件进行加密,从而可以达到防止盗用、保护版权等目的。使用Java编程实现RSA旨在将技术应用于各个不同系统平台, RSA公钥算法从提出到现在已经差不多有25年,经历了种种考验也,被认为是目前最优秀的公钥之一,不仅如此,RSA公钥算法还是第一个能同时应用于密码签名和数字签名的算法,大大简化了其操作流程,容易让人理解,由于Java语言其可被自由在不同平台使用且都能很好地兼容的特点,所以可以在不同的平台上用Java编程来实现RSA算法,保证了其可操作性和安全性强的优势。

参考文献:

[1] 王惠玲.基于Java的IDEA加密算法探讨[J].中国科技信息,2010(22).

[2] 张萍萍.基于RSA的公钥密码理论分析[J].信息科学,2011(2).

[3] 邵丽萍.Java语言程序设计[M].北京:清华大学出版社,2012(10).

[4] 凌捷.计算机数据安全技术[M].北京:科学出版社,2013(3).

[5] 王昆.RSA算法研究及其抗攻击风险量化分析[J].计算机与信息技术,2014(12).