-
取模运算mod 取余运算%
-
原根:
- 原根是一种数学符号,设
m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根 (其中φ(m)表示m的欧拉函数)
- 假设一个数
g是P的原根,那么g^i mod P的结果两两不同,且有 1<g<P,0<i<P,归根到底就是g^(P-1) = 1 (mod P)当且仅当指数为P-1的时候成立 (这里P是素数)
- 简单来说,
g^i mod p ≠ g^j mod p (p为素数),其中i≠j且i, j介于1至(p-1)之间,则g为p的原根
- 例:
3^x mod 17 = y,此时3 < 17且17为质数,那么x的取值范围为1~16时,结果y的范围也是1~16且x != y,3即是17的原根
-
欧拉函数 φ
- 互质:如果两个正整数,除了
1以外,没有其他公约数,那么这两个数就为互质关系
- 求小于等于
n且与n互质的数有多少个的函数,称为欧拉函数,表示为φ(n)
- 例如
φ(8) = 4,即1,3,5,7,φ(7) = 6,即1,2,3,4,5,6
-
欧拉函数特点
- 当
n是质数的时候,φ(n) = n - 1
- 如果
n可以分解成两个互质的整数之积,如n = A * B,则:φ(A*B) = φ(A) * φ(B)
- 根据以上两点得到:如果
N是两个质数P1和P2的乘积,则φ(N) = φ(P1) * φ(P2) = (P1 - 1) * (P2 - 1)
-
欧拉定理
- 如果两个正整数
m和n互为质数,那么m的φ(n)次方减1可以被n整除,即m^φ(n) mod n ≡ 1
- 费马小定理:欧拉定理的特殊情况,如果两个正整数
m和n互为质数,且n也为质数,那么φ(n)的结果就是n - 1,即m^(n-1) mod n ≡ 1
-
公式转换
∵ 1^k ≡ 1 1 * m ≡ m
∴ m ^ φ(n) mod n ≡ 1
∴ m ^ k * φ(n) mod n ≡ 1
∴ m ^ k * φ(n) + 1 mod n = m (等号左右两边都乘以m)
-
模反元素
- 如果两个正整数
e和x互质,那么一定可以找到整数d,使得ed - 1被x整除,那么d就是e对于x的模反元素。
e * d mod x ≡ 1
e * d = kx + 1 (ed是x的倍数加1)
m ^ ed mod n ≡ m
- 最终推导出`m ^ ed mod n = m` (见6.公式转换,此时`e`和`φ(n)`互质,`d`是`e`相对于`φ(n)`的模反元素)
- 特性:只要`d`是`e`相对于`φ(n)`的模反元素,那么`m`和`n`可以不是互质关系,只要`m < n`,等式即可成立。
-
迪菲赫尔曼秘钥交换
m ^ ed mod n ≡ m公式继续推演(d是e对φ(n)的模反元素)
- -->
m ^ e mod n = C 即加密,e&n是公钥
- -->
C ^ d mod n = m 即解密,d&n是私钥
- 同理
m ^ d mod n = C C ^ e mod n = m,即e & d既可以加密,也可以解密。
-
终端体验RSA
openssl genrsa -out private.pem 1024 生成长度为1024bit的RSA私钥
openssl rsa -in private.pem -pubout -out public.pem 从私钥中提取公钥
openssl rsa -in private.pem -text -out private.txt 将私钥转成明文进行查看
openssl rsautl -encrypt -in msg.txt -inkey public.pem -pubin -out encrypt.txt 用公钥将msg.txt文件加密为enctypt.txt
openssl rsautl -decrypt -in encrypt.txt -inkey private.pem -out decrypt.txt 用私钥将encrypt.txt解密为decrypt.txt
-
生成证书
openssl req -new -key private.pem -out rsacert.csr 请求csr证书
openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt 用csr请求crt证书
openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt 导出p12证书
openssl x509 -outform der -in rsacert.crt -out rsacert.der 导出der证书
iOS代码实现RSA加密与解密,der证书即为私钥,p12即为公钥