RSA加密算法

  RSA公钥加密算法是1977年由Ron Rivest, Adi Shamir 和Leonard Adleman一起提出,RSA就是他们三人姓氏开头字母拼在一起组成的。RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,至今未被完全攻破。目前已被ISO推荐为公钥数据加密标准。

  RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,截止2017年被普遍认为是最优秀的公钥方案之一。

RSA公开密钥密码体制

所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。

   根据密钥的使用方法,可以将密码分为对称密码和公钥密码

    对称密码:加密和解密使用同一种密钥的方式

    公钥密码:加密和解密使用不同的密码的方式,因此公钥密码通常也称为非对称密码。

RSA算法实现过程

RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。

公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。

解密者拥有私钥,并且将由私钥计算生成的公钥发布给加密者。加密都使用公钥进行加密,并将密文发送到解密者,解密者用私钥解密将密文解码为明文。

示例:

  以甲要把信息发给乙为例,

    首先确定角色:甲为加密者,乙为解密者。

   然后由乙随机确定一个KEY,称之为密匙,将这个KEY始终保存在机器B中而不发出来;

   接着由这个 KEY计算出另一个KEY,称之为公匙。这个公钥的特性是几乎不可能通过它自身计算出生成它的私钥。

   接下来通过网络把这个公钥传给甲,甲收到公钥后,利用公钥对信息加密,并把密文通过网络发送到乙,

   最后乙利用已知的私钥,就对密文进行解码了。

  以上就是RSA算法的工作流程。

  RSA算法具体实现过程如下:

    1、随意选择两个大的质数p和q,p不等于q,计算N=pq。

    2、根据欧拉函数,不大于N且与N互质的整数個数為(p-1)(q-1)。

    3、选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)。

    4、用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1))。

    5、将p和q的记录销毁。

  注:(N,e)是公钥,(N,d)是私钥。

RSA算法的应用

RSA的公钥和私钥是由KeyPairGenerator生成的,获取KeyPairGenerator的实例后还需要设置其密钥位数。

设置密钥位数越高,加密过程越安全,一般使用1024位。

如下代码:

java代码:

复制代码
 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(RSA);   // 密钥位数  keyPairGen.initialize(1024);
复制代码

公钥和私钥可以通过KeyPairGenerator执行generateKeyPair()后生成密钥对KeyPair,通过KeyPair.getPublic()和KeyPair.getPrivate()来获取。

如下代码:

java代码:

复制代码
 // 动态生成密钥对,这是当前最耗时的操作,一般要2s以上。  KeyPair keyPair = keyPairGen.generateKeyPair();   // 公钥  PublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  // 私钥  PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();   byte[] publicKeyData = publicKey.getEncoded();   byte[] privateKeyData = publicKey.getEncoded();
复制代码

公钥和私钥都有它们自己独特的比特编码,可以通过getEncoded()方法获取,返回类型为byte[]。

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信