加密算法
对称加密算法
- (1) 甲方选择某一种加密规则,对信息进行加密;
- (2) 乙方使用同一种规则,对信息进行解密。
- (3) 加密和解秘使用同一种规则,对信息进行解谜
这种加密模式有一个最大弱点:甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。
非对称加密算法
- (1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
- (2) 甲方获取乙方的公钥,然后用它对信息加密。
- (3) 乙方得到加密后的信息,用私钥解密。
如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。
- 三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,这种算法用他门三个人的名字命名,叫做RSA算法。
你需要知道的数论知识
- (1) 互质关系
- 如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。
- (2) 欧拉函数
- (3) 欧拉定理
- 如果两个正整数a和n互质,则n的欧拉函数 φ(n)可以让下面的等式成立:
- %7D%5Cequiv%5C1%20(mod%5C%20n)&chs=60)
- 模反元素
- 如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1被n整除,或者说ab被n除的余数是1。
- &chs=40)
- 这时,b就叫做a的”模反元素”。
欧拉函数
- 任意给定正整数
n
,请问在小于等于n
的正整数之中,有多少个数与n
构成互质关系,计算这个值的方法叫做欧拉函数
- 以
φ(n)
表示。- 在1到8之中,与8形成互质关系的是1、3、5、7,所以
φ(8) = 4
。
- 在1到8之中,与8形成互质关系的是1、3、5、7,所以
第一种情况:如果是1
- 如果
n=1
,则φ(1) = 1
。因为1与任何数(包括自身)都构成互质关系。
- 如果
第二种情况:如果是质数
- 如果
n
是质数,则φ(n)=n-1
。 - 因为质数与小于它的每一个数,都构成互质关系。比如
5
与1
、2
、3
、4
都构成互质关系。
- 如果
第三种情况:如果是质数的某一个次方
- 如果
n
是质数的某一个次方,即n = p^k
(p
为质数,k
为大于等于1的整数),则 - %3Dp%5E%7Bk%7D-p%5E%7Bk-1%7D&chs=40)
- 比如 φ(8) = φ(2^3) =2^3 - 2^2 = 8 -4 = 4。
- 这是因为只有当一个数不包含质数
p
,才可能与n互质。而包含质数p
的数一共有p^(k-1)
个,即1×p、2×p、3×p、…、p^(k-1)×p,把它们去除,剩下的就是与n
互质的数。
- 如果
第四种情况:如果n可以分解成两个互质的整数之积
+ 如果n可以分解成两个互质的整数之积
1
n = p1 × p2
+ 则
1
φ(n) = φ(p1p2) = φ(p1)φ(p2)
+ 积的欧拉函数等于各个因子的欧拉函数之积。比如,φ(56)=φ(8×7)=φ(8)×φ(7)=4×6=24。
模反元素
- 如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1,也就是
ab / n = 1
- &chs=40)
- 欧拉定理可以用来证明模反元素必然存在。
- %7D%3Da%5Ctimes%20a%5E%7B%5Cphi(n)-1%7D%5Cequiv%5C%201%5C%20(mod%5C%20n)%20&chs=40)
- 可以看到,a的 φ(n)-1 次方,就是a的模反元素。
- 比如,3和11互质,那么3的模反元素就是4,因为 (3 × 4)-1 可以被11整除。显然,模反元素不止一个, 4加减11的整数倍都是3的模反元素 {…,-18,-7,4,15,26,…},即如果b是a的模反元素,则 b+kn 都是a的模反元素。
- 欧拉定理可以用来证明模反元素必然存在。
RSA数学原理
- RSA加密 密文 = 明文e次方 Mod (就是%取余的意思) N 公钥 (e,N)
- RSA解密 明文 = 密文d次方 Mod (就是%取余的意思) N 私钥 (d,N)
jDK实现
算法 | 密钥长度 | 默认密钥长度 | 工作模式 | 填充方式 |
---|---|---|---|---|
RSA | 512~65536 ( 必须64的倍数 ) |
1024 | ECB | NoPadding(常用)、 PKCS1Padding(常用)、 OAEPWITHMD5AndMGF1Padding |
公钥加密私钥解密
–主要用来加密私钥加密公钥解密
–主要用来数字签名
密钥生成步骤
第一步,随机选择两个不相等的质数p和q。
- 爱丽丝选择了61和53。(实际应用中,这两个质数越大,就越难破解。)
第二步,计算p和q的乘积n。
|
|
第三步,计算n的欧拉函数φ(n)。
- 根据公式
|
|
- 爱丽丝算出φ(3233)等于60×52,即3120。
第四步,随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。
- 爱丽丝就在1到3120之间,随机选择了17。(实际应用中,常常选择65537。)
第五步,计算e对于φ(n)的模反元素d。
- 所谓”模反元素”就是指有一个整数d,可以使得ed被φ(n)除的余数为1。
|
|
- 这个式子等价于
|
|
- 于是,找到模反元素d,实质上就是对下面这个二元一次方程求解。
|
|
- 已知 e=17, φ(n)=3120
|
|
- 这个方程可以用”扩展欧几里得算法”求解,此处省略具体过程。总之,爱丽丝算出一组整数解为 (x,y)=(2753,-15),即 d=2753。
第六步,将n和e封装成公钥,n和d封装成私钥。
- 在爱丽丝的例子中,n=3233,e=17,d=2753,所以公钥就是 (3233,17),私钥就是(3233, 2753)。
实际应用中,公钥和私钥的数据都采用ASN.1格式表达(实例)。
七、RSA算法的可靠性
- 回顾上面的密钥生成步骤,一共出现六个数字:
|
|
- 这六个数字之中,公钥用到了两个(n和e),其余四个数字都是不公开的。其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。
八、加密和解密
(1)加密要用公钥 (n,e)
- 假设鲍勃要向爱丽丝发送加密信息m,他就要用爱丽丝的公钥 (n,e) 对m进行加密。这里需要注意,m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。
所谓”加密”,就是算出下式的c:
1me ≡ c (mod n)
+ 爱丽丝的公钥是 (3233, 17),鲍勃的m假设是65,那么可以算出下面的等式:
1
6517 ≡ 2790 (mod 3233)
+ 于是,c等于2790,鲍勃就把2790发给了爱丽丝。
(2)解密要用私钥(n,d)
爱丽丝拿到鲍勃发来的2790以后,就用自己的私钥(3233, 2753) 进行解密。可以证明,下面的等式一定成立:
1cd ≡ m (mod n)
+ 也就是说,c的d次方除以n的余数为m。现在,c等于2790,私钥是(3233, 2753),那么,爱丽丝算出
1
27902753 ≡ 65 (mod 3233)
+ 因此,爱丽丝知道了鲍勃加密前的原文就是65。
九、私钥解密的证明
最后,我们来证明,为什么用私钥解密,一定可以正确地得到m。也就是证明下面这个式子:
1cd ≡ m (mod n)因为,根据加密规则
1me ≡ c (mod n)于是,c可以写成下面的形式:
1c = me - kn将c代入要我们要证明的那个解密规则:
1(me - kn)d ≡ m (mod n)它等同于求证
1med ≡ m (mod n)由于
1ed ≡ 1 (mod φ(n))所以
1ed = hφ(n)+1将ed代入:
1mhφ(n)+1 ≡ m (mod n)
接下来,分成两种情况证明上面这个式子。
(1)m与n互质。
根据欧拉定理,此时
1mφ(n) ≡ 1 (mod n)得到
1(mφ(n))h × m ≡ m (mod n)原式得到证明。
(2)m与n不是互质关系。
此时,由于n等于质数p和q的乘积,所以m必然等于kp或kq。
以 m = kp为例,考虑到这时k与q必然互质,则根据欧拉定理,下面的式子成立:1(kp)q-1 ≡ 1 (mod q)进一步得到
1[(kp)q-1]h(p-1) × kp ≡ kp (mod q)即
1(kp)ed ≡ kp (mod q)将它改写成下面的等式
1(kp)ed = tq + kp这时t必然能被p整除,即 t=t’p
1(kp)ed = t'pq + kp因为 m=kp,n=pq,所以
1med ≡ m (mod n)原式得到证明。
|
|
加密算法
对称加密算法
- (1) 甲方选择某一种加密规则,对信息进行加密;
- (2) 乙方使用同一种规则,对信息进行解密。
- (3) 加密和解秘使用同一种规则,对信息进行解谜
这种加密模式有一个最大弱点:甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。
非对称加密算法
- (1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
- (2) 甲方获取乙方的公钥,然后用它对信息加密。
- (3) 乙方得到加密后的信息,用私钥解密。
如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。
- 三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,这种算法用他门三个人的名字命名,叫做RSA算法。
你需要知道的数论知识
- (1) 互质关系
- 如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。
- (2) 欧拉函数
- (3) 欧拉定理
- 如果两个正整数a和n互质,则n的欧拉函数 φ(n)可以让下面的等式成立:
- %7D%5Cequiv%5C1%20(mod%5C%20n)&chs=60)
- 模反元素
- 如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1被n整除,或者说ab被n除的余数是1。
- &chs=40)
- 这时,b就叫做a的”模反元素”。
欧拉函数
- 任意给定正整数
n
,请问在小于等于n
的正整数之中,有多少个数与n
构成互质关系,计算这个值的方法叫做欧拉函数
- 以
φ(n)
表示。- 在1到8之中,与8形成互质关系的是1、3、5、7,所以
φ(8) = 4
。
- 在1到8之中,与8形成互质关系的是1、3、5、7,所以
第一种情况:如果是1
- 如果
n=1
,则φ(1) = 1
。因为1与任何数(包括自身)都构成互质关系。
- 如果
第二种情况:如果是质数
- 如果
n
是质数,则φ(n)=n-1
。 - 因为质数与小于它的每一个数,都构成互质关系。比如
5
与1
、2
、3
、4
都构成互质关系。
- 如果
第三种情况:如果是质数的某一个次方
- 如果
n
是质数的某一个次方,即n = p^k
(p
为质数,k
为大于等于1的整数),则 - %3Dp%5E%7Bk%7D-p%5E%7Bk-1%7D&chs=40)
- 比如 φ(8) = φ(2^3) =2^3 - 2^2 = 8 -4 = 4。
- 这是因为只有当一个数不包含质数
p
,才可能与n互质。而包含质数p
的数一共有p^(k-1)
个,即1×p、2×p、3×p、…、p^(k-1)×p,把它们去除,剩下的就是与n
互质的数。
- 如果
第四种情况:如果n可以分解成两个互质的整数之积
如果n可以分解成两个互质的整数之积
1n = p1 × p2
+ 则
1
φ(n) = φ(p1p2) = φ(p1)φ(p2)
+ 积的欧拉函数等于各个因子的欧拉函数之积。比如,φ(56)=φ(8×7)=φ(8)×φ(7)=4×6=24。
模反元素
- 如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1,也就是
ab / n = 1
- &chs=40)
- 欧拉定理可以用来证明模反元素必然存在。
- %7D%3Da%5Ctimes%20a%5E%7B%5Cphi(n)-1%7D%5Cequiv%5C%201%5C%20(mod%5C%20n)%20&chs=40)
- 可以看到,a的 φ(n)-1 次方,就是a的模反元素。
- 比如,3和11互质,那么3的模反元素就是4,因为 (3 × 4)-1 可以被11整除。显然,模反元素不止一个, 4加减11的整数倍都是3的模反元素 {…,-18,-7,4,15,26,…},即如果b是a的模反元素,则 b+kn 都是a的模反元素。
- 欧拉定理可以用来证明模反元素必然存在。
RSA数学原理
- RSA加密 密文 = 明文e次方 Mod (就是%取余的意思) N 公钥 (e,N)
- RSA解密 明文 = 密文d次方 Mod (就是%取余的意思) N 私钥 (d,N)
jDK实现
算法 | 密钥长度 | 默认密钥长度 | 工作模式 | 填充方式 |
---|---|---|---|---|
RSA | 512~65536 ( 必须64的倍数 ) |
1024 | ECB | NoPadding(常用)、 PKCS1Padding(常用)、 OAEPWITHMD5AndMGF1Padding |
公钥加密私钥解密
–主要用来加密私钥加密公钥解密
–主要用来数字签名
密钥生成步骤
第一步,随机选择两个不相等的质数p和q。
- 爱丽丝选择了61和53。(实际应用中,这两个质数越大,就越难破解。)
第二步,计算p和q的乘积n。
|
|
第三步,计算n的欧拉函数φ(n)。
- 根据公式
|
|
- 爱丽丝算出φ(3233)等于60×52,即3120。
第四步,随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。
- 爱丽丝就在1到3120之间,随机选择了17。(实际应用中,常常选择65537。)
第五步,计算e对于φ(n)的模反元素d。
- 所谓”模反元素”就是指有一个整数d,可以使得ed被φ(n)除的余数为1。
|
|
- 这个式子等价于
|
|
- 于是,找到模反元素d,实质上就是对下面这个二元一次方程求解。
|
|
- 已知 e=17, φ(n)=3120
|
|
- 这个方程可以用”扩展欧几里得算法”求解,此处省略具体过程。总之,爱丽丝算出一组整数解为 (x,y)=(2753,-15),即 d=2753。
第六步,将n和e封装成公钥,n和d封装成私钥。
- 在爱丽丝的例子中,n=3233,e=17,d=2753,所以公钥就是 (3233,17),私钥就是(3233, 2753)。
实际应用中,公钥和私钥的数据都采用ASN.1格式表达(实例)。
七、RSA算法的可靠性
- 回顾上面的密钥生成步骤,一共出现六个数字:
|
|
- 这六个数字之中,公钥用到了两个(n和e),其余四个数字都是不公开的。其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。
八、加密和解密
(1)加密要用公钥 (n,e)
- 假设鲍勃要向爱丽丝发送加密信息m,他就要用爱丽丝的公钥 (n,e) 对m进行加密。这里需要注意,m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。
所谓”加密”,就是算出下式的c:
1me ≡ c (mod n)
+ 爱丽丝的公钥是 (3233, 17),鲍勃的m假设是65,那么可以算出下面的等式:
1
6517 ≡ 2790 (mod 3233)
+ 于是,c等于2790,鲍勃就把2790发给了爱丽丝。
(2)解密要用私钥(n,d)
爱丽丝拿到鲍勃发来的2790以后,就用自己的私钥(3233, 2753) 进行解密。可以证明,下面的等式一定成立:
1cd ≡ m (mod n)
+ 也就是说,c的d次方除以n的余数为m。现在,c等于2790,私钥是(3233, 2753),那么,爱丽丝算出
1
27902753 ≡ 65 (mod 3233)
+ 因此,爱丽丝知道了鲍勃加密前的原文就是65。
九、私钥解密的证明
最后,我们来证明,为什么用私钥解密,一定可以正确地得到m。也就是证明下面这个式子:
1cd ≡ m (mod n)因为,根据加密规则
1me ≡ c (mod n)于是,c可以写成下面的形式:
1c = me - kn将c代入要我们要证明的那个解密规则:
1(me - kn)d ≡ m (mod n)它等同于求证
1med ≡ m (mod n)由于
1ed ≡ 1 (mod φ(n))所以
1ed = hφ(n)+1将ed代入:
1mhφ(n)+1 ≡ m (mod n)
接下来,分成两种情况证明上面这个式子。
(1)m与n互质。
根据欧拉定理,此时
1mφ(n) ≡ 1 (mod n)得到
1(mφ(n))h × m ≡ m (mod n)原式得到证明。
(2)m与n不是互质关系。
此时,由于n等于质数p和q的乘积,所以m必然等于kp或kq。
以 m = kp为例,考虑到这时k与q必然互质,则根据欧拉定理,下面的式子成立:1(kp)q-1 ≡ 1 (mod q)进一步得到
1[(kp)q-1]h(p-1) × kp ≡ kp (mod q)即
1(kp)ed ≡ kp (mod q)将它改写成下面的等式
1(kp)ed = tq + kp这时t必然能被p整除,即 t=t’p
1(kp)ed = t'pq + kp因为 m=kp,n=pq,所以
1med ≡ m (mod n)原式得到证明。
|
|
过程中遇到的问题总结
- 加密后的数据需要用Base64将bytes转换成字符串不然会乱码
|
|
- 解密后的数据不需要用Base64将bytes转换成字符串,直接
new String(bytes)
|
|
- RSAUtil.java
|
|
- Base64Util.java
|
|
RSAUtil使用说明
公钥加密 私钥解密
|
|
私钥加密 公钥解密 (签名)
|
|