群
群的定义和性质
一个群是一个 有序对 (G,∗), 其中 G 是一个非空集合,∗ 是定义在 G 上的二元运算。我们要求该运算须满足以下四条公理:
- 封闭性(Closure):对于任意 a,b∈G,都有 a∗b∈G。一般地,当我们说 ∗ 是定义为 G 上的二元运算时,封闭性通常已经隐含。
- 结合律(Associativity):对于任意的 a,b,c∈G,都有 (a∗b)∗c=a∗(b∗c)。
- 单位元(Identity element):存在某个元素 e∈G,使得对于任意 a∈G,都有 e∗a=a∗e=a。
- 逆元(Inverse element):对于任意 a∈G,存在某个元素 a−1∈G 使得 a∗a−1=a−1∗a=e。
群不能只看作一个集合或一个运算,它必须是 两者的结合,同时满足上面的公理。如果一个群满足交换律(即 a∗b=b∗a 对于任意 a,b∈G 成立),则我们称该群为 阿贝尔群(Abelian group)。
群可以分为 有限群 和 无限群。有限群的集合 G 中元素个数有限,记作 ∣G∣=n,称为群的阶,即群的集合内元素的数量:例如 (Zn,+),即模 n 的整数加法群,其阶为 n。无限群的集合元素个数无限:例如 (Z,+),即整数加法群。
对于一个群 (G,∗),其中 ∗ 是群的二元运算,如果 H 是 G 的一个非空子集,并且 H 在运算 ∗ 下也构成一个群,则称 H 为 G 的一个 子群,记作 H≤G。
我们判定一个群 G 的非空子集 H 是子群,当且仅当 同时满足以下三个条件:
- 封闭性:对于任意 a,b∈H,有 a∗b∈H。
- 单位元:G 的单位元 e 也属于 H。
- 逆元:对于任意 a∈H,有 a 的逆元 a−1∈H。
设 G 是一个群,S 是 G 的一个非空子集。所有包含 S 的 G 的子群中最小的那个记作 ⟨S⟩,它具体由所有形如 s1ϵ1s2ϵ2⋯skϵk 的元素构成,其中 si∈S,ϵi=±1,k 为任意非负整数。如果 ⟨S⟩=G,那么我们称 S 是群 G 的一个 生成元集合,S 中的元素就被称为 生成元,同时我们说 S 生成了 群 G,记作 G=⟨S⟩。如果 S 中仅包含一个元素,即 S={a},则我们称 G=⟨a⟩ 为一个 循环群。
ElGamal 加密算法建立在一个大素数 p 以及模 p 的乘法群 Zp∗ 上。其乘法群的集合包含 1,2,3,⋯,p−1 这些数,乘法群的运算为模 p 的乘法,即对其中两个数相乘后,结果若超过了 p−1,则除以 p 且取其余数作结果。我们将在后文证明模 p 的乘法群满足群的定义,即其运算是满足四条公理的。
对于任意素数 p,群 Zp∗ 是一个 循环群,这一点将在后文证明。这意味着,一个模 p 乘法群存在一个 原根 或 生成元 g∈Zp∗,使得
g1,g2,g3,⋯,gp−1(modp)
恰好覆盖 Zp∗ 集合中的所有元素。
模 p 乘法群的运算满足四条公理
封闭性
群的封闭性要求一个集合中的两个数经过运算后,其结果一定还在这个集合里。
对于任意 a,b∈S,考虑到 p 为素数,且 p∤a,p∤b 因为 1≤a,b≤p−1<p,所以 p∤a⋅b(这可以由反证法得到,因为如果 p∣a⋅b,必然有 p∣a 或 p∣b),所以
a⋅bmodp∈S.
结合律
形式上,一个在集合 S 上的二元运算 ∗ 被称之为可结合的(即满足结合律)若其满足以下的结合律:
(x∗y)∗z=x∗(y∗z)∀x,y,z∈S
模乘法继承了整数的结合律 (a⋅b)⋅c=a⋅(b⋅c),而模运算和乘法操作是良好兼容的,也就是说,在乘法运算中无论何时取模,最终的计算结果都是一致的。即,我们有
(a⋅b)modp≡((amodp)⋅(bmodp))modp.
下面给出一个证明:我们设
a=qap+ra,0≤ra<p,b=qbp+rb,0≤rb<p
其中 ra=amodp, rb=bmodp。
注意到
ab=(qap+ra)(qbp+rb)=p(pqaqb+qarb+qbra)+rarb
因此 (a⋅b)modp=rarb。又由 (amodp)⋅(bmodp)=rarb,等号两边相等,证毕。
单位元
显然的,有
1⋅a≡a(modp).
因为 1⋅a=a。
逆元
类比乘法运算中 3×31=1,我们说实数意义下的 31 是 3 的逆元。逆元的要求是群定义的核心,它使得群具有「可逆」的性质,允许我们解决方程和撤销运算,换句话说,它保证了群的完整性和对称性。
我们要证明,对于 ∀a∈S 存在一个逆元 b∈S 使得 a⋅b≡1(modp)。我们有 裴蜀定理(Bézout’s lemma):
裴蜀定理(Bézout’s lemma)
设 a,b 为不全为 0 的整数。那么,对于 ∀x,y∈Z 都有 gcd(a,b)∣ax+by 成立;而且,∃x,y∈Z 使得 ax+by=gcd(a,b) 成立。
我们知道,由于 p 是一个大的素数,任意 a∈{1,2,⋯,p−1} 都满足 gcd(a,p)=1,因此存在整数 x,y 使得
ax+py=1
对上式两侧取模 p,可得
ax≡1(modp)
因此,xmodp 即 a 的逆元。取一个 b=xmodp 使得 b∈S,即得到了 a 在模 p 乘法群的逆元 b。
∀a∈S, ∃b∈S such that a⋅b≡1(modp)
裴蜀定理的证明
在证明裴蜀定理前,我们需要先引入一些基本的数学知识。
欧几里得算法 或 辗转相除法
题目
已知 a 和 b,求 gcd(a,b)。
这里不妨设 a>b(a=b 时结果显然),若 b 是 a 的约数,那么 b=gcd(a,b)。下面讨论不能整除的情况,即 a=b×k+c,其中 c<b。我们有
gcd(a,b)=gcd(b,amodb).
我们欲证明该结论,需证明 a,b 的公约数与 b,amodb 的公约数是相同的,这样它们各自的最大公约数也是相同的。这里,由 a=bk+c,显然有 c=amodb。
首先,设 d∣a,d∣b,则 c=a−bk,则 dc=da−dbk。考虑到 da,db,k∈Z+,所以 dc 也是整数,即有 d∣c 成立。又 c=amodb,这意味着,所有对于 a,b 的公约数,也是 b,amodb 的公约数。证明完毕。
其次,设 d∣b,d∣(amodb),则 c=a−bk 得 amodb=a−bk,则 damodb=da−dbk,移项得到 damodb+dbk=da。考虑到 damodb,db,k∈Z+,所以 da 也是整数,即有 d∣a 成立。这意味着,所有对于 b,amodb 的公约数,也是 a,b 的公约数。证明完毕。
综上,证毕。
裴蜀定理的正式证明
我们记 d=gcd(a,b)。考虑到 d∣a 且 d∣b,即存在整数 u,v 使得 a=du,b=dv 成立。因此,总有
ax+by=d(ux+vy)
所以 d∣ax+by。
下面我们要说明存在 x,y 使得等式成立。
如果 a,b 之一为 0,不妨设 b=0,则 d=gcd(a,0)=a,显然 (x,y)=(1,0) 使得等式成立。
如果 a,b 均不为零,考虑到 gcd(a,b)=gcd(−a,b)=gcd(a,−b),不妨设 a,b 均为正数。
对于 gcd(a,b),我们使用 欧几里得算法,可得如下所示的过程:
abr1rn−3rn−2rn−1=q1b+r1,=q2r1+r2,=q3r2+r3,⋯=qn−1rn−2+rn−1,=qnrn−1+rn,=qn+1rn.0≤r1<b,0≤r2<r1,0≤r3<r2,⋯0≤rn−1<rn−2,0≤rn<rn−1,
显然 rn=d。不难观察到,事实上,辗转相除法从第三步起的每一步都满足通式
ri=ri−2−qiri−1
而对于第一步,a=q1b+r1 即 r−1=q1r0+r1,所以 r−1=a 且 r0=b。类似地,第二步亦可化归,因此辗转相除法的每一步过程总能表示为上式的形式。
我们为每一个余数 ri 记一个表示法:
ri=sia+tib
现在我们有
ri−2=si−2a+ti−2b,ri−1=si−1a+ti−1b,
代入辗转相除法的通式,得
ri=(si−2a+ti−2b)−qi(si−1a+ti−1b)=(si−2−qisi−1)a+(ti−2−qiti−1)b.
所以系数满足递推关系
si=si−2−qisi−1,ti=ti−2−qiti−1.
基于此,由
ri=sia+tib⟹rn=sna+tnb
我们只需取 x=sn,y=tn 即可。又由辗转相除法过程的第一行和第二行,有
r−1=a,r0=b
显然有
r−1=s−1a+t−1b=1⋅a+0⋅br0=s0a+t0b=0⋅a+1⋅b⟹(s−1,t−1)=(1,0),⟹(s0,t0)=(0,1)
从 (s−1,t−1) 和 (s0,t0) 开始递推,我们必然能推出 sn 和 tn,即一定存在这样的 x,y。这即证明了 裴蜀定理。
ElGamal 算法浅析
在 ElGamal 算法的加密过程中,假设发送方 Alice 和接收方 Bob 在传递消息 m 其中 m∈Zp∗,首先,Bob 要生成一个公钥和私钥:
- Bob 选择一个大素数 p;
- Bob 选择一个生成元 g∈Zp∗;
- Bob 随机生成一个私钥 x 满足 1≤x≤p−2;
- Bob 计算公钥 y=gxmodp。
Bob 将公钥 (p,g,y) 公开并将私钥 x 保密。随后,Alice 将加密消息 m:
- Alice 获取 Bob 的公钥 (p,g,y);
- Alice 随机选择一个临时密钥 k 满足 1≤k≤p−2;
- Alice 计算第一部分密文:c1=gkmodp;
- Alice 计算第二部分密文:c2=m⋅ykmodp。
随后 Alice 将密文 (c1,c2) 发送给 Bob。随后 Bob 将用其私钥 x 解密密文:
- Bob 收到 Alice 的密文 (c1,c2);
- Bob 计算共享秘密 s=c1xmodp,这是因为 c1=gkmodp 即 c1≡gk(modp),根据模运算的性质有 c1x≡(gk)xmodp 所以 s=c1xmodp=gkxmodp;
- Bob 计算 s 的模 p 逆元 s−1,使得 s⋅s−1≡1(modp);
- Bob 恢复消息,以 m=c2⋅s−1modp。
第 4 步中,展开后,有
m=c2⋅s−1modp=(m⋅yk)⋅s−1modp=(m⋅gxk)⋅s−1modp=(m⋅s−1modp)⋅(gxkmodp)=m⋅s⋅s−1modp=m⋅1modp=m