由suctf一道题学到的中国余子式定理

文章以word形式发至邮箱:

minwei.wang@dbappsecurity.com.cn

有偿投稿,记得留下你的姓名联系方式哦~

中国余式定理即俗称的韩信点兵,又称孙子点兵、鬼谷算、秦王暗点兵,在先秦战国时代就已经有了记载。

有一道题,是这样写的:

“今有物不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何?”,这首诗的意思是有一个数,除以三余数为二,除以五余数问三,除以七余数为二,求这个数。

解法:

①令除数n1=3,n2=5,n3=7两两互质,然后将除数相乘得到一个n,n=n1n2n3=105;

②令余数x1=2,x2=3,x3=2,令乘积除以每个除数,得到一组数,M1=n/n1=105/3=35,M2=n/n2=105/5=21,M3=n/n3=105/7=15;

③利用辗转相除法或直接计算乘法反元素得到一组数:

s1=(mod n1) = ≡ 2 (mod 3)

s2=(mod n2) = ≡ 1 (mod 5)

s3=(mod n3) = ≡ 1 (mod 7)

④最后将每对M、x、s求乘积并将每对数据相加求和,将结果对n取余数,就可以得到最终的结果。

X = (x1M1s1 + x2M2s2 + x3M3s3) (mod n)

= (2×35×2 + 3×21×1 + 2×15×1) (mod 105)

= 23

中国余式定理:令n1、n2、……、nk为两两互质的整数,令n=n1n2……nk。联立方程组:

在集合{0,1,2……n-1}有唯一解:

x=

其中Mi=n/ni,si(mod ni) (n=0,1,2,…k)

上边这道题用程序来解的话是这样的:

import gmpy2

n = [3,5,7]

x = [2,3,2]

N = 1

for i in n:

N *= i

M = []

for i in n:

M.append(N/i)

s = []

for i in range(len(n)):

s.append(gmpy2.invert(M[i],n[i]))

#print s

sum = 0

for i in range(len(n)):

sum += x[i] * M[i] * s[i]

X = sum % N

print X

运行结果:

看suctf的一道题目:

Game.py内容:

import flag

flag = flag.flag

sands = int(flag[5:-1].encode("hex"), 16)

holes = [257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373]

with open("sand.txt", "w") as f:

for i in range(len(holes)):

sand = sands % holes[i]

f.write(str(sand)+"\n")

意思是将flag{}中的内容进行十六进制,然后转换成十进制对holes中的数据做求余运算,放入sand.txt中。利用中国余子式定理可以得到flag。

还是上边的脚本,稍作修改:

#coding:utf-8

import gmpy2

with open('sand.txt','r') as f:

sand_src = f.readlines()

sands = []

for i in sand_src:

sands.append(int(i.replace('\n','')))

holes = [257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373]

n = 1

for i in holes:

n *= i

M = []

for i in holes:

M.append(n/i)

s = []

for i in range(len(holes)):

s.append(gmpy2.invert(M[i],holes[i]))

#print s

x = 0

for i in range(len(sands)):

x += sands[i] * M[i] * s[i]

res = x % n

#print res

encode_hex = hex(res).replace('0x','').replace('L','')

decode_hex = encode_hex.decode('hex')

flag = "flag{" + decode_hex + "}"

print flag

运行结果:

题目虽不是很难,但对于我来说这个定理也是头一次听说,头一次接触,倒也学到了不少。

-END-

原文发布于微信公众号 - 安恒网络空间安全讲武堂(cyberslab)

原文发表时间:2018-06-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏封碎

Android中Broadcast的Intent大全 博客分类: Android小技巧 Android.netWAPGoogle

952
来自专栏项勇

[Android笔记7]之通过DatePickerDialog,TimePickerDialog调用系统时间设置

2743
来自专栏一个会写诗的程序员的博客

java.sql.SQLException: connection holder is null

java.sql.SQLException: connection holder is null

1341
来自专栏ml

md5算法原理一窥(其一)

    首先,需要了解的事,md5并不是传说中的加密算法,只是一种散列算法。其加密的算法并不是我们说所的那样固定不变,只是一种映射的关系。 所以解密MD5没有现...

3887
来自专栏JMCui

MongoDB系列五(地理空间索引与查询).

Volvo Today, Volvo announced i...

2712
来自专栏linux驱动个人学习

高通Audio中ASOC的machine驱动

ASoC被分为Machine、Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的...

9664
来自专栏菩提树下的杨过

linq to sql取出随机记录/多表查询/将查询出的结果生成xml

在手写sql的年代,如果想从sqlserver数据库随机取几条数据,可以利用order by NewId()轻松实现,要实现多表查询也可以用select * f...

2186
来自专栏一个会写诗的程序员的博客

java.base.jmod

/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods$ jmod list java....

1112
来自专栏码匠的流水账

聊聊HystrixThreadPool

hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java

761
来自专栏我和未来有约会

简练的视图模型 ViewModel

patterns & practices Developer Center 发布了 Unity Application Block 1.2 for Silver...

2159

扫码关注云+社区