`
security
  • 浏览: 372471 次
  • 来自: www.pgp.org.cn
社区版块
存档分类
最新评论

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和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来使用。

分享到:
评论

相关推荐

    RSA算法简述.doc

    RSA算法简述.doc

    RSA加密全流程以及文档

    在客户端浏览器,Javascript使用RSA算法,以公钥对密码进行加密,服务端使用相应的私钥进行解密。一般用于注册时或登录时填写的密码。 1. [文件] security.js ~ 19KB 2. [文件] RSAUtils.java ~ 15KB 说明文档

    rsa算法程序流程图

    rsa算法程序流程图 其中包括rsa算法加解密

    基于RSA的数字签名

    本科生毕业论文,关于数字签名技术房产证信息上的应用。

    Java对称与非对称加密解密(AES与RSA)

    Java对称与非对称加密解密(AES与RSA) 一、对称加密技术与非...二、对称加密技术与非对称加密技术的使用场景简述 三、Java实现使用的是AES的对称加密和RSA的非对称加密 备注:此文包括概念讲解和Java代码实现,详见文档

    百度地图毕业设计源码-express-parent:校园快递代拿系统(课程设计)

    security+oauth2使用rsa加密实现认证中心(我这里没有使用io.jsonwebtoken,实际上应该使用,nacos的源码也有使用jjwt,我没使用只是为了更好的熟悉security的部分源码) redis除了用作基本缓存以外,还是程序实现自动...

    Java加密与解密的艺术配书源代码

    第10章终极武器—数字证书332 10.1 数字证书详解332 10.2 模型分析335 10.3 证书管理337 10.4 证书使用351 10.5 应用举例360 10.6 小结360 第11章终极装备—安全协议362 11.1 安全协议简述362 11.2 模型分析364 11.3...

    Java加密与解密的艺术

    带有数字签名的加密网络应用3189.7 小结319第三部分综合应用篇第10章终极武器—数字证书33210.1 数字证书详解33210.2 模型分析33510.3 证书管理33710.4 证书使用35110.5 应用举例36010.6 小结360第11章终极装备—...

    课程设计基于Java实现的校园快递代拿系统源码+sql数据库+项目详细说明.zip

    3. spring security+oauth2使用rsa加密实现认证中心(我这里没有使用io.jsonwebtoken,实际上应该使用,nacos的源码也有使用jjwt,我没使用只是为了更好的熟悉security的部分源码) 4. redis除了用作基本缓存以外,...

    混合加密的原理描述

    混合加密算法结合了对称性加密和非对称性加密的优点,在通信过程中,除了能有效地保证安全性以外,还将加密算法的效率大大提高。混合加密算法采用了双重加密,即使有恶意用户在交换密钥的时候窃取了部分密钥,也不会...

    c# 加密和解密相关代码

    用,没有必要作类似于PGP、RSA 或DES 等复杂的加密算法。本实例介绍如何使用ROT13 算法加密和解密数 C#开发实战1200 例(第II卷) 832 据。实例运行效果如图19.3 所示。 图19.3 使用ROT13算法加密解密数据 关 键技术...

    网络安全作业(完整版).doc

    数据加密 简答题 1简述公钥体制与私钥体制的主要区别? 答:公钥体制和私钥体制主要区别于私钥DES算法可能强度不够,易受攻击而公钥体制RS A算法强度很高,但耗费时间很长,可能成为整个系统运行速度的瓶颈,使用在...

    移位寄存器在序列密码体制的应用及算法分析 (2000年)

    通过简述现代密码体制中的数据加密标准DES和RSA公钥体制存在的某些问题,针对目前对上述两种体制研究的人较多,并且各国对自身研究水平实施保密,一般实际水平都要比所公开的超前五到十年或更多,所以很难确定其对上述...

    asp.net知识库

    使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的...

    puppet-apagado-terminales:Puppet 模块,用于安装在关闭、重新启动或注销 LTSP 服务器时关闭终端的脚本

    傀儡终端Puppet 模块,用于安装在关闭、重新启动或注销 LTSP 服务器时关闭终端的脚本模块执行简述目的地: 课堂服务器。 行动: 复制脚本shutdown terminal.sh 750权限到/usr/sbin 安装脚本运行所必需的 dsh 包。 在...

    完全掌握加密解密实战超级手册.zip02

    542.2 简述代码分析实战 552.2.1 虚拟地址与偏移地址 552.2.2 搜索程序入口点OEP 582.2.3 转储程序与修复输入表 582.2.4 用增加重定位项调用引入表函数 622.3 常见静态分析工具 632.3.1 常见程序类型分析工具 632.3....

    计算机网络安全试题-《网络安全与管理(第二版)》网络安全试题.doc

    3. 以下算法中属于非对称算法的是( ) A、DES B RSA算法 C、IDEA D、三重DES 4. 在混合加密方式下,真正用来加解密通信过程中所传输数据(明文)的密钥是( ) A、非对称算法的公钥 B、对称算法的密钥 C、非对称...

    完全掌握加密解密实战超级手册.z01

    21.1.1 密码学简述 21.1.2 常用汇编语言命令 21.1.3 破解密码的常用方式 41.1.4 壳的作用和分类 51.2 文件读写与动态链接库文件 61.2.1 INI文件与自定义文件的读写 61.2.2 在Delphi中建立和使用DLL文件 101.2.3 DLL...

Global site tag (gtag.js) - Google Analytics