CTF现代密码

Wesley13
• 阅读 849

本文涉及知识点实操练习--CTF实验室

前言:
在CTF的密码题目中,RSA以其加密算法之多且应用之广泛,所以在比赛中是最常见的题目。学习密码学并不难,但首先得打好数学基础,并在攻破密码的学习之路上持之以恒。今天我们就来打开RSA加密世界的第一扇门<数论< span="">>。

数论基础:
1.素数
2.公约数与公倍数
3.欧拉函数
4.欧几里得算法
5.扩展欧几里得算法
6.同余
7.模运算
8.逆
9.中国剩余定理
10.逆元与同余式定理

CTF现代密码

1.素数:

定义:
一个大于1的自然数,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数);否则称为合数。
如:
3×4 = 12,不是素数。
11除了等于11×1以外,不能表示为其它任何两个整数的乘积,所以11是一个素数。

关于素数有以下事实:

(1)如果p是素数,且p | ab(表示ab能被p整除),则p | a或 p | b ,即p 至少整除a与b中的一个。

(2)(算术基本定理)每个整数n ≥ 2 ,均可分解成素数幂之积:

CTF现代密码

(3)素数有无穷多个。

2.最大公约数与最小公倍数

CTF现代密码

3.欧拉函数
定义:

CTF现代密码

性质:

CTF现代密码

4.欧几里得(Euclid)算法

欧几里得算法又称为辗转相除法,用于求两个数的最大公约数。
原理:GCD(x,y) = GCD(y,x mod y) ,x>y

1.python代码实现

CTF现代密码

2.python第三方库:
1gmpy2.gcd(a,b)          #求a,b的最大公约数

CTF现代密码

2Crypto.Util.number

CTF现代密码

5.扩展欧几里得算法

定义:
在已知x,y时,求解一组解a,b,使得ax+by = GCD(x,y)

算法输入:两个正整数x和y
算法输出:x和y的最大公因数gcd(x,y)及满足等式ax+by=gcd(x,y)的整数a和b

python代码实现:
gmpy2库函数gcdext()

CTF现代密码

6.同余

定义:
设a,b是整数,n≠0,如果n|(a-b),则称a和b模n同余,记为a≡b(mod n),整数n称为模数。

由于n|(a-b) 等价于 -n|(a-b),所以a≡b(mod n) 与 a≡b(mod (-n))等价。因此,一般我们总假定模数n≥1。

同余的性质
性质1:

(1)自反性:a ≡ a (mod  m)
(2)对称性:a ≡ b (mod  m),↔  b ≡ c (mod  m)  ↔ a ≡ c (mod  m)

性质2:

CTF现代密码

7.模运算

定义:
a模n的运算给出了a对模n的余数,这种运算称为模运算。注意:模运算的结果是从0到n-1的一个整数。

模运算就像普通的运算一样,它是可交换、可结合、可分配的。而且,对每一个中间结果进行模m运算后再进行模m运算,其作用与先进行全部运算,然后再进行模m运算所得到的结果是一样的。例如:

(a+b)mod m=((a mod m)+(b mod m)) mod m
            (a-b)mod m=((a mod m)-(b mod m)) mod m
            (a×b)mod m=((a mod m) ×(b mod m)) mod m
            (a×(b+c))mod m=((a×b) mod m+(a×c) mod m) mod m

这些性质对于密码学中的数学计算非常的重要,模运算可以将所有中间结果和最后结果限制在一个范围内。对于一个k位的模数n,任何、加、减、乘的中间结果将不会超过2k位长,这样避免了巨大的中间结果,使得计算机能够有效的处理数据。

如:计算(mod n),不要直接进行7次乘法和一个大数的模运算:
                       (a×a×a×a×a×a×a×a)mod n

相反,应该进行三次比较小的乘法和三次比较小的模化简:

CTF现代密码

这样就可以避免巨大的中间结果出现。

8.逆

定义:
若m≥1,gcd(a,m)=1,则存在c使得:
ca≡1(mod m)

CTF现代密码

9.中国剩余定理

中国剩余定理(Chinese remainder theorem,CRT),又称孙子定理,最早可见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》中,为一次同余方程组的起源。

CTF现代密码

代码实现:

CTF现代密码

10.逆元与同余式定理

1模运算重要公式:

CTF现代密码

2威尔逊定理:(wilson’s theorem)

若p为素数,则:(p-1)!≡-1(mod p)  ⟹推导:(p-2)!≡1(mod p);
其逆定理同样成立。即:若(p-1)!≡-1(mod p),则p为素数

3二次探测定理:
定义:
若p是素数且 0<< span="">x<< span="">p,则 ≡1(mod p)仅有的两个解为:x=1或x=p-1

证明:由于≡1(mod p),所以:-1≡0(mod p),即(x+1)(x-1)≡0(mod p)

4费马小定理(Fermat):

CTF现代密码

5欧拉定理(Euler):

若a与m互质,则:CTF现代密码

后记:

数论基础的知识点比较杂乱繁多,这篇文章写的时候尽可能的去精简了,其中的定理及公式是必须要牢记于心的,后面的RSA加密算法的讲述中我会介绍定理及公式在RSA中的应用。

学习完数论基础后,后面我们将开始学习RSA的常见攻击算法及加密原理,以及各种工具的使用和python第三方库的函数调用。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这