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值=93806062666699782638132820491933031482836826566660997927543724649365705443512121003172409185855121
369631538039111403612211728268332662414248776212969019881724066055080327735965218365399595323200109
436472147258110417469825748181131149217613806780318374365617984326523029965066348377550281908277056
378455106547
##mypubkey的exponent长度=2
##mypubkey_exponent值=3

##myprivkey的modulus长度=1024
##myprivkey的modulus值=93806062666699782638132820491933031482836826566660997927543724649365705443512121003172409185855121
369631538039111403612211728268332662414248776212969019881724066055080327735965218365399595323200109
436472147258110417469825748181131149217613806780318374365617984326523029965066348377550281908277056
378455106547
##myprivkey.getExponent()长度=1023
##myprivkey.getExponent()值=62537375111133188425421880327955354321891217711107331951695816432910470295674747335448272790570080
913087692026074269074807818845555108276165850808646013241363962278455328383552959397735977285649455
021534046301135296075808377308404258909132811288204167107604525033796313576612747649866739561523887
875979483707

其中,要记住,公钥的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来使用。

refer to:http://www.blogjava.net/security/archive/2006/01/11/27547.html

转载于:https://www.cnblogs.com/Ymete/archive/2013/01/07/2849446.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

64位进程和32位进程通信问题,接收端收不到 SendMessage发送的消息

最近在做一个项目的时候,采用了win32的SendMessage方法来发送数据,本来都没问题,后来增加了一个项目,必须采用的目标平台是x64的,没想到居然没办法通信了。 网上找了很久解决方案,整整尝试了一个周&#xf…

全国计算机等级考试题库二级C操作题100套(第23套)

第23套: 给定程序中,函数fun的功能是:找出NN矩阵中每列元素中的最大值,并按顺序依次存放于形参b所指的一维数组中。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。 注意:源程序存放在考生…

html5 js

2019独角兽企业重金招聘Python工程师标准>>> http://labs.hyperandroid.com/mathmayhem 转载于:https://my.oschina.net/u/201125/blog/100934

初入职场的工作感悟

已经很久没有静下心来好好的做一次自我总结,个人博客已经搁浅数月,微信公众号也寥寥数篇。甚至我的GitHub 也将近半年没有点亮技能树了。难得的空闲时间,抓紧反思一下。 一个注重仪式感的我,在提前转正的那天,仅仅是发…

python按键盘上哪个键运行_python根据键盘输入进行相应操作

上篇文章介绍了如何利用pyhook模块监听鼠标键盘的事件,接下来如果需要通过监听的事件内容,来做对应的操作,需要对event的内容进行相应的判断。 如果仅仅通过event.key来进行判断,可以写成str(evnet.key) F12等,如果需…

全国计算机等级考试题库二级C操作题100套(第24套)

第24套: 程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参a中的数据进行修改,把修改后的数据作为函数值返回主函数 进行输出。 例如:传给形参a的数据中,学号、姓名、和三门课的成绩依次是…

JavaCL 1.0.0-RC3 发布,性能大幅提升

JavaCL 发布 1.0 的第三个 RC 版本,该版本除了 bug 修复之外,性能方面有着非常大的提升,同时支持 OSGi 绑定。详情请看这里。 JavaCL 是一个封装了 OpenCL 图形API的 Java 类库,提供很多高级的图像处理功能。该项目的 JavaDoc 文档…

java 字符串数组定义_「string数组」string 数组怎么定义 - seo实验室

string数组string数组的定义有三种:String arr[] new String[10]; //创建一个长度为10的String 类型数组。String arr[] {"张三","李四"};String[] arr new String[10];相关阅读分析:如果直接输出未初始化的数组元素值&#xff0…

为什么空格拷贝到linux 会变成两个

为什么空格拷贝到linux 会变成两个 学习了:https://zhidao.baidu.com/question/266438357.html 在vi界面内输入:set paste 然后进行拷贝; 拷贝之后,输入:set nopaste 转载于:https://www.cnblogs.com/stono/p/9373893.html

python画图如何调整图例位置_Python-如何将图例排除在情节之外

小编典典 有很多方法可以做你想要的。要添加inalis和Navi所说的内容,可以使用bbox_to_anchor关键字参数将图例部分地放置在轴外and/or 减小字体大小。 在考虑减小字体大小(这会使阅读起来非常困难)之前,请尝试将图例放在不同的位置…

全国计算机等级考试题库二级C操作题100套(第25套)

第25套: 人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入 结构体数组std中,且编号唯一。函数fun的功能是:找出指定编号人员的数据, 作为函数值返回,由主函数输出,若指定编号不存在,返回数据中的…

Haproxy 与 Cookie

1 什么是cookie ? 参考 cookie http://baike.baidu.com/view/835.htm Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于RFC2109&#xff0…

java 动态按钮_java-向片段动态添加按钮

我一直在尝试向片段动态添加按钮,但是我尝试过的所有方法都不起作用.这些是我尝试过的一些方法:1.public View onCreateView(LayoutInflater inflater, Nullable ViewGroup container, Bundle savedInstanceState) {LinearLayout linearlayout new LinearLayout(ge…

进程线程区别,和线程初识

进程是计算机中最小的资源分配单位在利用多个CPU执行的过程中,对多个程序的资源进行管理和隔离进程的弊端开启和关闭 以及 切换 都会带来很大的时间开销过多的进程还会造成操作系统调度的压力线程线程是CPU调度的最小单位每个进程中至少有一个线程实际上执行代码的是线程线程属…

python绘制三维地形_【学习笔记】Python科学计算三维可视化(黄天羽、嵩天)(学习中。。)|python基础教程|python入门|python教程...

0 导学 目的:掌握利用三维效果表达科学和工程数据的能力 传播一种思想:可视化技术是数据之眼内容组织: 流体数据的标量可视化、矢量可视化实例 三维扫描数据(模型/地形)可视化实例 三维地球场景可视化实例 曲线UI交互控…

全国计算机等级考试题库二级C操作题100套(第26套)

第26套: 给定程序中已建立一个带有头结点的单向链表,链表中的各结点按数据域递增有序链接。函数fun的功能是:删除链表中数据域值相同的结点,使之只保留一个。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结…

在高科技产业当中,有时候你的产品出现了问题,你反过来可以把这个问题称为你的特点...

为什么80%的码农都做不了架构师?>>> 在高科技产业当中,有时候你的产品出现了问题,你反过来可以把这个问题称为你的特点。刚才讲的这种“大加小”的搭配就是属于这样的例子。by高通CEO保罗雅各布 看到这句话,深有感触…

python面向对象有什么用_Python 中的面向对象没有意义

许多人都在抨击面向对象,虽然我不认为他有什么问题,但我觉得至少在Python 中没必要。近来,许多人都在抨击面向对象,虽然我不认为面向对象本身有什么问题,但我觉得至少在 Python 中没这个必要。1、没有必要使用面向对象…

C# http请求

/// <summary> /// GET方式发送得结果 /// </summary> /// <param name"url">请求的url</param> public static string DoGetRequestSendData(string url) { HttpWebRequest hwRequest…

-9 逆序输出一个整数的各位数字_【每日算法】基础算法——归并排序[求逆序对的数量](四)(思想很经典)...

题目内容给定一个长度为n的整数数列&#xff0c;请你计算数列中的逆序对的数量。逆序对的定义如下&#xff1a;对于数列的第 i 个和第 j 个元素&#xff0c;如果满足 i < j 且 a[i] > a[j]&#xff0c;则其为一个逆序对&#xff1b;否则不是。输入格式第一行包含整数n&am…