【CTF-Crypto】数论基础-01

数论基础

【专题说明】本系列文章主要根据B站Up主Alice-Bob学习数论基础知识,通过该系列文章,你可以对一些网安信安考试内容有一定了解,同时对于CTF中密码学方向的赛题在数论部分有更深的理解,如有不当之处,师傅们及时批评指正!
【专题展望】该系列文章会持续更新,同时后面后选择一些相关考点的CTF赛题进行补充讲解记录,毕竟学到的知识用起来才是自己的嘛!

0导读

0不是自然数

抽象代数 => 主要研究代数结构 就是离散数学中的群、环、域、格

标题带星号* 表示专业课程内容涉及

1-1 整除*

整除性(Divisibility)

image-20240415102129427

性质:

image-20240415102816827

解释:

:happy: 任何整数都是0的因子

:happy: 1是任何整数的因子

:happy: 这个地方存在一个争议 就是b不能为0的问题 注意一下就好

:happy: 如果b是a的因子,那么b也是-a的因子 -b也是a的因子 人话就是因子关系与正负无关

性质:

image-20240415103848058

注意:

消去律中c不能为0

image

比较重要的时线性性:

如果b是a和c的因子,对于所有整数 都存在b是a和c线性组合后的因子

讲解一下如何证明:

对于整除的一些证明,一般都转化为等式 如b | a <=> a = qb

定理:

image-20240415104619283

将b设为1 直接得到第二部分结论

特别符号

image-20240415104727373

课后练习:

image-20240415104851427

证明:

image-20240415105123302

b就是所有ai的和

1-2 素数*

Prime

定义:正整数n >=2 除了1和n以外,没有其他正整数整除n 此时n称为“素数”;否则n称为“合数"

ps: 1既不是素数,也不是合数

ps:若n为合数,则n = ab 1< a <n 1< b <n

引理2-1:任何大于1的整数必有素因子

理解:大于1的整数不是素数就是合数,对于素数,其本身就是自己的素因子,所以必然存在;难点在于合数,即说明合数(必然大于1)一定存在素因子

证明:存在必有,一般考虑反证法

image-20240415110208280

既然上面可知任何合数都一定存在素因子,那么素因子的范围是多少

定理2-1:任何合数n都至少有一个不超过 n \sqrt n n 的素因子

证明:存在至少,浓浓的反证味

image-20240415110959192

应用:

判断n是否是素数:如果所有素数 p < = n p <= \sqrt n p<=n 都不能整除n,则n是素数(缩短穷举的范围 仅对小整数适用 在密码学中 大素数效率非常低

举例:

image-20240415111335893

定理2-2:算术基本定理

image-20240415111406638

ps:

image-20240415111940679

用法:下一个定理

定理2-3:欧几里得定理(Euclid’s Theorem):素数有无穷多个

证明:反证法

image-20240415112259228

1-3 模运算*

密码学中非常重要的一个运算,一定要理解其性质和运算方法

形式:

image-20240415114038424

负数求模:

举个🌰:-13 mod 7 = 1

计算小窍门:-13 不断加7 直到为正数, 正数是几,答案就是几

-13 + 7 = -6 + 7 = 1

归纳一下 2 * 7 -13 = 1

利用数轴法进行巧算:

image-20240415115645451

当模数是4 则将0-3卷成一个钟表

-1 mod 4 = 3

-5 mod 4 = 3

性质:

image-20240415115800535

举例:

image-20240415115848744

应用:

每一步计算都可以模模数以化简中间结果

注意!最后一步一定要模5!

除法没有这样的性质

1-4 最大公约数*

定义:

image-20240415120558427

解释:所有公因子整除d

即为d = q*公因子

ps:

image-20240415120937005

此外gcd(0,0) = 0

举例:直接转化为正数

image-20240415120953304

互素:

image-20240415121104776

image-20240415121458858

证明:

image-20240415121509883

举例:

image-20240416215440932

上面这个q1和q2就是互素的 gcd(q1, q2) = 1


那么已知两个数 如何求最大公约数呢, 欧几里得算法!也称为辗转相除法

欧几里得算法(Euclid’s algorithm)

不失一般性,设a >= b >= 0, 求gcd(a, b)

数学原理:

b = 0时,gcd(a, 0) = a (因为任何整数都是0的公因子)

b > 0时,gcd(a, b) = gcd(b, r) 其中关系为:a = qb + r (因为如果d是b和r的公因子 则一定是a的公因子 可提取)

举例

image-20240416220641665

1-5 扩展欧几里得算法*

定理5-1 最大公约数表示定理:设a, b属于Z, d = gcd(a, b), 则存在s,t 属于Z 使得as + bt = d

翻译成人话就是 整数a和b的因子 和a和b一定存在线性关系

特别的,当a和b互素即gcd(a, b) = 1 则as + bt = 1

人话就是没什么区别 只不过这里d = 1

推论:d | v <=> as + bt = v

解释:去回忆整除 这里d是v的一个因子 右边a和b的最大公因子是v 则d也是其因子


基于上述定理 得到扩展的欧几里得算法 也叫广义欧几里得算法

用途:计算as + bt = gcd(a, b) 中的s和t


既然是扩展欧几里得算法,那么一定跟欧几里得算法有关系啦

image

这里是求gcd(a, b) = rn

在应用欧几里得算法的过程中 其实q是没有用的 但是在扩展欧几里得中 我们需要理由q

求法:先假设image-20240416235656256

然后利用归纳法进行证明推导

image-20240416235729288

进一步

image-20240416235746319

则s和t 就是sn和tn

应用:

image-20240416235845075

计算:

第一步拆:100 / 35 = 2 … 30

image-20240416235913954

第二步 辗转相除 35 / 30 = 1 … 5

image-20240417000041105

第三步 30 / 5 = 6 … 0 余数为0 停止 被除数为结果

image-20240417000144101

最终直接结束

在python中存在该函数库直接调用

g,s,t = gmpy2.gcdext(e1,e2)  

1-6 最小公倍数*

先解释一下什么是公倍数:

a和b都是整数,如果m(整数)分别是a和b的倍数,则m是a和b的公倍数 可以为负哦~

然后是最小公倍数:

image-20240417003039435

推论:

  1. 设m = lcm(a, b) 如果a | c, b | c, 则 m | c
  2. 若gcd(a, b) = 1 => lcm(a, b) = ab 举例 3和5 最小公倍数就是15

计算公式:lcm(a, b) = ab / gcd(a, b)

上面这个用到了一些乘乘除除 但是我们知道在计算机中乘法效率较慢,所以尝试使用加法求解lcm

原理:两数中小的加自己,然后进行比较,直到两边相等

举例:

image-20240417003739218

1-7 证明算术基本定理*

算数基本定理:任何非零整数n,可以表示成下面的乘积形式image-20240417122301990

证明存在性:

image-20240417122605198

证明唯一性:

首先引入一个小定理:

设p是素数,a和b是整数,则p | ab => p | a 或 p | b

翻译成人话,因为p是素数,所以如果p是a乘b的因子 则p是a或b的因子

推论:设p是素数,image-20240417122901414

举例:

image-20240417122932848

唯一性证明:

image-20240417123030116

1-8 等价关系

两个关联点:集合、二元关系

主要涉及三种关系:自反性、对称性、传递性

举例1:

image-20240417152309018

人话:

  • 3=3
  • 3=3 => 3=3
  • 3=3 3=3 => 3=3

举例2:

image-20240417152437464

人话:

  • 三角形与自身全等
  • 三角形A与三角形B全等 则 三角形B也与三角形A全等
  • 三角形A和B全等 B和C全等 则三角形A和C全等

举例3:

image-20240417154534743

反例1:

image-20240417154735971

反例2:

image-20240417154758109

给出正式定义:(集合的表示方法)

image-20240417154250910

抽象表示:(类似二元运算的表示方法)

image-20240417154330194

1-9 同余*

基本概念:

image

注意一下含义:同余之所以叫同余关系,是因为其表示的是一种关系而不是运算

区分:

image

正式定义:

image-20240417161147072

解释说明:

image

因为(a - b)整除n 所以r1-r2必然为0 即r1 = r2 则表示同余

性质:image-20240417161432493

证明:对b的式子进行变形 然后带入到a中

稍微一变形:a - b = qn 你想到了什么, 正是上面的n | (a - b)

一点说明:同余是一种等价关系,如果忘记了等价关系看上一章,那么等价关系具有的一切性质,同余也都具有

运算性质:

因为同余,所以加减乘三种运算和整数中没有任何区别

对自身的操作:

image-20240417162511483

两式之间的操作

image-20240417162534806

注意嗷!必须是同余!! 上面这两个式子就是对mod 6同余

1-10 乘法逆元

乘法逆元 说的就是我们上面同余式中的除法运算,相比于普通整数中的除法还是有一点点区别滴

引入,先来一个普通乘法:

加入同余:

打起精神:这里的操作都是可以的!by the way 这不是最终答案!

因为在模运算下最终的结果一定是一个整数,也就意味着 2 − 1 2^{-1} 21 是一个整数 显然是有点问题的 所以需要转化为一个整数 下面继续看乘法逆元 看一下在mod 5的情况下 2 − 1 2^{-1} 21能转化为哪个整数

在乘法逆元中:

先回顾一下倒数的概念:两个数的乘积为1,就称这两个数互为倒数

那么在同余中 就是两数相乘取余的结果为1 就乘为倒数

那么上面中 2 − 1 2^{-1} 21 表示2在模5下的倒数
2 × 3   m o d   5 = 1 2 \times 3~mod~5 = 1 2×3 mod 5=1
故转化为3

举例:相同的数 在不同的模数下 其乘法逆元也不同

在计算过程中,我们通过第一个例子也可以看出 很多其实仍然继承了幂运算中的性质 只有在-1次方表示倒数的时候用到了mod的数值

定义:

注意点:

  1. 模n下互为乘法逆元,一般只考虑比n小的
  2. 模n内的乘法逆元是唯一的
  3. by the way 有的时候整数会以自身为乘法逆元 比如1 模任何下都是1本身 再比如4 mod 5 4就是4本身的乘法逆元
  4. 乘法逆元的存在条件:!!!!!!image-20240417165934811

​ 举例 在mod 4下 2没有逆元 所以条件为 整数和模数必须互素

​ 证明:在最后d | 1 则表明d=1 但是我们假设d不等1 而是大于1

乘法逆元的求法!蛮重要的,可以设个考点:

既然得知s就是模n下的逆元,所以调用一下扩展欧几里得算法 一计算 返回的s 就是答案

1-11 一次同余方程*

在上面了解了乘法逆元之后,我们就可以在同余的情况下进行解方程啦

原理引入:

没有模数下的为一次方程非常普通,下面给这个方程加点料,加一个模数

到此引出一次同余方程的样子,加减乘都好办,就是除法比较特殊,下面先给出一点小demo

首先看一个典型错误:

可以发现最后3和1在模6下同余,但这个根本是错的,那我们把后面的式子展开一下,找一找问题出在哪

问题就在我们没有对mod 6同时做除法,即为:

这里需要观察,我们上面的那个之所以需要对模数进行除法,因为3和6不互素 即gcd(3,6)=3

如果需要除的数和模数互素,则不需要对模数进行操作,如下:因为此时乘法逆元存在

再来个例子:

首先105和63有最大公因数21 但是不能直接除21 因为gcd(21,6) = 3 需要对模数操作

分两步走,21->3,7 因为gcd(3,6)=3 所以不能直接除3 而应该对模数也操作

对于7 gcd(7,2)=1 互素, 所以模数没有影响

但两步走有些麻烦啊,怎么化简一下嘞:

因为gcd(105,63)=21

所以直接除21 对于模数的操作为除21和6的最大公因数 gcd(21,6)=3

到此引出消去律

image-20240418162858591

到此开头的一次同余方程可解

解释一下最后几步,3/5 相当于3乘5在模2下的逆元 即考虑谁乘5mod2 =1 即答案一定小于模数 故为1

即x与3mod2同余 进一步处理 将答案放到模数下 即x与1mod2同余

最终答案只有1吗 绝对不是!而是一个剩余类 1 + 2k都可以!通式如下:

image-20240418163725077

解后拓展:观察方程

模数缩小了三倍 在解集中0-5 6个数之间 解的个数也为3,这也是规律嗷!

看一个无解的式子

下一步2要除过去了 但是gcd(2,6)= 2 两数不互素 需要对模数处理

即为 x = 3/2 (mod 6/2) 即为 x = 3/2(mod 3)

这个时候处理分数 就是乘2在模3下的逆元 谁乘2 模3 = 1嘞 2本身! ????????我这个存疑 不理解哪错了

解释:不符合消去律 因为3里面没有2的因子

官方推理:因为gcd(2,6)=2 但是不存在2 | 3 故无解

在上面这个中 gcd(5,2)=1 互素 所以1 | 3始终成立 所以有解

有解的条件

1-12 剩余类*

前面的等价关系中 有=> 等价类

现在的同余关系中 有=> 剩余类

来个小栗子:

推广:

对比:

其实对比上面两个定义我们可以发现剩余类就是一种等价类

等价类的性质同样适用于剩余类的定义:

image-20240418171931387

剩余类的记法:

如果该剩余类的余数为0 则即为[0]

代表元:剩余类中的每一个元素都是这个剩余类的代表元

剩余类集合:

注意上面这个剩余类集合,可以定义两种运算加法和乘法:

举例:

既然有乘法,那必然要考虑一下乘法逆元的问题

本质不变,只是形式略微有点变化

把这些存在逆元的剩余类放到一个新集合中

注意啊 若a=0 gcd(0,n)=n 因为0是任何整数的因子 所以最大公因子就是n本身

两者关系:

合数时表示真子集

最后来一个符号简化表示

image-20240418175600081

给个demo

image-20240418175651912

一定注意最后的a和1都是剩余类而不是整数

1-13 中国剩余定理

上一节学会了求解一次同余方程

但是我们小学学完方程学的是什么,正是方程组

所以下面我们通过中国剩余定理CRT(Chinese remainder theorem) 去求解一次同余方程组


先看看一次同余方程组的样子吧:

image-20240418181105180

注意前提条件:模数必须两类互素

在CRT中告诉我们上面这个式子必有解

image-20240418182939931

下面重点介绍如何使用CRT进行计算:

首先对每个n进行操作:

这个很好理解啊,因为n1*中去掉了n1本身 然后其他的都两两互素 所以n1*和n1一定也互素嘞

既然都互素,则存在一定存在乘法逆元,都记为t

image-20240418185056742

把这个式子汇总一下为:

之所以第二个为0 是因为ni*中没有ni 但是有nj 所以模为0

此时就可以得到方程组的一个解了 注意这个解就是x 只不过我们先用a表示 不过那些ai 却是式子中的a1 - am

此时 去思考一个点哈:

那就是a模ni 得到的余数就是ai,原因在于因为e的原因 当模ni的时候,存在ni的都会为0 所以此时只剩下eiai 然后又因为ei与1模ni同余 所以最终只有ai

OK 最后收尾总结:里面的ni*-1 是ni*在模ni下的乘法逆元 也就是上面的ti 一回事 别慌

在模1以内有唯一的解,即a mod n

下面给出应用实例:

解题:a1 = 2 a2 = 3 a3 = 2 n1 = 3 n2 = 5 n3 = 7
n = 3 × 5 × 7 = 105 n 1 ∗ = n / n 1 = 35     逆元: 35 在模 3 的逆元为 2 n 2 ∗ = n / n 2 = 21     逆元: 21 在模 5 的逆元为 1 n 3 ∗ = n / n 3 = 15     逆元: 15 在模 7 的逆元为 1 a = 35 × 2 × 2 + 21 × 3 × 1 + 15 × 2 × 1 = 233 最终答案 a   m o d   n = 233   m o d   105 = 23 n = 3\times5\times7=105 \\ n_1^* = n / n1 = 35~~~~逆元:35在模3的逆元为2 \\ n_2^* = n / n2 = 21~~~~逆元:21在模5的逆元为1 \\ n_3^* = n / n3 = 15~~~~逆元:15在模7的逆元为1 \\ a=35\times2\times2+21\times3\times1+15\times2\times1 =233 \\最终答案a~mod~n = 233~mod~105=23 n=3×5×7=105n1=n/n1=35    逆元:35在模3的逆元为2n2=n/n2=21    逆元:21在模5的逆元为1n3=n/n3=15    逆元:15在模7的逆元为1a=35×2×2+21×3×1+15×2×1=233最终答案a mod n=233 mod 105=23

占个坑吧:双射关系 不理解

image-20240418230614860

1-14 欧拉函数*

首先先回顾一个符号

Zn* 中整数是谁不是我们这节关注的,而是要关注Zn* 中整数的个数,这个个数也就是欧拉函数记作
ϕ ( n ) \phi(n) ϕ(n)
给出定义:

image-20240418235854930

即0到n-1之间与n互素的整数的个数

举个例子:

image-20240418235956232

还是要记得gcd(0,n)=n 这也就是为什么phi(1) = 1 因为gcd(0,1)= 1

小点的数我们还可以这样列出来数一数

但是n一旦比较大,我们就需要借助欧拉函数的运算性质啦

  1. image-20240419004514863
  2. image-20240419004523105
  3. image-20240419004534214

注意啊 这里的p表示素数 只有素数才适用 非素数有其他计算法

这里推导一下2和3

image-20240419011750712

举个例子吧

image-20240419012011613

1-15 欧拉定理、费马小定理*

首先还是先引入一个新的概念

  • 乘法阶:

image-20240419013328669

  • 性质:

image-20240419013716314

证明:

因为a属于Zn* 所以与n互素 所以两边同除不需要改变模数n

所以推导出最终的结果t < k与k是n的阶相矛盾


由此得出性质:

image-20240419013949686

举例:一定要先知道阶为多少 但是这有些麻烦啊

image-20240419014327886

那么像不需要知道阶进行化简,下面引出重点:

  • 欧拉定理:应用前提a和n之间必须互素

image-20240419014437978

化简:

image-20240419014704744

一道非常好的例题,融合前面知识:

image-20240419015010230


下面开始推导费马小定理

首先要说的,费马小定理其实就是欧拉函数的一种特殊情况

把模数n限定到素数p表示

image-20240419015157510

然后两边同时乘a

得到

image-20240419015216944


最后是一个关于乘法阶的计算问题

image-20240419015301921

image-20240419015438349


补充定理:

image-20240419015632857

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值