首页 > 其他分享 >密码协议学习笔记(1.4):密码学的一些数学基础

密码协议学习笔记(1.4):密码学的一些数学基础

时间:2023-10-07 12:55:35浏览次数:44  
标签:1.4 原根 生成元 cdot varphi 笔记 ord 密码学 mod

数学基础:

抽象代数:

一个算符的代数结构:

幺半群:

数的集合和一个算符构成的代数结构$(G,+)$,且满足

  • 封闭性
  • 结合律
  • 存在恒等元(在群中我习惯这么叫,避免混淆)

群:

满足如下条件的代数结构$(G,+)$:

  • 封闭性
  • 结合律
  • 存在恒等元
  • 对于每个元素均存在逆元

交换群/阿贝尔群:

满足如下条件的代数结构$(G,+)$.

  • 封闭性
  • 结合律
  • 存在恒等元
  • 对于每个元素均存在逆元
  • 交换律

两个算符的代数结构:

环:

数的集合和两个算符构成的代数结构$(G,+,\cdot)$,且

  • $(G,+)$是一个交换群
  • $(G,\cdot)$是一个幺半群
  • $\cdot$对$+$满足分配律

在环中,加法的恒等元记为$0$,也称零元,乘法的恒等元记为$e$或$1$

要求$(G,\cdot)$是幺半群而非群的理由是,$0$元素无法存在对$\cdot$的逆元

交换环:

数的集合和两个算符构成的代数结构$(G,+,\cdot)$,且

  • $(G,+)$是一个交换群
  • $(G,\cdot)$是一个满足交换律的幺半群
  • $\cdot$对$+$满足分配律

域:

数的集合和两个算符构成的代数结构$(G,+,\cdot)$,且

  • $(G,+)$是一个交换群
  • $(G,\cdot)$是一个满足交换律的幺半群
  • $\cdot$对$+$满足分配律
  • $R \backslash \{0\}$对$\cdot$存在逆元

大佬博客上的一张图能直观说明这几个概念之间的联系:

图源:http://sparkandshine.net/algebraic-structure-primer-group-ring-field-vector-space/

其他概念:

阶:

群,环,域等代数结构中,记$R$的大小为$|R|$.

循环群,循环子群,生成元:

设$(G,\cdot)$是群,$a\in G$,记 $(a)=\{a^i| i \in Z\}$,可以证明,$((a),\cdot)$为$(G,\cdot)$的子群,称$(a)$为由$a$生成的循环子群,并称$a$为该循环子群的生成元.

例如,$(\{1,3,5,7\},* \mod 8)$是一个群.

取$a=3$

$(3)=\{(1,3) * \mod 8\}$是由生成元$3$生成的循环子群

设$(G,\cdot)$是群,$a\in G$,若$a^n=e$,则对于那个最小的$n$,称$a$的为$n$.

可以证明,一个群中某元素的阶等于该生成元生成的循环子群的阶(即元素个数,这两个概念叫一个名字也是因为此).

若群$(G,\cdot)$中存在元素$a\in G$,其生成的循环子群$(a)$就是$(G,\cdot)$本身,那么称这个群为循环群,$a$为该群的生成元(注意,生成元未必是唯一的).

例如,$(\{1,2,4,5,7,8\},* \mod 9)$是一个循环群,使用$2$或$5$作为生成元能生成这个群本身,但使用$4$或$7$则只能生成$(\{1,4,7\},*\mod 9)$,使用$8$只能生成$(\{1,8\},*\mod 9)$,使用$1$则只能生成$(\{1\},*\mod 9)$.

可以证明,阶数相同的所有循环群相互之间均同构.

可以证明,素数阶群都是循环群,且非恒等元都是生成元.

例如,$(\{0,1,2,3,4,5,6\},+ \mod 7)$是循环群,$1,2,3,4,5,6$都是该群的生成元.

又例如,$(\{1,2,4,8,16,32,64\},* \mod 127)$是循环群,$1,2,4,8,16,32,64$都是该群的生成元.

这两个定理非常好用,每当遇到素数$p$阶的群$G$时可以构造出它与模加群$([0,p-1],+ \mod p)$之间的双射.

具体方法是找出它的恒等元$e$对应$0$,然后再随便揪出一个非恒等元$x$,令$x,x^2,x^3,\cdots,x^{p-1}$分别对应$1,2,3,\cdots,p-1$,这能大大减少思考问题的复杂度.

数论:

欧拉定理:

欧拉函数:

记为$\varphi(n)$,是$[1,n-1]$之间与$n$的最大公约数为$1$的数的个数.

可以证明,若$n=a_1^{x_1}\cdot a_2^{x_2} \cdots $,其中$a_1,a_2,\cdots$为$n$的质因数,那么$\varphi(n)=(a_1-1)\cdot a_1^{x_1-1} \cdot (a_2-1)\cdot a_2^{x_2-1} \cdots$

例如,$100=2^2\cdot 5^2$,那么$\varphi(100)=(2-1) \cdot 2^{2-1} \cdot (5-1) \cdot 5^{2-1}=40$,实际上,$[1,99]$中与$100$最大公约数为$1$的数有$1,3,7,9,11,13,17,19,21,23,27,29,31,33,37,39,41,43,47,49,51,53,57,59,61,63,67,69,71,73,77,79,81,83,87,89,91,93,97,99$,共计$40$个.

欧拉定理:

若$a,n$互质,则$a^{\varphi(n)}=1 \mod n$

费马小定理:

首先不难看出,若$n$为质数,则$\varphi(n)=n-1$

费马小定理本质上是欧拉定理的特殊形式,其形式为,若$n$为质数,那么任意$a\in[1,n-1]$,$a^{n-1}=1 \mod 1$,因此可以记$a^{n-2}=a^{-1} \mod n$,结合快速幂算法,这是一个计算模素数域的乘法逆元的简便方法.

原根:

阶:

回到欧拉定理,若$a,n$互质,则$a^{\varphi(n)}=1 \mod n$,可将$\varphi(n)$看作一个"循环节",但这个循环节并非最小循环节,例如,考虑$a=2,n=7$的情况,$\varphi(7)=6$,固然有$2^6=1 \mod 7$,但实际上,$2^3=1 \mod 7$,$3$才是$2$在模$7$下的"最小循环节",称$2$在模$7$意义下的为$3$.写作$\mathrm{ord}_7(2)=3$.

原根:

若某数$a$模$n$的阶恰好有$\mathrm{ord}_n(a)=\varphi(n)$,那么称$a$是$n$的一个原根.

有些数不存在原根,如$8$,$\varphi(8)=4$,但$1,2,3,4,5,6,7$模$8$的阶均不为$4$.

(主要参考资料:算法学习笔记(40): 原根 - 知乎 (zhihu.com))

根据Euler定理,若$gcd(a,m)=1$,则$a^{\varphi(m)}=1 (\mod m)$

若将$(1\mod m),(a \mod m),(a^2\mod m),(a^3\mod m),\cdots$看作一个数列,那么这个数列存在着一个长度为$\varphi(m)$的循环节,因为$a^{\varphi(m)}=1$.然而,这个循环节未必是最短的,比如当$a=2,m=7$时

$2^0=1,2^1=2,2^2=4,2^3=1,\cdots (\mod 7)$

循环节的长度就是$3$,而非$\varphi(7)=6$,将这个最短循环节的长度定义为$a$在模$m$下的阶,写作$ord_{m}a$,$ord_{7}2=3$(同时$2$也是$\varphi(7)=6$阶群上的一个$ord_{7}2=3$阶循环子群)

(考虑$ord_{m}a$的值和$m-1$阶循环群$([1,m-1],*\mod m)$里元素的个数的关系)

当$ord_{m}a=\varphi(m)$时,就称$a$为模$m$意义下的一个原根.(同时$a$也是$\varphi(m)$阶循环群自身的一个生成元)

并非所有模数都存在原根(并不是所有的群都是循环群),例如$\varphi(8)=4$,但$ord_{8}1=1,ord_{8}3=2,ord_{8}5=2,ord_{8}7=2$

实际上,对于原根存在性,有着如下的定理:

原根存在的性质:

正整数有原根的充要条件为:它能表示为下列形式之一:$2,4,p^n,2p^n$其中$p$为奇素数.

证明略.

原根的个数:

若$m$存在原根,则$m$的原根共有$\varphi(\varphi(m))$个,不妨记$a$是$m$的原根,那么对于任意与$\varphi(m)$互质的正整数$s$,$a^s$也是$m$的原根.

证明略.

标签:1.4,原根,生成元,cdot,varphi,笔记,ord,密码学,mod
From: https://www.cnblogs.com/isakovsky/p/17746021.html

相关文章

  • NetCore学习笔记:单元测试和集成测试
    前言#我在使用AspNetCore的这段时间内,看了很多开源项目和博客,发现各种.Net体系的新技术很多人都有关注和使用,但却很少有人关注测试。测试是软件生命周期中的一个非常重要的阶段,对于保证软件的可靠性具有极其重要的意义。在应用程序的开发过程中,为了确保它的功能与预期一致,......
  • Java 学习笔记
    Java学习笔记dos环境下(Windows即cmd)的Java命令先用javac文件名.java;命令,编译java文件,生成一个后缀为class、名与类名相同的文件。再用java类名命令,执行文件。当类名前的修饰符为public时,类名必须和源文件名一致。并且以上操作不能执行带package的java文......
  • 如何在ipad上对pdf做笔记
    在iPad上做笔记,您可以按照以下步骤:1.选择一个文本编辑应用程序,如GoogleDocs、GoodNotes、Notability或OneNote。2.打开文本编辑器应用程序,并在其中输入要记录的文本。3.点击文本编辑器应用程序的“标记”(菜单)图标。4.从弹出的菜单中,选择“注释”选项。5.在注释选项卡上,点击“......
  • JAVA学习笔记1
    private封装extends继承编译类型是爷爷多态整个继承过程构造器必须首行引用爷爷的构造器(用super)点击查看代码packagecom.hspstudy.Test1;publicclassExtend_{publicstaticvoidmain(String[]a){GraFathergraFather=newGraFather("勤才",......
  • 【python笔记】虚拟环境
    1.虚拟环境的建立python-mvenv<虚拟环境名>#例如:python-mvenvmy_venv2.虚拟环境的激活与去激活激活cd到虚拟环境文件夹下的Scripts,在终端执行activate去激活cd到虚拟环境文件夹下的Scripts,在终端执行deactivate.bat3.在虚拟环境中下载依赖python-mpipin......
  • JS异步笔记
    Promise最早接触异步是在.net中,当时还是比较流行使用基于控件的BackgroundWorker,其自身通过子线程的方式来异步处理一些情况,并且封装了一些功能与主线程通信。后来,开始使用Thread,再后来,因为Thread的性能与生成数量的不可控,使用了ThreadPool,再后来,出现了Task,随后async、await如发......
  • 混淆技术研究笔记(六)如何基于yGuard实现?
    确定参考<adjust>作为入口后,就需要详细了解这部分代码的逻辑。需要看yguard源码了,你会如何阅读一个完全不了解的源码?我通常的策略都是找一个目标,添加代码依赖,写好demo,debug跟踪代码看。如果漫无目的的看,很难串起来整个流程,范围太大也容易迷失。先在配置中增加<adjust>配置:......
  • 【爬虫实战】用python爬小红书某话题的笔记,以#杭州亚运会#为例
    目录一、爬取目标二、爬虫代码讲解2.1分析过程2.2爬虫代码三、演示视频四、获取完整代码一、爬取目标您好!我是@马哥python说,一名10年程序猿。最近的亚运会大家都看了吗。除了振奋人心,还主打一个爱憎分明(主要针对小日子和韩国),看了的小伙伴都懂得!我用python爬取了小红书上#杭......
  • 《流畅的Python》 读书笔记 231007(第二章第一部分)
    第2章数据结构ABC语言是Python的爸爸~很多点子在现在看来都很有Python风格:序列的泛型操作、内置的元组和映射类型、用缩进来架构的源码、无需变量声明的强类型不管是哪种数据结构,字符串、列表、字节序列、数组、XML元素,抑或是数据库查询结果,它们都共用一套丰富的操作:迭......
  • 组合数学学习/复习笔记
    模板(前置芝士)P1226【模板】快速幂|取余运算目的:顾名思义,快速求解乘方。实现:挺好写的。题目传送门代码P3811【模板】乘法逆元开longlong!!定义:若\(a*x\equiv1\pmodb\),且\(a\)与\(b\)互质,那么就能定义\(x\)是\(a\)在模\(p\)意义下的逆元,记为\(a^{......