您的位置:首页技术文章
文章详情页

Java中RSA使用简述

【字号: 日期:2024-06-30 17:19:48浏览:2作者:猪猪
内容: 任何获得Matrix授权的网站,转载请保留以下作者信息和链接:作者:cas(作者的blog:http://blog.matrix.org.cn/page/cas)RSA简介RSA协议我不再描述,大家可以看http://www.di-mgt.com.au/rsa_alg.html。RSA的密钥对生成时间依赖于两个因素,第一,密钥的长度第二,素数的筛选质量在整个密钥对生成过程中,RSA会随机选择两个大素数,事实上,计算机的聪明程度还不足以判断某个随机选择的大素数是否真的不可分解,因此,你只能够通过计算机程序来尽量将这个大随机数不是素数的几率降到某个界限值(如0.0001)以下。RSA KeyPair分为公钥和私钥,你应该这样使用KeyPair:1,你使用私钥来签名,别人用你的公钥来验证签名2,别人用你的公钥加密信息M->M',你用私钥来解密信息M'->M注意的地方虽然RSA经受过多年深入的密码分析,但大家在使用RSA的时候还是要注意以下事项,否则RSA的安全性会大打折扣:1,合理的密钥长度(setKeyLength)RSA1024至今是安全的,按照目前密码分析和计算机硬件条件的发展,估计在未来5-10年,仍以难以破解。2,素数确定性选择(setCertaintyOfPrime)实际应用中,选择100就行了。3,选择合理的padding(setRSAMode)RSA有三种模式,RAW, PKCS和OAEP,日常应用中,我本人只使用PKCS(PKCS#1 v1.5)和OAEP(PKCS#1 v2.0)这两种padding模式。padding跟安全性其实是紧密挂钩的,有兴趣的朋友可以看看PKCS#1标准讨论。案例我编写了一个RSAUtils的工具类,下面的该类的测试代码的一部分。程序如下: RSAUtils utils =new RSAUtils(); utils.setKeyLength(1024); utils.setCertaintyOfPrime(100); utils.setRSAMode(PKCS_RSA_MODE); //RAW =1 PKCS=2 OAEP=3 utils.initRSAKeyPair(); //查看公钥 RSAKeyParameters mypubkey=utils.getPublicKey(); BigInteger mypubkey_modulus=mypubkey.getModulus(); BigInteger mypubkey_exponent=mypubkey.getExponent(); System.out.println('##mypubkey的modulus长度='+mypubkey_modulus.bitLength()); System.out.println('##mypubkey_modulus值='+mypubkey_modulus.toString()); System.out.println('##mypubkey的exponent长度='+mypubkey.getExponent().bitLength()); System.out.println('##mypubkey_exponent值='+mypubkey_exponent.toString()); //查看私钥 RSAKeyParameters myprivkey=utils.getPrivateKey(); BigInteger myprivkey_modulus=myprivkey.getModulus(); System.out.println('##myprivkey的modulus长度='+myprivkey_modulus.bitLength()); System.out.println('##myprivkey的modulus值='+myprivkey_modulus.toString()); System.out.println('##myprivkey.getExponent()长度='+myprivkey.getExponent().bitLength()); System.out.println('##myprivkey.getExponent()值='+myprivkey.getExponent());以下是输出:##mypubkey的modulus长度=1024##mypubkey_modulus值=93806062666699782638132820491933031482836826566660997927543724649365705443512121003172409185855121369631538039111403612211728268332662414248776212969019881724066055080327735965218365399595323200109436472147258110417469825748181131149217613806780318374365617984326523029965066348377550281908277056378455106547##mypubkey的exponent长度=2##mypubkey_exponent值=3##myprivkey的modulus长度=1024##myprivkey的modulus值=93806062666699782638132820491933031482836826566660997927543724649365705443512121003172409185855121369631538039111403612211728268332662414248776212969019881724066055080327735965218365399595323200109436472147258110417469825748181131149217613806780318374365617984326523029965066348377550281908277056378455106547##myprivkey.getExponent()长度=1023##myprivkey.getExponent()值=62537375111133188425421880327955354321891217711107331951695816432910470295674747335448272790570080913087692026074269074807818845555108276165850808646013241363962278455328383552959397735977285649455021534046301135296075808377308404258909132811288204167107604525033796313576612747649866739561523887875979483707其中,要记住,公钥的exponent即RSA算法中的e, e通常是3,17和65537X.509建议使用65537,PEM建议使用3,PKCS#1建议使用3或65537,一般来说,都是选择3。私钥的Exponent就是私钥中最重要的部分,它就是私钥区别于公钥的地方!接着,我们看看RSA的加密,解密过程。通常,不要随便对某一个别人发过来的东西进行签名(有潜在危险),即使有这样的必要,请先将它的文件进行Digest或者HMAC处理后,再做签名。为了说明RSA是如何加密信息的,我先让大家脱离MD5/SHA1等辅助算法(没有人会单独使用RSA,RSAwithMD5,RSAwithSHA1才是常用的使用方法),来单独看看RSA本身:大家习惯了DES/IDEA,再看RSA的加密,可能会有一些不习惯,因为RSA虽然也可以看成是基于Block的加密,但是,RSA的输入和输出的Block的大小是不一样的,Block的大小依赖于你所使用的RSA Key的长度和RSA的padding模式。在RSAUtils测试用例中,分别对RSA设置三种长度的Key(768,1024,2048)和2种padding模式(PKCS 1.5和OAEP),结果如下:RSA InBlock大小 OutBlock大小 (单位,字节)768bit/PKCS 85 961024bit/PKCS 117 1282048bit/PKCS 245 256768bit/OAEP 54 961024bit/OAEP 86 1282048bit/OAEP 214 256大家可以看到,相同密钥长度, 加密出来的密文长度要比明文要长,且OAEP的InBlock/OutBlock要比PKCS的InBlock/OutBlock要小,单从熵的角度,意味着OAEP padding模式引入更多的熵,OAEP要比PKCS更安全(事实上,为何提出OAEP代替PKCS,大家可以到RSA网站看看OAEP文档 http://www.rsasecurity.com/rsalabs/node.asp?id=2125)。下面,RSAUtils是我写的针对BouncyCastle的一个工具类,它封装了BouncyCastle的crypto中的RSAEngine,基本上,我很少单独使用RSAUtils,我更多的是结合DiegestUtils来使用。资源:作者的blog:http://blog.matrix.org.cn/page/casJava安全版:http://www.matrix.org.cn/topic.shtml?forumId=55 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
标签: Java
相关文章: