前言:
为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。
前期调试 RSA 算法相关的操作,一直想写个扫盲文章,记录一下相关的概念和操作流程。本文大多参考网上的内容,仅以了解的思路整理成文,对 RSA 算法有一个初步的认识。
1. 概述
RSA 加密算法是一种非对称加密算法,RSA 非对称加密存在大量的取模运算,加密速度慢,在实际应用中结合对称加密算法一起使用,RSA 对对称加密的私钥进行加密。RSA 算法的可靠性由对极大整数做因数分解的难度决定。
2. 算法参数
参数 | 解释 | 备注 |
---|---|---|
M | 明文 | |
C | 密文 | |
N | 模数,两个很大的质数的乘积 | |
E | 公钥指数 | |
D | 私钥指数 | D 是 E 对于 φ(n) 的模反元素 |
p,q | 两个比较大的质数 | |
(E,N) | 公钥 | |
(D,N) | 私钥 | |
(E,D,N) | 密钥对 | |
p q dp dq qinv | CRT模式的私钥 | p、q 为两个大素数。RSA1024 算法,二者长度均为 1024/2 = 512bit = 64byte,dp、dq 两个参数长度也和P、Q长度相等。n =p * q长度为 1024 bit(128byte),d 为私钥参数;e 为公钥指数(一般使用 65537 - 0x010001) |
3. 加密
RSA 加密是对明文的 E 次方后除以 N 后求余数的过程,有了 E和 N 就可以完成 RSA 加密,E、N 是 RSA 加密的密钥,即 E 和 N 的组合为公钥。
4. 解密
对密文进行 D 次方后除以 N 的余数就是明文,即 RSA 解密过程。D和 N 就能进行解密,D 和 N 的组合为私钥。
5. 欧拉函数与模反元素
5.1 欧拉函数
任意给定正整数 n,计算在小于等于 n 的正整数之中,有多少个与 n 构成互质关系?计算这个值的方法就叫做欧拉函数,以 φ(n) 表示。
若一个数 n 可以分解为两个质数 p 和 q 的乘积,则有:
eg:在1~8 中,与 8 构成互质数的有:1、3、5、7,即 φ(8) = 4。
5.2 模反元素
6. 计算过程
6.1 N 值
假设 p =61,q = 53; n = 3233。
两个比较大质数 p,q 的乘积为 N。
6.2 φ(n) 值
根据 φ(n) = (p-1) * (q-1) 代入计算n的欧拉函数值。
φ(3233) = (61-1) × (53-1) = 60 × 52 = 3120
6.3 e 值
在 1 < e < φ(n) 之间,随机选择一个整数 e,且 e 与 φ(n) 互质,选择 e = 17。
6.4 e 对于 φ(n) 的模反元素 d
因为 e 与 φ(n) 互质,根据求模反元素的公式计算 e,对于 e 的模反元素 d 有:
ed ≡ 1 (mod φ(n)) 等价于 (ed - 1) / φ(n) = k(k为任意正整数)
ed - kφ(n) = 1
代入数据得:
17d - 3120k = 1 对这个不定方程求解(扩展欧几里得算法)得:
其中一组解为:(d, k)=(2753, 15)
至此,我们就得到了 RSA 的三个参量,即 n = 3233,e = 17,d = 2753。所以公钥为(3233,17);私钥为(3233,2753)。而我们所说的 RSA1024,2048 就是指密钥对的长度(n的长度)。本例,长度就是 3233 = 1100 1010 0001,即为 12 位。
6.5 加解密过程
(1)明文 m = 65;
(2)公钥 (n, e) = (3233, 17)
(3)加密 c = (m^e mod n) = ( (65 ^17) mod 3233) = 2790
(4)私钥 (n, d) = (3233, 2753)
(5)解密 m = (c^d mod n) = ((2790 ^2753) mod 3233) = 65
由上述过程可知,只要私钥不泄露,密文正常渠道是无法破解的,秘钥长度越长,破解的难度越大。