Skip to content

Instantly share code, notes, and snippets.

@simonid
Last active January 2, 2018 11:26
Show Gist options
  • Save simonid/93cb546df0cbefb2d5e701b716dd5449 to your computer and use it in GitHub Desktop.
Save simonid/93cb546df0cbefb2d5e701b716dd5449 to your computer and use it in GitHub Desktop.
加密与解密

RSA算法加密与解密

加密的算法可以分为两类:对称和非对称。
加密和解密使用相同的密钥就是对称的加密,通信双方都使用一套加密解密的方式,原文通过加密后从一方直接发送的另外一方解密后恢复原文, 这个过程中假如有中间人劫持了加密的内容,然后就可以暴力破解(不过难度很高),那么信息就会被窃取了
AES是一种对称的加密方式
RSA是一种非对称的加密算法。假如A要获取B的信息,过程:

A生成公钥和私钥,自己保留私钥   ->    发送给公钥给B(实际上公钥也就是给公众的,大家都可见)
B拿到A发过来的公钥后用公钥加密  ->    密文  ->  A
A拿到密文后用自己的私钥解密     ->    明文

一般而言,算法的密钥通常是1024位,当然还有更高的

加密的数学原理

互质关系

定义:如果两个正整数,除1外,没有其他公因子,那么这两个数互质
推导:

  1. 任意两个质数互质
  2. 一个数是质数,另外一个数不是质数的倍数,双方互质
  3. 两个数中较大的为质数,那么二者互质
  4. p为大于1的质数,那么p和p-1互质
  5. p为大于1的偶数,那么p和p-2互质

欧拉定理和费马定理可以查看:
RSA算法原理(一)
RSA加密算法一:历史与数学原理
RSA 算法详解

加密和解密的步骤

1.生成公钥

选择两个素数P、Q,假设分别为53和59(实际上是很大的,为了演示选择)
公钥的一部分n=PQ=53*59=3127
3127,转换为二进制就是110000110111,密钥长度12位
公钥的另一部分e为指数,e必须是整数,且n不能被e整除,e必须在1到phi(n)之间,这里我们假设e是3,从这里可以看出公钥的两个部分n和e都是随机定的。

什么是phi
phi(n)=(P-1)(Q-1)=3016

2.生成私钥

私钥d=[2phi(n)+1]/e=(2*3016+1)/3=2011

3.公钥加密明文

假定加密一个数据为“HI”,其中假定根据字母表顺序(当然可以随意),设H=8,I=9, 所以“HI”就是89
密文c=89^e mod n,即c = 89^3 mod 3127 = 1394

4.私钥解密密文

原文=c^d mod n,即1394^2011 mod 3127 = 89
这样就获得了想要的明文了

关于破解

按照上述的过程分析,要破解密文,那么就要知道私钥d的信息
要知道私钥d的信息,就要知道e和phi(n),其中n和e是任何人都知道的,所以难点在phi(n)
要知道phi(n),就要知道P和Q
要知道P和Q,就要对n进行因式分解
所以最终的源头是:因式分解n=P*Q,从而获取私钥d

可是有这么简单吗?
我们加密的时候已知P和Q计算出n是很简单的,但是因式分解很困难,并且只能暴力破解,无穷尽地去运算

不过当量子计算机出现后就成为了可能
1994年数学家Peter Williston Shor提出的Shor’s algorithm:找出一个给定整数N的质因子 破解RSA-2048(2048-bit)的密钥可能需要耗费传统电脑10亿年的时间,而量子计算机只需要100秒就可完成。

参考:
RSA加密算法二:加解密过程与安全性
秀尔算法:破解RSA加密的“不灭神话”

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment