RSA的历史
RSA加密算法是一种非对称加密算法,在互联网领域里被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA的具体原理
RSA主要利用了极大整数的因数分解的难度来保证算法的可靠性。
产生公钥和私钥
- 随便选择两个大的质数$p$和$q$,计算$N=p \cdot q$
- 利用欧拉函数,求得$r=\varphi((N)=\varphi((p) \cdot \varphi((q) = (p-1) \cdot (q-1) $
- 选择一个数$e$,满足$1 < e < r$且$e$与$r$互质,取$e$关于$d$的模逆元$d$,满足$ed \equiv {1 \bmod {r}}$
- 销毁$p$和$p$
现在$(N,e)$是公钥,$(N,d)$是私钥。
加密消息
假设Alice想要给Bob发送一条信息$m$,那么Alice有两步需要做:
- 把$m$按照一定规则转化成非负整数$n$,如果太长可以分几段加密
- 将$n$加密为$c$
然后就可以把$c$发送给Bob了。
解密消息
Bob接受到消息之后,就可以利用密钥$d$来解码
取到$n$之后,就可以按照约定的$m$转换成$n$的规则,倒回去得到$m$。
相关数学知识
RSA的简单实现
1 | ###朴素欧几里得算法 |
1 | ### 拓展欧几里得算法 |
1 | ex_gcb(43,23) |
(-8, 15)
1 | ### 蒙哥马利幂模运算 |
2
1 | # 检测大整数是否是素数,如果是素数,就返回True,否则返回False |
1 | get_prime(1024) |
162678631691829774667522629535073160955825399182602693661545242792106676238539472548234877060876228787484523858207867783251387491999600134388980090439045215608645863076210778718260527620108430686424624076200773582708629154239529895125774945352642184329001660453968578704168280059308704550631900163173081902239
1 | def gen_key(p,q): |
1 | ## 测试整体过程 |
解密成功
密文是14005144118830483850652822657072015923931651283373191007705567320344608498783170654858772312139590781517022245572740058228425238815700795267975461803686242362890194249947123896021635220125683107528036663909234677369590244069330529163467280287893994970335492795549817696086606381221855273000994999391165045098621373956100419478927732414261552853418860553749988881775967955441571219829233196014735356284125413142119509579602440902130879271195998880056144148006467107689489924816408971514890284627704928072054400838999570987152631984324906697106158618432179795774465341559150912656124918370457081515488677503660447595363
明文是1995101219950817