题目描述:
元宵节灯谜是一种古老的传统民间观灯猜谜的习俗。 因为谜语能启迪智慧又饶有兴趣,灯谜增添节日气氛,是一项很有趣的活动。 你也很喜欢这个游戏,这不,今年元宵节,心里有个黑客梦的你,约上你青梅竹马的好伙伴小鱼, 来到了cyberpeace的攻防世界猜谜大会,也想着一展身手。 你们一起来到了小孩子叽叽喳喳吵吵闹闹的地方,你俩抬头一看,上面的大红灯笼上写着一些奇奇怪怪的 字符串,小鱼正纳闷呢,你神秘一笑,我知道这是什么了。
解题过程:
得到一个txt文件,打开后发现一个字符串
Y3liZXJwZWFjZXtXZWxjb21LX3RvX251d19Xb3JsZCF9
题目名为base64,使用base64解密得到flag:https://tool.lu/encdec/
cyberpeace{WelcomK_to_nuw_World!}
题目描述:
你成功的解出了来了灯谜,小鱼一脸的意想不到“没想到你懂得这么多啊!” 你心里面有点小得意,“那可不是,论学习我没你成绩好轮别的我知道的可不比你少,走我们去看看下一个” 你们继续走,看到前面也是热热闹闹的,同样的大红灯笼高高挂起,旁边呢好多人叽叽喳喳说个不停。你一看 大灯笼,上面还是一对字符,你正冥思苦想呢,小鱼神秘一笑,对你说道,我知道这个的答案是什么了
解题过程:
得到txt文件,打开发现一个字符串
oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}
题目为Caesar,百度一下Caesar 密码,找到凯撒密码
caecsar(凯撒密码)
凯撒密码最早由古罗马军事统帅盖乌斯·尤利乌斯·凯撒在军队中用来传递加密信息,故称凯撒密码。这是一种位移加密方式,只对26个字母进行位移替换加密,规则简单,容易破解。下面是位移1次的对比:
明文字母表 Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
密文字母表 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
将明文字母表向后移动1位,A变成了B,B变成了C……,Z变成了A。同理,若将明文字母表向后移动3位:
明文字母表 X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
密文字母表 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
则A变成了D,B变成了E……,Z变成了C。
字母表最多可以移动25位。凯撒密码的明文字母表向后或向前移动都是可以的,通常表述为向后移动,如果要向前移动1位,则等同于向后移动25位,位移选择为25即可。
百度查找凯撒密码解密在线工具:https://www.xiao84.com/tools/103175.html
最终在偏移12位处找到flag
cyberpeace{you_have_learned_caesar_encryption}
题目描述:
小鱼得意的瞟了你一眼,神神气气的拿走了答对谜语的奖励,你心里暗暗较劲 想着下一个谜题一定要比小鱼更快的解出来。不知不觉你们走到了下一个谜题的地方,这个地方有些奇怪。 上面没什么提示信息,只是刻着一些0和1,感觉有着一些奇怪的规律,你觉得有些熟悉,但是就是想不起来 这些01代表着什么意思。一旁的小鱼看你眉头紧锁的样子,扑哧一笑,对你讲“不好意思我又猜到答案了。”(flag格式为cyberpeace{xxxxxxxxxx},均为小写)
解题过程:
打开得到的txt文件,得到以下内容
11 111 010 000 0 1010 111 100 o 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110
题目为Morse,想到莫斯密码,了解莫斯密码
莫斯密码由两种基本信号和不同的间隔时间组成:
短促的点信号" .",读(Di);
保持一定时间的长信号"—",读(Da)。
想到用 - 代替 1,.代替0, 得到以下内容,百度寻找莫斯密码在线解密工具:http://moersima.00cha.net/
有效翻译不成功,我找的这个网站的才翻译成功了
-- --- .-. ... . -.-. --- -.. . .. ... ... --- .. -. - . .-. . ... - .. -. --.
得到flag
cyberpeace{morsecodeissointeresting}
题目描述:
你和小鱼终于走到了最后的一个谜题所在的地方,上面写着一段话“亲爱的朋友, 很开心你对网络安全有这么大的兴趣,希望你一直坚持下去,不要放弃 ,学到一些知识, 走进广阔的安全大世界”,你和小鱼接过谜题,开始了耐心细致的解答。flag为cyberpeace{你解答出的八位大写字母}
解题过程:
打开得到的txt文件,得到以下内容
8842101220480224404014224202480122
题目提示幂数加密,百度一下什么是幂数加密
云影密码(幂数加密):
由0、1、2、4、8五个数字构成,0用来表示间隔,其他数字用加法和表示替换密文。再使用数字1~26表示字母A~Z。
手动解码
8842101220480224404014224202480122
88421 0122 048 02244 04 0142242 0248 0122
23 5 12 12 4 15 14 5
W E L L D O N E
flag为:WELLDONE
也可以用python脚本解码,方便快捷
def getFlag(s):
flag = ''
s = s.split("0")
for i in range(0,len(s)):
str = s[i]
list = []
sum = 0
for j in str:
list.append(j)
length = len(list)
for k in range(0,length):
sum += int(list[k])
flag += chr(sum+64)
return flag
s = "8842101220480224404014224202480122"
print(getFlag(s))
题目描述:
被小鱼一连将了两军,你心里更加不服气了。两个人一起继续往前走, 一路上杂耍卖艺的很多,但是你俩毫无兴趣,直直的就冲着下一个谜题的地方去了。 到了一看,这个谜面看起来就已经有点像答案了样子了,旁边还画着一张画,是一副农家小院的 图画,上面画着一个农妇在栅栏里面喂5只小鸡,你嘿嘿一笑对着小鱼说这次可是我先找到答案了。
解题过程:
打开获得的txt文件,得到以下内容
ccehgyaefnpeoobe{lcirg}epriec_ora_g
百度一下Railfence密码,知道为栅格密码
栅栏密码顾名思义是把要加密的明文分成N栏,然后再按一定规则重新组织成无规律的密文。栅栏密码的算法有许多,本栅栏密码加密解密算法如下:
①把将要传递的信息按字符从下到下交替排成N行(此处我们以N=2举例)。
②再将下面的行依次排在上一行的后面,从而形成一段密码。
明文:I LOVE YOU!
加密:
1、把将要传递的信息中的字母交替排成上下两行。
ILV O!
OEYU
2、 密文:
将下面一行字母排在上面一行的后边。
ILV O! OEYU
解密:
先将密文分为两行
ILV O!
OEYU
再按从上到下顺序取得字符组合成明文I LOVE YOU!
百度搜索栅格密码在线解密工具: https://www.xiao84.com/tools/103174.html
一直没有解密出cyberpeace{xxx}的格式
回头了解W型的栅格密码
栅栏密码W型加密算法:
栅栏密码(Rail fence Cipher),扩展变种W型,采用先把明文类似"W"形状进行排列,然后再按栏目顺序1-N,取每一栏的所有字符值,组成加密后密文。
比如字符串“123456789”,采用栏目数为3的时,明文将采用如下排列:
1---5---9
-2-4-6-8-
--3----7--
取每一栏所有字符串,组成加密后密文:“159246837”。
W型栅栏密码加密方式,比传统型栅栏密码加密方法,算法略有增强,但目前已只能用于学习算法验证。
得到flag
cyberpeace{railfence_cipher_gogogo}
题目描述:
“这个题目和我们刚刚做的那个好像啊但是为什么按照刚刚的方法做出来答案却不对呢” ,你奇怪的问了问小鱼,“可能是因为还有一些奇怪的加密方式在里面吧,我们在仔细观察观察”。两个人 安安静静的坐下来开始思考,很耐心的把自己可以想到的加密方式一种种的过了一遍,十多分钟后两个人 异口同声的说“我想到了!”。一种食物,格式为cyberpeace{小写的你解出的答案}
解题过程:
打开得到的txt文件,得到以下内容
--/.-/-.--/..--.-/-..././..--.-/..../.-/...-/./..--.-/.-/-./---/-/...././.-./..--.-/-.././-.-./---/-.././..../..../..../..../.-/.-/.-/.-/.-/-.../.-/.-/-.../-.../-.../.-/.-/-.../-.../.-/.-/.-/.-/.-/.-/.-/.-/-.../.-/.-/-.../.-/-.../.-/.-/.-/.-/.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../-.../.-/.-/.-/-.../-.../.-/.-/-.../.-/.-/.-/.-/-.../.-/-.../.-/.-/-.../.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/-.../-.../.-/.-/-.../-.../-.../.-/-.../.-/.-/.-/-.../.-/-.../.-/-.../-.../.-/.-/.-/-.../-.../.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/.-/.-/.-/-.../-.../.-/-.../-.../.-/.-/-.../-.../.-/.-/-.../.-/.-/-.../.-/.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/.-/-.../.-/-.../.-/.-/-.../-.../.-/-.../.-/.-/.-/.-/-.../-.../.-/-.../.-/.-/-.../-.../.-
实验工具翻译后得到以下,在hhhh后面的字符串都是由a和b组成,百度后发现了培根密码
may be have another decodehhhhaaaaabaabbbaabbaaaaaaaabaababaaaaaaabbabaaabbaaabbaabaaaababaabaaabbabaaabaaabaababbaabbbabaaabababbaaabbabaaabaabaabaaaabbabbaabbaabaabaaabaabaabaababaabbabaaaabbabaabba
1、培根密码(Bacon's cipher),本质上是一种替换密码,根据对应转换规则进行加密解密,通过不明显的特征来隐藏明文信息;
2、培根密码加密规则,将明文中的每个字母,转换成一组五个英文字母,即可得到密文,转换规则表如下:
a AAAAA g AABBA n ABBAA t BAABA
b AAAAB h AABBB o ABBAB u-v BAABB
c AAABA i-j ABAAA p ABBBA w BABAA
d AAABB k ABAAB q ABBBB x BABAB
e AABAA l ABABA r BAAAA y BABBA
f AABAB m ABABB s BAAAB z BABBB
3、培根密码解密时,将密文进行5个字符分组,替换成对应的明文即可。
4、培根密码,通常有两种不同的转换规则,一种为即I与J、U与V使用相同的编码,一种为I与J、U与V都使用不同编码。
百度培根密码在线解密工具:http://www.metools.info/code/bacon193.html
得到flag
ATTACKANDDEFENCEWORLDISINTERESTING
题目描述:
经过了前面那么多题目的历练,耐心细致在解题当中是 必不可少的品质,刚巧你们都有,你和小鱼越来越入迷。那么走向了下一个题目,这个题目好长 好长,你知道你们只要细心细致,答案总会被你们做出来的,你们开始慢慢的尝试,慢慢的猜想 ,功夫不负有心人,在你们耐心的一步步的解答下,答案跃然纸上,你俩默契一笑,相视击掌 走向了下面的挑战。格式为cyberpeace{小写的你解出的答案}
解题过程:
打开txt文件,得到以下内容
JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzk7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM2ODsmIzY5OyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjNTI7JiM3NjsmIzEyMjsmIzEwNzsmIzUzOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc3OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiMxMDc7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYjNzg7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjODQ7JiM2OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzUwOyYjNzY7JiMxMjI7JiM2OTsmIzEyMDsmIzc4OyYjMTA1OyYjNTY7JiM1MzsmIzc4OyYjMTIxOyYjNTY7JiM1MzsmIzc5OyYjODM7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM5OTsmIzExODsmIzc5OyYjODQ7JiM5OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjNjk7JiMxMTk7JiM3NzsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjNjU7JiMxMTg7JiM3NzsmIzg0OyYjNjU7JiMxMjA7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiMxMDU7JiM1NjsmIzEyMDsmIzc3OyYjNjg7JiM2OTsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzExOTsmIzc2OyYjMTIyOyYjMTA3OyYjNTM7JiM3NjsmIzEyMjsmIzY5OyYjMTE5OyYjNzc7JiM4MzsmIzU2OyYjMTIwOyYjNzc7JiM4NDsmIzEwNzsmIzExODsmIzc3OyYjODQ7JiM2OTsmIzEyMDsmIzc2OyYjMTIyOyYjNjk7JiMxMjA7JiM3ODsmIzY3OyYjNTY7JiMxMjA7JiM3NzsmIzY4OyYjMTAzOyYjMTE4OyYjNzc7JiM4NDsmIzY1OyYjMTE5Ow==
base64在线解密工具:https://base64.supfree.net/
解密后得到以下内容,猜测是Unicode编码
LzExOS8xMDEvMTA4Lzk5LzExMS8xMDkvMTAxLzExNi8xMTEvOTcvMTE2LzExNi85Ny85OS8xMDcvOTcvMTEwLzEwMC8xMDAvMTAxLzEwMi8xMDEvMTEwLzk5LzEwMS8xMTkvMTExLzExNC8xMDgvMTAw
Unicode 编码
Unicode编码有以下四种编码方式:
源文本: The
&x [Hex]: &x0054;&x0068;&x0065;
&[Decimal]: &00084;&00104;&00101;
\U [Hex]: \U0054\U0068\U0065`
\U+[Hex]: \U+0054\U+0068\U+0065
使用Unicode解密工具:http://tool.chinaz.com/tools/unicode.aspx
得到以下内容
LzExOS8xMDEvMTA4Lzk5LzExMS8xMDkvMTAxLzExNi8xMTEvOTcvMTE2LzExNi85Ny85OS8xMDcvOTcvMTEwLzEwMC8xMDAvMTAxLzEwMi8xMDEvMTEwLzk5LzEwMS8xMTkvMTExLzExNC8xMDgvMTAw
继续base64解密,得到以下内容
/119/101/108/99/111/109/101/116/111/97/116/116/97/99/107/97/110/100/100/101/102/101/110/99/101/119/111/114/108/100
编写解密python脚本 十进制转ASCII
s = '119/101/108/99/111/109/101/116/111/97/116/116/97/99/107/97/110/100/100/101/102/101/110/99/101/119/111/114/108/100'
s = s.split('/')
flag = ''
for i in range(len(s)):
flag += chr(int(s[i]))
print(flag)
得到flag
welcometoattackanddefenceworld
题目描述:
你俩继续往前走,来到了前面的下一个关卡,这个铺面墙上写了好多奇奇怪怪的 英文字母,排列的的整整齐齐,店面前面还有一个大大的类似于土耳其旋转烤肉的架子,上面一圈圈的 也刻着很多英文字母,你是一个小历史迷,对于二战时候的历史刚好特别熟悉,一拍大腿:“嗨呀!我知道 是什么东西了!”。提示:托马斯·杰斐逊。 flag,是字符串,小写。
解题过程:
打开txt文件,得到以下内容
1: < ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2: < KPBELNACZDTRXMJQOYHGVSFUWI <
3: < BDMAIZVRNSJUWFHTEQGYXPLOCK <
4: < RPLNDVHGFCUKTEBSXQYIZMJWAO <
5: < IHFRLABEUOTSGJVDKCPMNZQWXY <
6: < AMKGHIWPNYCJBFZDRUSLOQXVET <
7: < GWTHSPYBXIZULVKMRAFDCEONJQ <
8: < NOZUTWDCVRJLXKISEFAPMYGHBQ <
9: < XPLTDSRFHENYVUBMCQWAOIKZGJ <
10: < UDNAJFBOWTGVRSCZQKELMXYIHP <
11: < MNBVCXZQWERTPOIUYALSKDJFHG <
12: < LVNCMXZPQOWEIURYTASBKJDFHG <
13: < JZQAWSXCDERFVBGTYHNUMKILOP <
密钥为:2,3,7,5,13,12,9,1,8,10,4,11,6
密文为:NFQKSEVOQOFNP
了解转轮机加密
轮转机加密原理
每一行是一个轮子,假设有N个轮子,每个轮子有M个字符。
密钥是一串数字,代表取位顺序。
密文是以密钥的顺序取出的,每一个轮子的首位字符组成的串。
把内容按照 2,3,7,5,13…行按顺序排列
NACZDTRXMJQOYHGVSFUWIKPBEL
FHTEQGYXPLOCKBDMAIZVRNSJUW
QGWTHSPYBXIZULVKMRAFDCEONJ
KCPMNZQWXYIHFRLABEUOTSGJVD
SXCDERFVBGTYHNUMKILOPJZQAW
EIURYTASBKJDFHGLVNCMXZPQOW
VUBMCQWAOIKZGJXPLTDSRFHENY
OSFEZWAXJGDLUBVIQHKYPNTCRM
QNOZUTWDCVRJLXKISEFAPMYGHB
OWTGVRSCZQKELMXYIHPUDNAJFB
FCUKTEBSXQYIZMJWAORPLNDVHG
NBVCXZQWERTPOIUYALSKDJFHGM
PNYCJBFZDRUSLOQXVETAMKGHIW
第一列的内容即为密文,按照列读找flag
编写python解密脚本
def show(w, s, c):
# 重构w2
w2 = []
for i in range(len(s)):
w2.append(w[s[i] - 1])
w3 = w2[i].split(c[i])
w2[i] = c[i] + w3[1] + w3[0]
# 每列输出
cloumns = len(w2[0])
rows = len(w2)
for column in range(cloumns):
c = ''
for row in range(rows):
c += w2[row][column]
print(str(column+1) + ": " + c +" "+ c.lower())
# 轮子
wheel = ["ZWAXJGDLUBVIQHKYPNTCRMOSFE",
"KPBELNACZDTRXMJQOYHGVSFUWI",
"BDMAIZVRNSJUWFHTEQGYXPLOCK",
"RPLNDVHGFCUKTEBSXQYIZMJWAO",
"IHFRLABEUOTSGJVDKCPMNZQWXY",
"AMKGHIWPNYCJBFZDRUSLOQXVET",
"GWTHSPYBXIZULVKMRAFDCEONJQ",
"NOZUTWDCVRJLXKISEFAPMYGHBQ",
"XPLTDSRFHENYVUBMCQWAOIKZGJ",
"UDNAJFBOWTGVRSCZQKELMXYIHP",
"MNBVCXZQWERTPOIUYALSKDJFHG",
"LVNCMXZPQOWEIURYTASBKJDFHG",
"JZQAWSXCDERFVBGTYHNUMKILOP"]
# 秘钥
secret_key = [2, 3, 7, 5, 13, 12, 9, 1, 8, 10, 4, 11, 6]
# 密文
cipher_text = "NFQKSEVOQOFNP"
show(wheel, secret_key, cipher_text)
找到有意思的字符串,得到flag
fireinthehole
题目描述:
解答出来了上一个题目的你现在可是春风得意,你们走向了下一个题目所处的地方 你一看这个题目傻眼了,这明明是一个数学题啊!!!可是你的数学并不好。扭头看向小鱼,小鱼哈哈一笑 ,让你在学校里面不好好听讲现在傻眼了吧~来我来!三下五除二,小鱼便把这个题目轻轻松松的搞定了。flag格式为cyberpeace{小写的你解出的答案}
解题过程:
打开得到txt文件,得到以下内容
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d
了解RSA
RSA算法的加密,解密如下:
公钥KU: 加密
n(模值):两素数p和q的乘积(p和q必须保密,不相等)
e(公钥指数):gcd( e , (p-1)(p-1) )=1 ,(gcd为求取最大公约数的函数)
私钥KR:解密
n(模值):两素数p和q的乘积(p和q必须保密)
d(私钥指数):满足(d*e) mod ((p-1)*(q-1)) = 1,(mod为求余函数,求前一个/后一个的余数)
(C为密文,M为明文)
加密过程 C=M^e mod n
解密过程 M=C^d mod n
然而只根据n和e(注意:不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密 。
由上可得d的公式
d = (x *(p-1)*(q-1) +1 )/e # x可为任何正整数
# 想到d为整数,则p,q,e还应该满足以下条件
(x *(p-1)*(q-1) +1 )%e == 0
编写python的解密脚本
def getD(p, q, e):
x = 1
while (1):
if ((x * (p - 1) * (q - 1) + 1) % e == 0):
return (x * (p - 1) * (q - 1) + 1) // e # // 大数相除不会丢失精度
x += 1
p = 473398607161
q = 4511491
e = 17
print(getD(p, q, e))
得到flag
cyberpeace{125631357777427553}
题目描述:
你们走到了一个冷冷清清的谜题前面,小鱼看着题目给的信息束手无策,丈二和尚摸不着头脑 ,你嘿嘿一笑,拿出来了你随身带着的笔记本电脑,噼里啪啦的敲起来了键盘,清晰的函数逻辑和流程出现在 了电脑屏幕上,你敲敲键盘,更改了几处地方,运行以后答案变出现在了电脑屏幕上。
解题过程:
得到一个pyc文件,使用在线工具反编译:https://tool.lu/pyc/
得到以下内容
#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
import base64
def encode1(ans):
s = ''
for i in ans:
x = ord(i) ^ 36
x = x + 25
s += chr(x)
return s
def encode2(ans):
s = ''
for i in ans:
x = ord(i) + 36
x = x ^ 36
s += chr(x)
return s
def encode3(ans):
return base64.b32encode(ans)
flag = ' '
print 'Please Input your flag:'
flag = raw_input()
final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
if encode3(encode2(encode1(flag))) == final:
print 'correct'
else:
print 'wrong'
明白思路,编写python解密脚本
# flag -> encode1 ->encode2 -> encode3 -> == final
# final -> decode3 -> decode2 -> decode1 -> flag
import base64
def decode1(ans):
s = ''
for i in ans:
x = ord(i) - 25
x = x ^ 36
s += chr(x)
return s
def decode2(ans):
s = ''
for i in ans:
x = i ^ 36
x = x - 36
s += chr(x)
return s
def decode3(ans):
return base64.b32decode(ans)
final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
print(decode1(decode2(decode3(final))))
得到flag
cyberpeace{interestinghhhhh}
题目描述:
你和小鱼走啊走走啊走,走到下一个题目一看你又一愣,怎么还是一个数学题啊 小鱼又一笑,hhhh数学在密码学里面很重要的!现在知道吃亏了吧!你哼一声不服气,我知道数学 很重要了!但是工具也很重要的,你看我拿工具把他解出来!你打开电脑折腾了一会还真的把答案 做了出来,小鱼有些吃惊,向你投过来一个赞叹的目光
解题过程1(复杂):
得到一个压缩包,解压后得到flag.enc和pubkey.pem两个文件,想到要用私钥解密
┌──(kali㉿kali)-[~/下载/cx11]
└─$ openssl rsa -help
Usage: rsa [options]
Valid options are:
-help Display this summary
-inform format Input format, one of DER PEM
-outform format Output format, one of DER PEM PVK
-in val Input file
-out outfile Output file
-pubin Expect a public key in input file
-pubout Output a public key
-passout val Output file pass phrase source
-passin val Input file pass phrase source
-RSAPublicKey_in Input is an RSAPublicKey
-RSAPublicKey_out Output is an RSAPublicKey
-noout Don't print key out
-text Print the key in text
-modulus Print the RSA key modulus
-check Verify key consistency
-* Any supported cipher
-pvk-strong Enable 'Strong' PVK encoding level (default)
-pvk-weak Enable 'Weak' PVK encoding level
-pvk-none Don't enforce PVK encoding
-engine val Use engine, possibly a hardware device
用openssl从公钥中提取e和modulus(p*q的值)的值。
openssl rsa -pubin -text -modulus -in pubkey.pem
# e 65537
# Modlus C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD
# 十六进制转十进制:
# Modlus 87924348264132406875276140514499937145050893665602592992418171647042491658461
或者使用在线工具解析公钥:http://tool.chacuo.net/cryptrsakeyparse
使用记事本打开publickey.pem,复制内容到网站中位置即可
-----BEGIN PUBLIC KEY-----
MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMJjauXD2OQ/+5erCQKPGqxsC/bNPXDr
yigb/+l/vjDdAgMBAAE=
-----END PUBLIC KEY-----
使用进制转换工具将16进制的模数转成10进制:https://tool.lu/hexconvert/
使用网站工具分解Modlus获取p,q:http://www.factordb.com/
p: 275127860351348928173285174381581152299
q: 319576316814478949870590164193048041239
根据p,q,e生成私钥,本机已经安装好rsatool
python rsatool.py -o prikey.pem -e 65537 -p 275127860351348928173285174381581152299 -q 319576316814478949870590164193048041239
使用私钥解密flag,enc文件
openssl rsautl -decrypt -in flag.enc -inkey prikey.pem
解题过程2(简单,使用RsaCtfTool解决):
1 kali安装RsaCtfTool,注意,以下顺序不能错,不然很容易导致问题。
安装mpfr,
需要注意的是,如果wget mpfr失败,可能是版本更新了,可以到官网下载相关的bz2的压缩包,设定v为特定的版本,直接跳过wget的步骤,压缩安装即可。
wget https://www.mpfr.org/mpfr-current/mpfr-4.1.0.tar.bz2
tar -jxvf mpfr-4.1.0.tar.bz2
cd mpfr-4.1.0
./configure
sudo make && make install
安装mpc
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz
tar -zxvf mpc-1.1.0.tar.gz && cd mpc-1.1.0
./configure
sudo make && make install
下载RsaCtfTool:https://github.com/Ganapati/RsaCtfTool
git clone https://github.com/Ganapati/RsaCtfTool.git
cd RsaCtfTool
pip install -r requirements.txt
以下是几个官网的简单使用例子:
Uncipher file :
./RsaCtfTool.py --publickey ./key.pub --uncipherfile ./ciphered\_file
Print private key :
./RsaCtfTool.py --publickey ./key.pub --private
Attempt to break multiple public keys with common factor attacks or individually - use quotes around wildcards to stop bash expansion
./RsaCtfTool.py --publickey "*.pub" --private
Generate a public key :
./RsaCtfTool.py --createpub -n 7828374823761928712873129873981723...12837182 -e 65537
Dump the parameters from a key:
./RsaCtfTool.py --dumpkey --key ./key.pub
Factor with ECM when you know the approximate length in digits of a prime:
./RsaCtfTool.py --publickey key.pub --ecmdigits 25 --verbose --private
使用RsaCtfTool工具根据公钥输出秘钥
/home/kali/RsaCtfTool-master/RsaCtfTool.py --publickey ./pubkey.pem --private
创建秘钥
# 创建秘钥文件
vim prikey.pem
# 将以下内容复制进去
-----BEGIN RSA PRIVATE KEY-----
MIGqAgEAAiEAwmNq5cPY5D/7l6sJAo8arGwL9s09cOvKKBv/6X++MN0CAwEAAQIg
GAZ5m9RM5kkSK3i0MGDHhvi3f7FZPghC2gY7oNhyi/ECEQDO+7LPfhipjr7cNuPn
w7ArAhEA8Gwo6RyJIrnCNuI1YMCXFwIRAJulRkclqWIHx5pNZIAp9VUCEGjeJLIZ
ek+lSut5m+LJ3p0CEDRBEd7C622/wt1+58xOIfE=
-----END RSA PRIVATE KEY-----
使用秘钥解密,得到flag
openssl rsautl -decrypt -in flag.enc -inkey prikey.pem
# 得到flag
PCTF{256b_i5_m3dium}
题目描述:
转眼两个人又走到了下一个谜题的地方,这又是一种经典的密码学加密方式 而你刚好没有这个的工具,你对小鱼说“小鱼我知道数学真的很重要了,有了工具只是方便我们使用 懂了原理才能做到,小鱼你教我一下这个缇努怎么做吧!”在小鱼的一步步带领下,你终于明白了ECC 的基本原理,成功的解开了这个题目,两个人相视一笑,快步走向了下一个题目所在的位置。flag格式为cyberpeace{x+y的值}
解题过程:
打开下载的txt文件,得到以下内容
已知椭圆曲线加密Ep(a,b)参数为
p = 15424654874903
a = 16546484
b = 4548674875
G(6478678675,5636379357093)
私钥为
k = 546768
求公钥K(x,y)
了解ECC:https://zhuanlan.zhihu.com/p/38200434
原理:
E:y²=x³+ax+b(mod p)
p为有限域的范围,a、b为椭圆曲线的系数。
加解密原理:
公钥加密:选择随机数r,将消息M生成密文C,该密文是一个点对,即:C = {rG, M+rK},其中K为公钥
私钥解密:M + rK - k(rG) = M + r(kG) - k(rG) = M
该题公钥:
K=kG(mod p) =G+G·········+G (mod p)
----------------------------------原文内容-
对于椭圆曲线上一点 G,若存在最小的正整数 n ,使得 nG = O无穷 ,则称 n 为 G 的阶。若不存在这样的 n ,我们则称 G 是无限阶的。但是幸运的是,对于有限域上的的所有点都是有阶的。
密码学应用
下面,我们将探讨一下我们所学习的知识如何用于密码学中。
在RSA,其一个关键思想在于给定两个素数 p 、 q 很容易相乘得到 n ,而对 n 进行因式分解却相对困难,即正向简单而反向困难。
那么,椭圆曲线上什么困难呢?回想我们之前所说的,乘法很简单,除法却很难,详细的描述如下所示。
给定 k 和 G ,那么便很容易计算 K = kG 。反之,知道 K 和 G ,便很难算出 k 。
因此,这就是一个我们可以利用的难题。
其中, G 被称为基点, k(k<n) 被称为私钥, K 被称为公钥。
下面,便可以因此为基础进行加密解密流程。
1.小明选取一条椭圆曲线 E(a,b) ,并选择一个点作为 G ,以及选取私钥 k 并计算得到公钥 K 。
2.小明将 E(a,b) ,K,G发送给小王 。
3.小王 将要发送的消息 m 编码为 E(a,b) 上一点 M 并生成一个随机数 r(r<n) 。编码方法有很多,不再讨论。
4.小王 计算 C1 = M +rK 和 C2 = rG 并将 C1,C2 发送给 小明 。
5.小明 计算 C1 - kC2 即得到 M ,转码为消息 m 即可。
我们接下来看偷听者 小坏 怎么对此无能为力的。显然其所能监听到的消息只有 E(a,b) ,K,G,C1,C2,而由于除法的困难性,其没办法在不知道 k 和 r 的情况下知道 M ,因此也就无法还原信息。
而对于现实世界,可以对其椭圆曲线有如下描述。
T = (p,a,b,G,n,h)
其中,前面的几个参数在之前都有详细描述,最后一个参数是为了衡量安全性,其为椭圆曲线上所有点个数与 n 相除的整数部分。
从网上找了一个解密脚本
19477226185390
def scalar_mult(k, point):
"""Returns k * point computed using the double and point_add algorithm."""
assert is_on_curve(point)
if k < 0:
# k * point = -k * (-point)
return scalar_mult(-k, point_neg(point))
result = None
addend = point
while k:
if k & 1:
# Add.
result = point_add(result, addend)
# Double.
addend = point_add(addend, addend)
k >>= 1
assert is_on_curve(result)
return result
# Keypair generation and ECDHE ################################################
def make_keypair():
"""Generates a random private-public key pair."""
private_key = curve.n
public_key = scalar_mult(private_key, curve.g)
return private_key, public_key
private_key, public_key = make_keypair()
print("hex")
print("private key:", hex(private_key))
print("public key: (0x{:x}, 0x{:x})".format(*public_key))
print()
print("private key:", private_key)
print("public key:", public_key)
得到flag
cyberpeace{19477226185390}