加密算法介绍及应用--RSA算法
Android系列文章
本博客将围绕Android Security展开,介绍APP/Framework/BSP相关基础知识,博主比较懒但会认真保证质量
Android四大组件–Activity启动与停止
Android四大组件–Broadcast介绍
Android四大组件–服务
加密算法介绍及应用–RSA算法
一、前言
看过谍战片的都知道密码本的重要性,如果敌方拿到了密码本,己方的电报内容都会被敌方获知,再无秘密可言。密码本就是一种加密的方式,比如我们组织内部约定,密码本就是202401版本的新华字典(我随便举例的,不一定真有哈),加密的过程就是查阅密码本,用页码、行数、列数代表一个字,比如要将"药品"两个字加密,在字典中"药"字出现在第100叶第9行的第21个字,药字就用1000921表示,这就是利用密码本进行加密的简单应用。因为电报信息各方都可以接收到,只要有密码本就很容易解密出来,密码本就是我们要讲的秘钥。如果密码本在我们不知道的情况下被复制了,那以后的信息就全部暴露了,所以我们可以约定,每个月更换一次密码本,这就是秘钥更新。
加解密流程如下:
在
Android/Linux
系统中,加密技术被用于如保护磁盘数据、音视频版权、认证支付、屏保/PIN等诸多场景,一般根据加密和解密两方使用的秘钥是否相同,可以分为对称加密
和非对称加密
,对称加密就是加解密使用相同的秘钥,AES
加密算法就是最常见的对称加密算法;非对称加密就是加解密使用不同的秘钥,RSA
加密算法就是最常见的非对称加密算法。本文将介绍RSA加密算法的原理、应用等。
二、RSA加密算法介绍
RSA算法安全性高,但是效率低,对加密的内容长度有限制,一般用在混合加密的场景下加密别的秘钥,比如使用AES加密算法加密明文,使用RSA算法加密AES秘钥。本篇将介绍RSA算法,后面我会再写一篇介绍AES算法。
1.RSA加密算法中的数学概念
1.1 质数/素数
质数也称为素数,是指只能被1和它本身整除的数字,比如2、3、5、7、11、13、17…
与质数相对的就是合数,如4、6、8、9、10、12、14、15、16…
1是个特殊的数字,既不是质数,也不是合数。任意两个质数都没有除了1以外的公约数,称为互质
。
1.2 欧拉函数
欧拉函数ψ(n)
就是给定一个数n,在小于等于n的正整数中与n互质的数的数目。
比如,给定数字15,小于等于15的正整数中与15互质的数有:1、2、4、7、8、11、13、14,记作ψ(15)=8
欧拉函数的计算方法:素数分解法
对于一个正整数n的素数幂分解P1 P2 Pn为素数,K1 K2 Kn为各素数的幂。
例如,求小于20的数中与20互质的数的数目:
ψ(20) = 4 * 5
= 2^2 * 5 //素数幂分解
= 20 * (1 - 1/2) * (1 - 1/5)
= 8
与20互质的数有:1、3、7、9、11、13、17、19,总共8个。
特别的,如果数n能被分解为两个素数的乘积p*q,可以推到出ψ(n) = (p - 1) (q - 1)
ψ(n) = p * q
= p^1 * q^1
= (p * q) * (1 - 1/p) * (1 - 1/q)
= p * q * ((p - 1)/p) * ((q - 1)/q)
= (p - 1) * (q - 1)
例如,ψ(15) = 3 * 5 = (3 - 1) * (5 - 1) = 8。可见,如果n能被拆解为两个素数的乘积,可以很快求解,这在RSA算法中非常实用。
1.3 欧几里得算法
欧几里得算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。
两个数的最大公约数是指能同时被这两个数整除的最大的那个约数,例如24和18能同时被2、3、6整除,6就是24和18的最大公约数。
对于两个正整数a和b(假设a>b),求解他们的最大公约数算法步骤如下:
//1.将a和b写成除数、商、余数的关系表达式
a = b * k + r; //k是a除以b的商,r是余数
//2.用b取代a,r取代b,继续写成除数、商、余数的关系
b = r * j + r1
//循环第2步,直到余数为0,此时的除数就是最大公约数
例如计算24和18的最大公约数:
//1.将24和18写成除数、商、余数的关系表达式
24 = 18 * 1 + 6
//2.用b取代a(18取代24),r取代b(6取代18),继续写成除数、商、余数的关系
18 = 6 * 3 + 0
//此时余数为0,除数6就是最大公约数
1.4 扩展欧几里得算法
如果a和b的最大公约数为n,求解一组x和y,满足a * x + b * y = n
求解x、y的算法步骤如下:
//a和b是已知的两个正整数,为了求解x和y满足ax+by=n,需要使用系数x1,x2,y1,y2,初始值为x1=0,x2=1,y1=1,y2=0
//1.将a和b写成除数、商、余数的关系表达式
a = b * k + r; //k是a除以b的商,r是余数
//2.重新计算x和y,
// x = x2 - k * x1
// y = y2 - k * y1
//然后将上面计算出的x和y赋值给x1和y1, 将x1和y1之前的值(也就是0,1)赋值给x2,y2
//重复1,2步,直到余数为0,此时的x2,y2就是我们求解的x,y
例如指定a=8,b=3,a和b的最大公约数我们一眼就可以看出来是1,求解一组x和y,满足8x+3y=1;很明显这时二元一次方程,没有唯一解,使用欧几里得扩展算法计算如下:
8x + 3y = 1;
//初始值
a = 8;
b = 3;
x1 = 0;
x2 = 1;
y1 = 1;
y2 = 0;
//第一次循环:
a = b * k + r;
8 = 3 * 2 + 2; k = 2, r = 2
a = 3;
b = 2;
x = x2 -k * x1 = 1 - 2 * 0 = 1;
y = y2 - k * y1 = 0 - 2 * 1 = -2;
y2 = 1;
x2 = 0;
//第二次循环:
3 = 2 * 1 + 1; k = 1, r = 1
a = 2;
b = 1;
x = x2 -k * x1 = 0 - 1 * 1 = -1
y = y2 - k * y1 = 1 - 1 * (-2) = 3;
y2 = -2;
x2 = 1;
//第三次循环:
2 = 1 * 2 + 0; k = 2, r = 0
//余数为0,所以这是最后一次循环,除数1就是8和3的最大公约数
a = 1;
b = 0;
x = x2 -k * x1 = 1 - 2 * (-1) = 3;
y = y2 - k * y1 = -2 - 2 * 3 = -8
x2 = -1;
y2 = 3;
由此可以,x=-1, y=3,满足8*(-1) + 3*3=1;
1.5 模运算
模运算是指计算整数除法的余数,比如a模b就是a除以b的余数,数学表达式为a mod b
。如果两个数a和b分别除以n所得的余数相同,我们称之为a和b在模n下同余,记作a ≡ b (mod n)
比如:
12 mod 7 = 1
22 mod 6 = 4
34 mod 6 = 4
//34和22在模6下同余
34 ≡ 22 (mod 6)
模逆元在求解后面的同余方程时非常