zoukankan      html  css  js  c++  java
  • RSA的加解密原理

    欢迎转载,但请指明出处:https://www.cnblogs.com/zhizaixingzou/p/10241100.html

    RSA算法是三位数学家Rivest、Shamir和Adleman于1977年设计出来的,关于RSA算法的原理有文章已讲得很清晰,请见:

    http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

    http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

    1)生成密钥对的过程

    随机选择两个不相等的质数p和q。

    n=p*q。n的二进制表示的位数即密钥长度。

    φ(n)= φ(p)* φ(q)=(p-1)*(q-1)。此等式源自于两个数论规律,其一互质的两个数的积的欧拉函数值等于两个数的欧拉函数值的积,其二质数的欧拉函数值比该质数少1。

    随机选择一个整数e,满足1< e < φ(n),且e与φ(n) 互质。

    找到一个整数的,满足ed ≡ 1 (mod φ(n))。

    (n, e)即为公钥,(n, d)即为私钥。

    2)加解密的过程

    假设加密使用公钥。发送方握有的公钥是(n, e),要加密的是整数m。m必须小于n。

    通过me ≡ c (mod n)得到的整数c就是密文。

    接收方握有的私钥是(n, d),他或她接收到了整数c。

    通过cd ≡ m (mod n)得到的整数m就是发送方实际发送的明文。

    加密实际上是针对小于n的整数来的,这是前提。

    但如果n是1024位(128字节),那么m也可以足够大,通常可以选择64字节表示。也正因为如此,一段长消息,我们将它编码为字节数组,然后每64字节成为一个整数,逐个整数加密,得到的密文整数也为固定个数的字节来表示,解密就按此固定字节数逐个完成后在拼接。

    另外,之所以这样加解密是成立的,在于me ≡ c (mod n)和cd ≡ m (mod n)互为充分必要条件,即互相可以推到出。显然,反过来使用私钥加密、公钥解密也是成立的,它们的形式也具有完美的对称性。

    3)算法的安全性

    密钥对生成的过程中共出现5个数字p、q、n、e和d,它的安全性在于对d的保密:

    ed ≡ 1 (mod φ(n))。要得到d,需要知道φ(n)。

    φ(n)=(p-1)(q-1)。要得到φ(n),需要知道p和q。

    n=pq。要得到p和q,需要对n进行质因数分解。

    通过这个过程,提示我们要做到三点:

    其一,妥善保管秘钥,只能自己知道。

    其二,对极大整数的质因数分解是足够难的,这个依赖于数学规律的不被发现。而我们要做或者说能做的是满足这个前提,即选取的p和q应该足够大。

    其三,在数学规律不被发现的情况下,也可以通过暴力破解(也就是指定n,不断假设p,到q是整数且与p互质),为了增加破解的难度,也要求n=p*q足够大。

    总之,该算法被证明非常可靠,而且密钥越长则越难破解,常用1024位,更高等级的安全性要求中则使用2048位。

  • 相关阅读:
    van Emda Boas
    斐波那契堆
    NTT
    FFT
    KDTree
    扩展kmp
    kmp
    Dancing Links
    树的prufer编码
    有向图最小路径覆盖
  • 原文地址:https://www.cnblogs.com/zhizaixingzou/p/10241100.html
Copyright © 2011-2022 走看看