取模(mod)和取余(rem)的区别
取模运算(mod)和取余运算(rem)两个概念有重叠的部分,但又不完全一致。主要区别在于对负整数进行除法运算时操作不同:
取模运算 在计算商值时 商值向 负无穷方向 舍入,即商取小原则
取余运算 在计算商值时 商值向 0方向 舍入,即商靠0原则
取模主要是用于计算机术语中,取余则更多是数学概念
计算步骤
假设有整数 A 和 B,那么取模(或取余)运算可以分为两步进行:
即计算模:A mod B = A - B(A / B),其中(A / B)表示整数商
例子
简述(取模) | 求商值(取模、取余的区别在于求商值方式不同) | 取模过程 | 取模值 |
---|---|---|---|
5 mod 3 = 2 | 5 / 3 = 1.66 商取小原则 商 = 1 | 5 - 3 x 1 = 2 | 2 |
-5 mod 3 = 1 | -5 / 3 = -1.66 商取小原则 商 = -2 | -5 - (3 x -2) = 1 | 1 |
5 mod -3 = -1 | 5 / -3 = -1.66 商取小原则 商 = -2 | 5 - (-3 x -2) = -1 | -1 |
-5 mod -3 = -2 | -5 / -3 = 1.66 商取小原则 商 = 1 | -5 - (-3 x 1) = -2 | -2 |
简述(取余) | 求商值(取模、取余的区别在于求商值方式不同) | 取余过程 | 取余值 |
---|---|---|---|
5 rem 3 = 2 | 5 / 3 = 1.66 商靠0原则 商 = 1 | 5 - 3 x 1 = 2 | 2 |
-5 rem 3 = -2 | -5 / 3 = -1.66 商靠0原则 商 = -1 | -5 - (3 x -1) = - 2 | -2 |
5 rem -3 = 2 | 5 / -3 = -1.66 商靠0原则 商 = -1 | 5 - (-3 x -1) = 2 | 2 |
-5 rem -3 = -2 | -5 / -3 = 1.66 商靠0原则 商 = 1 | -5 - (-3 x 1) = - 2 | -2 |
模的理解
模是指一个计量系统的计数范围:
如时钟,以12个整点为计算范围,则模为 12
计算机也是一个计量机器,模为 32位 或者 64位
32位计算机正常理解 在模 范围内能表达的数 有 [0, 2³²-1]
那么负数该怎么表示呢?
所以出现了补码:也就是 正数 + 负数 正好达到模的溢出阀值 2³²,这也是在计算机中负数是用补码方式表示的原因
关于补码的例子:
在以12为模的时钟中,假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:
在以12为模的系统中,加8 和 减4 效果是一样的;因此凡是减4运算,都可以用加8运算来代替。对 模 而言,8 和 4 互为补数。
实际上在以12为模的系统中:11和1、10和2、9和3、8和4、7和5、6和6 都具有这个特性,都互为补数。
共同的特点是两者相加等于模。
对一个数取模,实质上是获取该数在计量器上产生的溢出的量,该数的值在计量器上表示不出来,计量器上只能表示出该数取模后的结果。
任何有模的计量器,均可化为加减法运算
计算机中取模的应用
取模的本质是:取模的值,必定会落在模的范围内;所以,计算机领域引用该特性,使元素路由算法不超出边界,并有规则地存放
元素路由算法分为以下两步:
如:HashMap、数据库分表、分布式节点路由算法等
注意
不同编程语言中,% 的含义不同:Java 中 % 是取余运算;Python 中 % 是取模运算
设 A mod B = C,A 叫做 被模数,B 叫做 模数,C 叫做模值
5 mod 3 = 2 例子中,5 为被模数,3 为模数,2 为模值
相关数学概念
质数是指在大于 1 的自然数中,除了 1 和 它本身 以外不再有其他因数的自然数。
合数指自然数中除了能被 1 和 本身 整除外,还能被其他数(0除外)整除的数。
唯一分解定律(算术基本定理):每个大于 1 的自然数均可写为质数的积,而且这些质因数按大小排列之后,写法有且仅有一种方式。即任意正整数有且只有一种质因数分解。如果将每个正整数描述为一个带有不同编号的锁,每个编号的锁的独特钥匙,就是其质因数分解。就像任何两个锁的钥匙都不同,任何两个数的质因数分解也不同。
比如:
13 = 13
14 = 2 x 7
15 = 3 x 5
16 = 2 x 2 x 2 x 2
互质自然数是公因数只有 1 的两个自然数,互质整数是公因数只有 1 的两个整数。互质自然数是互质整数的特殊情形。
质数与除自身外的任意正整数互质。
同余:如果两个数 a 和 b 之差能被 m 整除,那么我们就说 a 和 b 对模数 m 同余(a 和 b 关于 m 同余)
对数:一般地, a x = N a^x=N ax=N( a > 0 a > 0 a>0 且 a ≠ 1 a \neq 1 a=1),那么幂指数 x x x 叫做以 a a a 为底 N N N 的对数,记作 log a N \log_a{N} logaN。其中, a a a 叫做对数的底数, N N N 叫做真数。
离散对数难题简介
在整数中,离散对数是一种基于同余运算和原根的一种对数运算
在任何群G(初等群论)中,可为所有整数 k 定义一个幂数为 b x b^x bx,而离散对数 log b a \log_b{a} logba 是指使得 b x b^x bx ≡ a 的整数 k
离散对数在一些特殊情况下可以快速计算,然而,通常没有高效的方法来计算离散对数
公钥密码学中几个重要算法的基础,都是假设寻找离散对数的问题的解时,在仔细选择过的群中,并不存在有效率的求解算法
举个例子,以下是一个典型的离散对数难题:
已知公式: 3 x m o d 17 3^x ~~mod~~ 17 3x mod 17(这里采用质数做模数,3 为17 的一个原根),当 x ∈ ( 0 , 17 ) x \in (0,17) x∈(0,17)时,可以很容易求得 x 在各个情况下的结果
X | 运算 | 结果 |
---|---|---|
x = 1 | 3 1 m o d 17 3^1 ~~mod~~ 17 31 mod 17 | 3 |
x = 2 | 3 2 m o d 17 3^2 ~~mod~~ 17 32 mod 17 | 9 |
x = 3 | 3 3 m o d 17 3^3 ~~mod~~ 17 33 mod 17 | 10 |
x = 4 | 3 4 m o d 17 3^4 ~~mod~~ 17 34 mod 17 | 13 |
x = 5 | 3 5 m o d 17 3^5 ~~mod~~ 17 35 mod 17 | 5 |
x = 6 | 3 6 m o d 17 3^6 ~~mod~~ 17 36 mod 17 | 15 |
x = 7 | 3 7 m o d 17 3^7 ~~mod~~ 17 37 mod 17 | 11 |
x = 8 | 3 8 m o d 17 3^8 ~~mod~~ 17 38 mod 17 | 16 |
x = 9 | 3 9 m o d 17 3^9 ~~mod~~ 17 39 mod 17 | 14 |
x = 10 | 3 10 m o d 17 3^{10} ~~mod~~ 17 310 mod 17 | 8 |
x = 11 | 3 11 m o d 17 3^{11} ~~mod~~ 17 311 mod 17 | 7 |
x = 12 | 3 12 m o d 17 3^{12} ~~mod~~ 17 312 mod 17 | 4 |
x = 13 | 3 13 m o d 17 3^{13} ~~mod~~ 17 313 mod 17 | 12 |
x = 14 | 3 14 m o d 17 3^{14} ~~mod~~ 17 314 mod 17 | 2 |
x = 15 | 3 15 m o d 17 3^{15} ~~mod~~ 17 315 mod 17 | 6 |
x = 16 | 3 16 m o d 17 3^{16} ~~mod~~ 17 316 mod 17 | 1 |
观察上面的表格,已知 3 x m o d 17 3^x ~~mod~~ 17 3x mod 17,当 x ∈ ( 0 , 17 ) x \in (0,17) x∈(0,17) 时,结果会在(0,17)上均匀分布,即结果等可能地出现在 0 和 17 中间的任何整数上
相反地,如果已知: 3 x m o d 17 = 12 3^x ~~mod~~ 17 = 12 3x mod 17=12(这里采用质数做模数,3 为17 的一个原根),要求 x x x 的值,那么我们只能采用试错法,求出匹配的指数
这是一种正算容易,反算困难的数值过程。这有多难呢?如果模数较小,还很容易试出 x x x 的值,但模数若是长达几百位的质数,那么想试出 x x x 的值是不切实际的,即使是借助世界上最强大的计算机,要遍历所有可能情况也需要上千年时间。
离散对数是一种单向函数,单向函数的强度取决于反向过程所需要的时间
离散对数难题的作用
离散对数正算容易,反算困难的特点,可以用于信息的加密和解密。
以上面 3 x m o d 17 = 12 , x = 13 3^x ~~mod~~ 17 = 12, x = 13 3x mod 17=12,x=13 为例:
3 3 3 为原信息, 12 12 12 是加密后的信息, 3 x m o d 17 3^x ~~mod~~ 17 3x mod 17 是一个公开的加密过程, x = 13 x = 13 x=13 为秘钥。在不知道秘钥 x = 13 x = 13 x=13 的情况下,即使知道加密过程 3 x m o d 17 3^x ~~mod~~ 17 3x mod 17,并且截获了加密过的信息 12 12 12,也难以通过反算得到原信息 3 3 3
但是,这里有个问题:信息发送者使用秘钥 x = 13 x = 13 x=13 对信息进行加密,信息接受者也需要知道秘钥 x = 13 x = 13 x=13,才能对信息进行解密,那么如何安全地传输秘钥呢?请看下面的迪菲-赫尔曼秘钥交换。
概述
迪菲-赫尔曼秘钥交换算法是一种建立秘钥的算法,而不是一种加密信息的算法,即迪菲-赫尔曼秘钥交换算法解决的是秘钥安全传输的问题,通讯双方在安全拿到秘钥之后,还需要通过秘钥使用其他加密算法,对通讯的信息进行加密和解密。
迪菲-赫尔曼秘钥交换算法的有效性和安全性依赖于计算离散对数的难度。
举例
举一个现实生活中颜料混合的例子。
写代码的兄弟们注意了,例子里面说的是现实生活中画画颜料的混合,而不是计算机中 RGB 值的加减(因为在计算机中,知道了两种颜色的 RGB,可以很容易地计算出这两种颜色的差值)。
虽然我们很容易:
通过混合 红色颜料R 和 绿色颜料G,得到 黄色颜料Y
通过混合 红色颜料R 和 蓝色颜料B,得到 紫色颜料Z
但是我们很难:
从 黄色颜料Y 中分离出 红色颜料R 和 绿色颜料G
从 紫色颜料Z 中分离出 红色颜料R 和 蓝色颜料B
这个过程就像
我们很容易正算出 3 13 m o d 17 = 12 3^{13} ~~mod~~ 17 = 12 313 mod 17=12
但我们很难反算出 3 x m o d 17 = 12 3^{x} ~~mod~~ 17 = 12 3x mod 17=12
假设有通讯的双方 Alice 和 Bob,他们需要调制一种秘密颜色 并且 不能让窃听者 Eve 知道,于是 Alice 和 Bob 执行了以下步骤:
整个过程看起来有点复杂,我这里理一理:
Alice 的 白色颜料X = (红色颜料R + 蓝色颜料B) + 绿色颜料G
Bob 的 白色颜料X = (红色颜料R + 绿色颜料G) + 蓝色颜料B
迪菲-赫尔曼秘钥交换算法的数学描述
参考上面的公式: 3 x m o d 17 3^x ~~mod~~ 17 3x mod 17, x ∈ ( 0 , 17 ) x \in (0,17) x∈(0,17)
定义如下离散对数:
那么数值
a 1 m o d p a^1 ~~mod~~ p a1 mod p 、 a 2 m o d p a^2 ~~mod~~ p a2 mod p 、… … 、 a 16 m o d p a^{16} ~~mod~~ p a16 mod p
是各不相同的整数,并且以某种排列方式组成了从 1 1 1 到 p − 1 p - 1 p−1 的所有整数
对于一个整数 b b b 和 质数 p p p 的一个原根 a a a,可以找到惟一的指数 i i i,使得
b = a i m o d p , i ∈ [ 1 , p − 1 ] , b ∈ [ 1 , p − 1 ] , b = a^i ~~mod~~ p~,~~i \in [1,p - 1],~~b \in [1,p - 1], b=ai mod p , i∈[1,p−1], b∈[1,p−1],
称指数 i i i 为 b b b 的以 a a a 为基数的模 p p p 的离散对数
基于此背景知识,迪菲-赫尔曼秘密钥交换算法的数学描述如下:
定义两个全局公开的参数,一个质数 p p p 和 一个整数 a a a, a a a 是 p p p 的一个原根
当 Alice 和 Bob 需要建立一个秘钥时
Alice 选择一个作为私有密钥的随机数 X a X_a Xa,并计算公开秘钥 Y a = a X a m o d p Y_a = a^{X_a}~~mod~~p~~ Ya=aXa mod p 。
Alice 对 X a X_a Xa 的值保密存放并使得 Y a Y_a Ya 能被 Bob 公开获得。
类似地,Bob 选择一个作为私有密钥的随机数 X b X_b Xb,并计算公开秘钥 Y b = a X b m o d p Y_b = a^{X_b}~~mod~~p~~ Yb=aXb mod p 。
Bob 对 X b X_b Xb 的值保密存放并使得 Y b Y_b Yb 能被 Alice 公开获得。
Alice 产生共享秘密密钥的计算方式是 K = Y b X a m o d p K={Y_b}^{X_a}~~mod~~ p~~ K=YbXa mod p 。
同样地,Bob 产生共享秘密密钥的计算方式是 K = Y a X b m o d p K={Y_a}^{X_b}~~mod~~ p~~ K=YaXb mod p 。
这两个计算产生相同的结果:
K = Y b X a m o d p K={Y_b}^{X_a}~~mod~~p~~~~~~~~~~~~~~~~~~~~~ K=YbXa mod p // 这里是 Alice 秘钥的计算方式
= ( a X b m o d p ) X a m o d p ~~~~~=({a}^{X_b}~~mod~~p)^{X_a}~~mod~~p =(aXb mod p)Xa mod p
= ( a X b ) X a m o d p ~~~~~=({a}^{X_b})^{X_a}~~mod~~p =(aXb)Xa mod p
= a X b X a m o d p ~~~~~={a}^{X_bX_a}~~mod~~p =aXbXa mod p
= ( a X a ) X b m o d p ~~~~~=({a}^{X_a})^{X_b}~~mod~~p =(aXa)Xb mod p
= ( a X a m o d p ) X b m o d p ~~~~~=({a}^{X_a}~~mod~~p)^{X_b}~~mod~~p =(aXa mod p)Xb mod p
= Y a X b m o d p ~~~~~={Y_a}^{X_b}~~mod~~p~~~~~~~~~~~~~~~~~~~~~ =YaXb mod p // 这里是 Bob 秘钥的计算方式
因为 X a X_a Xa 和 X b X_b Xb 是保密的,窃听者 Eve 可以利用的参数只有 p p p、 a a a 、 Y a Y_a Ya 、 Y b Y_b~~ Yb 。因而窃取者 Eve 被迫计算离散对数来确定秘钥。例如,要获取 Bob 的秘钥 X b X_b Xb,窃听者 Eve 必须先计算
X b i n d a , p Y b {X_b}~ind~a~,~p^{Y_b} Xb ind a , pYb
然后再采用与 Bob 同样的方法计算公共秘钥 K K~~ K 。
迪菲-赫尔曼秘钥交换算法的优缺点
优点:
缺点:
它是计算密集性的,因此容易遭受阻塞性攻击,即对手请求大量的密钥。受攻击者花费了相对多的计算资源来求解无用的幂系数而不是在做真正的工作。
容易遭受中间人攻击。窃听者 Eve 在和 Alice 通信时扮演 Bob;在和 Bob 通信时扮演 Alice。Alice 和 Bob 都与窃听者 Eve 协商了一个密钥,然后窃听者 Eve 就可以监听和传递通信信息。中间人的攻击按如下进行:
当互相通讯的用户变多的时候,共享秘钥会变得难以管理。例如,如果 Alice 需要和很多人通讯:Bob,Claire,Duck,Ella,…,那么 Alice 跟 Bob 通讯需要生成 共享秘钥 K 1 K_1 K1,Alice 跟 Claire 通讯需要生成 共享秘钥 K 2 K_2 K2,Alice 跟 Duck 通讯需要生成 共享秘钥 K 3 K_3 K3,…
欧拉函数
对于一个正整数 x x x,小于 x x x 且和 x x x 互质的正整数的个数,记做 φ ( x ) φ(x) φ(x)。其中 φ ( 1 ) φ(1) φ(1)被定义为 1 1 1。
欧拉函数重要性质:
补充:
欧拉定理
若 m m m, n n n 为正整数,且 m m m, n n n 互质,则有:
m φ ( n ) ≡ 1 m o d n m^{φ(n)}\equiv1~~mod~~n~~~~ mφ(n)≡1 mod n 或者 m φ ( n ) m o d n ≡ 1 ~~~~m^{φ(n)}~~mod~~n\equiv1 mφ(n) mod n≡1
欧拉定理的重要性质:
模反元素
如果两个正整数 e e e 和 φ ( n ) φ(n) φ(n) 互质,那么一定可以找到整数 d d d,使得 e d − 1 ed - 1 ed−1 被 φ ( n ) φ(n) φ(n) 整除,或者说 e d ed ed 被 φ ( n ) φ(n) φ(n) 除的余数是 1 1 1。这时, d d d 就叫做 e e e 关于 φ ( n ) φ(n) φ(n) 的 模反元素:
e d m o d φ ( n ) ≡ 1 ed~~ mod~~φ(n)~~\equiv1~~~ ed mod φ(n) ≡1 或者 e d − 1 m o d φ ( n ) ≡ 0 ~~~ed - 1~~ mod~~φ(n)~~\equiv0 ed−1 mod φ(n) ≡0
欧拉定理可以用来证明模反元素必然存在
RSA 非对称加密算法简介
RSA 加密算法是一种非对称加密算法。在公开密钥加密和电子商业中 RSA 被广泛使用。RSA 是1977 年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。
有趣的是,1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相同的算法,但他的发现被列入机密,一直到1997年才被发表。
RSA 非对称加密算法中离散对数难题的应用
回顾前面的 迪菲赫尔曼秘钥交换算法,其核心思想是使用单向函数对公开秘钥进行加密(离散对数就是一种典型的单向函数):
m e m o d n = c , e ∈ [ 1 , n − 1 ] , 其 中 模 数 n 为 质 数 , m 为 n 的 一 个 原 根 m^e~~mod~~ n~=~c~,~~e \in [1,n - 1]~,其中模数~n~为质数,m~为~n~的一个原根 me mod n = c , e∈[1,n−1] ,其中模数 n 为质数,m 为 n 的一个原根
在已知 m m m、 n n n、 c c c 的情况下,求解指数 e e e 只能采取试错法,求解指数 e e e 的过程构成单向函数。
同样地, m e m o d n = c m^e~~mod~~ n~=~c~ me mod n = c 中,已知 e e e、 n n n、 c c c ,求解底数 m m m ,也只能采取试错法。即求解底数 m m m 的过程,同样构成单向函数。
迪菲赫尔曼秘钥交换算法 利用离散对数难题:
m e m o d n = c , e ∈ [ 1 , n − 1 ] , 其 中 模 数 n 为 质 数 , m 为 n 的 一 个 原 根 m^e~~mod~~ n~=~c~,~~e \in [1,n - 1]~,其中模数~n~为质数,m~为~n~的一个原根 me mod n = c , e∈[1,n−1] ,其中模数 n 为质数,m 为 n 的一个原根
求解指数 e e e 的过程构成单向函数
RSA非对称加密算法 利用离散对数难题:
m e m o d n = c m^e~~mod~~ n~=~c~ me mod n = c
求解底数 m m m 的过程构成单向函数
虽然 RSA非对称加密算法 和 迪菲赫尔曼秘钥交换算法 都是利用离散对数难题构成单向函数,但是两者使用离散对数难题的方式是不同的。
RSA 非对称加密算法的数学描述
下面公式中,用到的英文字母所代表的含义:
m:message,明文
c:ciphertext,密文
e:encryption,加密
d:decryption,解密
n:number,数字(这里代表的是两个大质数相乘所得的合数)
考虑下面两个等式:
① m e m o d n ≡ c ~~m^e~~mod~~ n~\equiv~c~ me mod n ≡ c
② c d m o d n ≡ m ~~c^d~~mod~~ n~\equiv~m~ cd mod n ≡ m
假设存在正整数 e e e、 d d d、 n n n 使得 等式① 和 等式② 同时成立,那么可以:
这样做的优点在于:
综上所述,通过
① m e m o d n ≡ c ~~m^e~~mod~~ n~\equiv~c~ me mod n ≡ c
② c d m o d n ≡ m ~~c^d~~mod~~ n~\equiv~m~ cd mod n ≡ m
进行通讯过程的加密和解密,有诸多优点。
关键点在于找到合适且安全的 e e e、 d d d、 n n n,使得上述等式成立。
为了使 e e e、 d d d、 n n n 之间的关系变得更加明确,我们对 等式② 进行变形得到 等式③:
c d m o d n ≡ m ~~~~~~c^d~~mod~~ n~\equiv~m~ cd mod n ≡ m
( m e m o d n ) d m o d n ≡ m ~~~~~~(m^e~~mod~~n)^d~~mod~~ n~\equiv~m~ (me mod n)d mod n ≡ m
m e d m o d n ≡ m ~~~~~~m^{ed}~~mod~~ n~\equiv~m~ med mod n ≡ m
③ m e d ≡ m m o d n ~~m^{ed}\equiv~m~~mod~~ n~ med≡ m mod n
接下来,我们对欧拉定理进行变形得到 等式④:
若 m m m, n n n 为正整数,且 m m m, n n n 互质,则有
m φ ( n ) ≡ 1 m o d n ~~~~~~m^{φ(n)}\equiv1~~mod~~n mφ(n)≡1 mod n
( m φ ( n ) ) k ≡ ( 1 m o d n ) k ~~~~~~{(m^{φ(n)})}^k\equiv{(1~~mod~~n)}^k (mφ(n))k≡(1 mod n)k
m k φ ( n ) ≡ 1 m o d n ~~~~~~m^{kφ(n)}\equiv1~~mod~~n mkφ(n)≡1 mod n
m k φ ( n ) × m ≡ 1 × m m o d n ~~~~~~m^{kφ(n)}~\times~m\equiv1~\times~m~~mod~~n mkφ(n) × m≡1 × m mod n
④ m k φ ( n ) + 1 ≡ m m o d n ~~m^{kφ(n)+1}\equiv~m~~mod~~n mkφ(n)+1≡ m mod n
对比 等式③ 和 等式④:
③ m e d ≡ m m o d n ~~m^{ed}\equiv~m~~mod~~ n~ med≡ m mod n
④ m k φ ( n ) + 1 ≡ m m o d n ~~m^{kφ(n)+1}\equiv~m~~mod~~n~~~ mkφ(n)+1≡ m mod n ( m m m, n n n 为正整数,且 m m m, n n n 互质)
我们发现:
在 m m m 和 n n n 为正整数且互质的前提下,只要让 e d ≡ k φ ( n ) + 1 ed\equiv~kφ(n)+1 ed≡ kφ(n)+1,等式③ m e d ≡ m m o d n ~~m^{ed}\equiv~m~~mod~~ n~ med≡ m mod n ,便会成立。即,在 m m m 和 n n n 互质的前提下,只要 e e e、 d d d、 n n n 满足: e d ≡ k φ ( n ) + 1 ed\equiv~kφ(n)+1 ed≡ kφ(n)+1,等式① 和 等式② 就会同时成立,此时,使用 等式①对 m m m 进行加密 、使用 等式② 对 c c c 进行解密,就是可行的。
先别高兴,这里还存在两个问题:
问题到这里,似乎陷入了死胡同,除非存在这么一种情况:存在一个条件,我们通过这个条件,很容易能算出 φ ( n ) φ(n) φ(n),不知道这个条件的人,很难算出 φ ( n ) φ(n) φ(n),只要我们把这个条件掌握在手里,不对外公布, φ ( n ) φ(n) φ(n) 就是安全的。
接下来,我们看欧拉函数的两个重要性质:
于是,我们取两个上百位的大质数 P 1 P_1 P1 和 P 2 P_2 P2,令 n = P 1 × P 2 n=P_1~\times~P_2 n=P1 × P2,则有:
φ ( n ) = φ ( P 1 P 2 ) = φ ( P 1 ) φ ( P 2 ) = ( P 1 − 1 ) ( P 2 − 1 ) φ(n)=φ(P_1P_2)=φ(P_1)φ(P_2)=(P_1-1)(P_2-1) φ(n)=φ(P1P2)=φ(P1)φ(P2)=(P1−1)(P2−1)
我们可以很容易地通过 P 1 P_1 P1 和 P 2 P_2 P2 求得 n n n 和 φ ( n ) φ(n) φ(n)。但是如果要将 n n n 因式分解为两个大质数 P 1 P_1 P1 和 P 2 P_2 P2,只能采取试错法进行枚举。即,大整数的质因数分解,构成一个单向函数。
上面对于 RSA 非对称加密算法的数学描述总体上已经完成,但是这里有个细节,需要注意:
我们在推导 e e e、 d d d、 n n n 关系的过程中用到了 欧拉定理
而使用 欧拉定理 的前提是: m m m 和 n n n 为正整数且互质
又因为 n = P 1 × P 2 n=P_1~\times~P_2 n=P1 × P2
所以 m m m 和 P 1 × P 2 P_1~\times~P_2 P1 × P2 也需要互质
因为 m m m 是通讯过程中产生的消息,所以不能对 m m m 的取值做过多的限定
为了抵消 欧拉定理 对于 m m m 取值的限制,需要 e e e、 d d d、 φ ( n ) φ(n) φ(n) 存在模反关系
更具体地,需要满足 d d d 为 e e e 关于 φ ( n ) φ(n) φ(n) 的模反元素,即:
e d m o d φ ( n ) ≡ 1 ed~~mod~~φ(n)\equiv1 ed mod φ(n)≡1
在对 e e e、 d d d、 φ ( n ) φ(n) φ(n) 添加模反元素的约束后,欧拉定理 对于 m m m 和 n n n 互质的限制得到抵消。此时,只需要满足下面的两个条件,RSA 非对称加密算法就成立:
由条件 1 可以看出,RSA 不适用于加密过长的消息
RSA 非对称加密算法举例
上面 RSA 非对称加密算法的数学描述比较抽象,这里举个实例进行说明。
还是以上面 Alice 和 Bob 进行通讯,窃听者 Eve 进行窃听为情景:
Alice 生成公钥和私钥的过程:
Bob 加密数据的过程:
Alice 解析 Bob 发送过来的密文的过程:
窃听者 Eve 能获取到的数据有:
RSA 非对称加密算法总结