RSA简介

转载 2011年01月10日 22:31:00

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值=93806062666699782638132820491933031482836826566660997927543724649365705
44351212100317240918585512136963153803911140361221172826833266241424877621296901
98817240660550803277359652183653995953232001094364721472581104174698257481811311
49217613806780318374365617984326523029965066348377550281908277056378455106547
##mypubkey的exponent长度=2
##mypubkey_exponent值=3

##myprivkey的modulus长度=1024
##myprivkey的modulus值=93806062666699782638132820491933031482836826566660997927543724649365
705443512121003172409185855121369631538039111403612211728268332662414248776212969
019881724066055080327735965218365399595323200109436472147258110417469825748181131
149217613806780318374365617984326523029965066348377550281908277056378455106547
##myprivkey.getExponent()长度=1023
##myprivkey.getExponent()值=6253737511113318842542188032795535432189121771110733195169581643291047029567474
73354482727905700809130876920260742690748078188455551082761658508086460132413639
62278455328383552959397735977285649455021534046301135296075808377308404258909132
811288204167107604525033796313576612747649866739561523887875979483707

其中,要记住,公钥的exponent即RSA算法中的e, e通常是3,17和65537
X.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                96
1024bit/PKCS     117               128
2048bit/PKCS     245               256
768bit/OAEP        54                96
1024bit/OAEP     86               128
2048bit/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来使用。

 

 

转载自:http://www.cnblogs.com/adylee/archive/2007/11/15/960141.html

RSA双因素身份认证产品简介

  • 2012年03月15日 18:48
  • 4.79MB
  • 下载

RSA算法简介与代码

  • 2011年05月26日 23:46
  • 381KB
  • 下载

RSA加密算法原理及RES签名算法简介

来源:http://www.xuebuyuan.com/1399981.html 第一部分:RSA算法原理与加密解密 一、RSA加密过程简述 A和B进行加密通信时,B...

RSA加密算法简介

目录(?)[+] 如果你问我,哪一种算法最重要?我可能会回答"公钥加密算法"。 因为它是计算机通信安全的基石,保证了加密数据不会被破解。你可以想象一下,信用卡交易被破解的...

Rsa 验证简介

如果不是用密码来进行验证的话,那么就可以使用 rsa 数据签名来进行验证。签名分为公钥和私钥2个。公钥是可以公开出来的,密钥是自己个人持有的。一般来使用 RSA 验证的话,是自己生成一对公钥/私钥。然...

加密算法概念简介--MD5、SHA、DES、3DES、AES、RSA、ECC

MD5       MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普...

服务器远程管理简介(ILO,BMC,RSA)

Author:Skate time:2016/09/18 转载:http://blog.csdn.net/cymm_liu/article/details/8447623 ...
  • wyzxg
  • wyzxg
  • 2016年09月18日 19:18
  • 3430

RSA算法简介及简单java实现类

RSA公钥加密算法是1977年由罗纳德·李维斯特(RonRivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工...

服务器远程管理简介(ILO,BMC,RSA)

现在说说HP的服务器: 好像HP的服务器标配都集成了iLO的,也就是HP自己的远程管理系统。以DL380的iLO2为例: 其实服务器上要设置的也就是IP地址和用户密码之类的东东, 在...

试译雷神的微软平台安全宝典第二章 简介和RSA章节

简介         在我多年致力于微软基础架构及企业部署的工作中,微软文件加密系统(Microsoft’s Encrypting File System,EFS)是我迄今为止见过的最强大的加密...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RSA简介
举报原因:
原因补充:

(最多只允许输入30个字)