zoukankan      html  css  js  c++  java
  • RSA加密算法原理

    公钥和私钥的产生

    假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个私钥

    1. 随意选择两个大的质数pqp不等于q,计算N=pq
    2. 根据欧拉函数,不大于N且与N互质的整数个数为N=(p-1)(q-1)
    3. 选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)
    4. 用以下这个公式计算dd× e ≡ 1 (mod N)
    5. pq的记录销毁。

    (N,e)是公钥,(N,d)是私钥。(N,d)是秘密的。Alice将她的公钥(N,e)传给Bob,而将她的私钥(N,d)藏起来。

    加密消息

    假设Bob想给Alice送一个消息m,他知道Alice产生的Ne。他使用起先与Alice约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。用下面这个公式他可以将n加密为c

     n^e \equiv c\ (\mathrm{mod}\ N)

    计算c并不复杂。Bob算出c后就可以将它传递给Alice。

    解密消息

    Alice得到Bob的消息c后就可以利用她的密钥d来解码。她可以用以下这个公式来将c转换为n

     c^d \equiv n\ (\mathrm{mod}\ N)

    得到n后,她可以将原来的信息m重新复原。

    解码的原理是

     c^d \equiv n^{e \cdot d}\ (\mathrm{mod}\ N)

    以及ed ≡ 1 (mod p-1)和ed ≡ 1 (mod q-1)。由费马小定理可证明(因为pq是质数)

     n^{e \cdot d} \equiv n\ (\mathrm{mod}\ p)      和      n^{e \cdot d} \equiv n\ (\mathrm{mod}\ q)

    这说明(因为pq不同的质数,所以pq互质)

     n^{e \cdot d} \equiv n\ (\mathrm{mod}\ pq)

    安全

    假设偷听者乙获得了甲的公钥Ne以及丙的加密消息c,但她无法直接获得甲的密钥d。要获得d,最简单的方法是将N分解为pq,这样她可以得到同余方程d× e≡ 1 (mod (p-1)(q-1))并解出d,然后代入解密公式

     c^d \equiv n\ (\mathrm{mod}\ N)

    导出n(破密)。但至今为止还没有人找到一个多项式时间的算法来分解一个大的整数的因子,同时也还没有人能够证明这种算法不存在(见因数分解)。

    至今为止也没有人能够证明对N进行因数分解是唯一的从c导出n的方法,但今天还没有找到比它更简单的方法。(至少没有公开的方法。)

    因此今天一般认为只要N足够大,那么黑客就没有办法了。

    假如N的长度小于或等于256位,那么用一台个人电脑在几个小时内就可以分解它的因子了。1999年,数百台电脑合作分解了一个512位长的N。今天对N的要求是它至少要1024位长。

    1994年彼得·秀尔(Peter Shor)证明一台量子计算机可以在多项式时间内进行因数分解。假如量子计算机有朝一日可以成为一种可行的技术的话,那么秀尔的算法可以淘汰RSA和相关的衍生算法。(即依赖于分解大整数困难性的加密算法)

    假如有人能够找到一种有效的分解大整数的算法的话,或者假如量子计算机可行的话,那么在解密和制造更长的钥匙之间就会展开一场竞争。但从原理上来说RSA在这种情况下是不可靠的。

     

    摘自维基百科
  • 相关阅读:
    笔记04_正确使用Heterogeneous元件
    java网络通信:伪异步I/O编程(PIO)
    java网络通信:异步非阻塞I/O (NIO)
    lua源码学习篇二:语法分析
    lua源码学习篇三:赋值表达式解析的流程
    java网络通信:netty
    lua源码学习篇一:环境部署
    lua源码学习篇四:字节码指令
    java网络通信:同步阻塞式I/O模型(BIO)
    前端项目开发流程
  • 原文地址:https://www.cnblogs.com/xddy/p/2193263.html
Copyright © 2011-2022 走看看