`
security
  • 浏览: 377386 次
  • 来自: 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算法是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。这种算法基于数论中的大数因子分解难题,使得加密和解密的过程分别依赖于一对密钥——公钥和私钥。在RSA中,...

    js rsa加解密

    ### RSA原理简述 RSA算法的核心在于两个大素数的乘积,即公钥和私钥。公钥是公开的,用于加密数据;私钥是保密的,用于解密数据。由于因数分解大整数非常困难,因此即使知道公钥,也无法轻易推算出私钥,从而保证了...

    RSA加密全流程以及文档

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

    rsa.zip_RSA encryption _rsa_rsa c++_zip

    RSA的工作原理简述如下: 1. **密钥生成**:首先,选择两个大素数p和q,计算它们的乘积n=p*q。然后,选取一个整数e,满足1φ(n)且e与φ(n)互质(φ(n)是欧拉函数,表示小于n且与n互质的正整数个数)。最后,通过...

    RSA_Test.rar_RSA 加密 解密 算法_rsa_rsa加密_rsa加密算法_加密解密

    RSA算法的工作原理简述如下: 1. 密钥生成:首先选择两个大素数p和q,计算它们的乘积n=p*q。接着,计算欧拉函数φ(n)=(p-1)*(q-1),选择一个与φ(n)互质的整数e作为公钥的加密指数。然后,找到一个与e互逆的数d作为...

    RSA.zip_rsa_rsa加密_加密

    其工作原理简述如下: 1. **密钥生成**: - 首先选择两个大素数p和q,它们的长度通常为几百位,确保难以进行因式分解。 - 计算n=p*q,n将成为公钥和私钥的一部分。 - 计算欧拉函数φ(n)=(p-1)*(q-1),它表示小于...

    rsa算法程序流程图

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

    基于RSA的数字签名

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

    javascript实现rsa加解密

    下面简述一下使用JavaScript进行RSA加解密的步骤: 1. **生成密钥对**:首先,我们需要生成一对RSA密钥。这可以通过调用特定库的函数完成,如`OpenSSL`的`openssl genpkey`命令可以生成PEM格式的密钥对。在...

    信息安全_数据安全_SSL简述.pdf

    在 SSL 协议中,使用了 RSA 算法来实现身份验证和数据加密。 SSL 协议的工作流程可以分为以下几个步骤: 1. Alice 和 Bob 互相交换公钥,并使用公钥签署 DH 协议的结果。 2. Alice 和 Bob 使用 DH 算法交换密钥,并...

    cpp代码-RSA破译

    3. 算法流程:简述RSA的加密和解密过程,可能包括关键步骤的解释。 4. 破译RSA:如果项目关注的是破译RSA,那么`README.txt`可能会讨论一些理论上的攻击方法,如数论攻击、量子计算的Shor算法,或者是针对特定实现的...

    Java各个包简述.pdf

    38. **java.security.interfaces**:定义了公钥和私钥的接口,如RSAKey和DSAKey。 以上就是Java主要包的简述,每个包都为特定的功能或服务提供了必要的类和接口,是Java程序员日常开发中不可或缺的一部分。理解并...

    VC++实现的RAS加解密源码

    其工作原理简述如下: 1. **密钥生成**: - 首先选择两个大素数p和q,它们的乘积n=p*q。 - 计算φ(n)=(p-1)*(q-1),这是欧拉函数,表示小于n且与n互质的正整数个数。 - 选择一个与φ(n)互质的整数e作为公钥的...

    psck 公钥证书标准(英文版)

    文档首先介绍了公钥密码学的基础概念,并简述了RSA算法的基本原理。RSA算法是一种非对称加密算法,被广泛应用于安全数据传输、数字签名等领域。该文档旨在为实施基于RSA算法的公钥密码系统提供指导。 #### 2. 符号...

    Schnorr签名方案及其应用优势的简述_XXX.docx

    Schnorr 签名方案及其应用优势简述 一、数字签名的发展 数字签名是密码学中的一种基本密码原型,自 1976 年 Diffie 和 Hellman 首先提出公钥密码以来,数字签名便成为了最有用的密码原型之一。Rivest,Shamir 和 ...

    20151910042-刘鹏-MC实验04-因子分解问题1

    RSA的工作原理简述如下: - 选择两个大素数p和q,计算n=p*q和φ(n)=(p-1)*(q-1)。 - 找到一个整数e,1φ(n),且e与φ(n)互质。e是公钥的一部分。 - 计算e关于φ(n)的模逆数d,即存在一个整数d,满足e*d ≡ 1 (mod φ...

    毕业论文设计-IT计算机-ASP.NETRSA可视化算法程序的实现与研究(源码+论文).zip

    2. ASP.NET概述:简述ASP.NET的核心概念,如页面生命周期、状态管理、数据绑定和控件模型等,以及它如何支持Web应用开发。 3. 程序设计:描述如何在ASP.NET中设计和实现RSA算法,包括创建用户界面展示加密和解密...

    GIT简易使用手册

    - 检查`.ssh`目录是否存在`id_rsa`和`id_rsa.pub`文件。 - 如果不存在,使用命令`ssh-keygen`生成新的SSH密钥对。 以上步骤涵盖了从Git的基本概念到实际操作的关键知识点,有助于初学者快速入门并有效利用Git进行...

Global site tag (gtag.js) - Google Analytics