RSA加密算法及使用公私钥实现数字签名

一, 传统对称加密算法

传统的对称密码算法可以有效地保护小范围内的点对点传输数据的机密性,但是在参与通信的节点数量增多后,**管理成为了瓶颈问题。
RSA加密算法及使用公私钥实现数字签名
在密码学中,恺撒密码,或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
RSA加密算法及使用公私钥实现数字签名
对称加密算法是应用较早的加密算法。在对称加密算法中,数据发信方将明文(原始数据)和加***一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的**及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的**只有一个,发收信双方都使用这个**对数据进行加密和解密,这就要求解密方事先必须知道加***。

二,非对称加密算法

RSA加密算法及使用公私钥实现数字签名
对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个**来进行加密和解密,这两个秘钥是公开**(public key,简称公钥)和私有**(private key,简称私钥)。
公开**与私有**是一对,如果用公开**对数据进行加密,只有用对应的私有**才能解密;如果用私有**对数据进行加密,那么只有用对应的公开**才能解密。因为加密和解密使用的是两个不同的**,所以这种算法叫作非对称加密算法。

三,RSA算法加密算法

RSA算法是一种非对称密码算法,通常是先生成一对RSA **,其中之一是保***(SK),由用户保存;另一个为公开**(PK),可对外公开,甚至可在网络服务器中注册,加密算法和解密算法也是公开的。
为提高保密强度,RSA**至少为500位长,一般推荐使用1024位,RSA**长度随着保密级别提高,且增加很快。但这会使加密的计算量增大,于是为减少计算量,在传送信息时常采用传统加密方法与公开**加密方法相结合的方式。

为了具体了解RSA算法,我们先熟悉下列简单的数学概念:

  1. 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
  2. 互质是公约数只有1的两个整数,叫做互质整数。
  3. 模运算,即求余运算,如5%2=1。
  4. 同余式:正整数a,b对p取模,它们的余数相同,记做 或者a ≡ b (mod p)。
  5. 欧拉函数:为了更直观地知晓原理,这里只说明欧拉函数的特殊情况,即如果n可以分解成两个互质的整数之积,即 n = p * q(其中p,q均为质数) ,则φ(n) = φ(p * q) = φ§*φ(q)=(p-1)(q-1)

**的生成步骤
RSA加密算法及使用公私钥实现数字签名
举例讲解RSA算法的加密,解密过程:

1.小明随机选择两个不相等质数,例如61和53(即p=61,q=53)
2. 小明计算出pq得值,即n=6153=3233。
3. 小明计算出φ(3233)=60*52,即φ(n)=3120
4. 小明在1到3120之间,选择一个随机数,假设为17,即公钥e=17
5. 小明算出e对于φ(n)的模反元素d为私钥,d=2753
ps:
RSA加密算法及使用公私钥实现数字签名
6. 至此,公钥为(3233,17),私钥为(3233,2753)

利用公钥,私钥进行密文传递:
1.发送时:
RSA加密算法及使用公私钥实现数字签名
其中m为待发的信息,即将待发送消息m经过公钥和上述表达式转换后得到c,发送c

2.接收时:
RSA加密算法及使用公私钥实现数字签名
把收到的消息c利用私钥转换过来,得到实际密文m
注意
m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。此外,也可用私钥加密,公钥解密,这在下文会有详细说明

下面根据具体实例模拟下密文的传递过程:
1.假设小明想要发送的密文为m=12
2.随后小明随机选取互质的两数p=3,q=5,则n=15, φ(n)=(3-1)(5-1)=8
3.在1~8中随机选取一个与8互质的数作为公钥e,假设小明选取了e=3,则(15, 3)为公钥
4.那么根据e
d%8=1,可以算出d=19,则(15,3)为公钥,(15,19)为私钥
5.加密时:
实际发送出去的密文为:12^3%15=3
7. 解密时:
收到密文内容为3后,解密文: 3^19%15=12

四,RSA加密算法安全性分析

这里有的同学就有疑问了,既然n都已经公开了那么求φ(n)不是易如反掌吗,我随手就能说几个, φ(35)=24 φ(18)=8…,但是这是在n很小的情况下,倘若n很大呢,你还可以易如反掌算出吗?
对于RSA加密解密算法而言,(e,n)为公开**,那么**RSA最直接的方法就是分解整数n,得到n=pq中的p与q的值,之后由 φ(n)=(p-1)(q-1) 计算得到 φ(n),再通过 ed%φ(n)=1,即可求出私钥d,之后使用(d,n)即可得出加密之前的明文。但是如果**的大小过大的话,那么就会产生“大整数分解难题”,从而导致解密失败。

五,公私钥与数字签名

那么我们可以利用公钥和私钥做什么呢?
首先,鲍勃有两把钥匙,一把是公钥,另一把是私钥。鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。
RSA加密算法及使用公私钥实现数字签名

苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。
RSA加密算法及使用公私钥实现数字签名

鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
RSA加密算法及使用公私钥实现数字签名
鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)。
RSA加密算法及使用公私钥实现数字签名

然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature)。
RSA加密算法及使用公私钥实现数字签名
鲍勃将这个签名,附在信件下面,一起发给苏珊。
RSA加密算法及使用公私钥实现数字签名

苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。
RSA加密算法及使用公私钥实现数字签名
苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。

参考资料(有问题请联系作者):
参考资料来源1

参考资料来源2