【CTF解题】BugKu - Crypto篇
2022-10-24 / 0 评论 / 31 阅读 / 2 点赞

【CTF解题】BugKu - Crypto篇

发光的神
2022-10-24 / 0 评论 / 31 阅读 / 正在检测是否收录...

你以为是md5吗解题

l9mubhhn.png
1.题目描述了md5这种提示,一般都是出题人的暗示,我就喜欢这么出题。

l9mujl92.png

2.下载文件下来是一个txt文本文档,里面有串值看起来是md5,好了直接去在线解密了。
l9mukwkc.png

3.如果这么想就错了,仔细观察会发现md5是以0-9 a-f 组成十六进制数,里面出现了"i u o"很明显这肯定是出题人加的,去除掉再试试看。

l9muprzr.png

4.果然是这样,出结果了还真的是666,那么flag就是这个了。

flag{666666666666}

简单的RSA解题

l9kv4c7l.png

了解RSA

RSA算法原理
RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
RSA算法的具体描述如下:
(1)任意选取两个不同的大素数p和q计算乘积 n = pq,n1 = (p-1)(q-1) ;
(2)任意选取一个大整数e,满足gcd(e,n1)=1,整数e用做加密钥(注意:e的选取是很容易的,例如,所有大于p和q的素数都可用);
(3)确定的解密钥d,满足(de) mod n1 = 1,即de = k(n1)+1,k >= 1 是一个任意的整数;所以,若知道e和n1,则很容易计算出d;
(4)公开整数n和e,秘密保存d ;
(5)将明文m(m<n是一个整数)加密成密文c,加密算法为:c = E(m)=m^e mod n;
(6)将密文c解密为明文m,解密算法为:m = D(c) = c^d mod n;
然而只根据n和e(注意:不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密。

RSA解密算法思路
通过RSA算法原理的第三点可以看到,需要解密出 明文m,就要知道 密钥d,所以算法思路就围绕密钥d进行求解。
密钥d 通过 辗转相除法 (欧几里得算法,我后面才知道的......) 进行求解:
1、根据算法原理的第三点我们得知:(de) mod n1 = 1,即 de - k(n1) = 1;
2、知道 系数k 即可得到 密钥d,且 系数k 存在两种情况:
2.1 情况一:n1 != 1
2.1.1 先 n1 对 e 取模 后得到的值赋值给 n1
2.1.2 然后 e 对 赋值后的 n1 取模 得到的值赋值给 e
......
以此类推,最后得到 k = 1 时即可停止;
令 d = 1 代入倒数第二条式子,得到k的值代入倒数第三条式子,以此类推当代入至第一条式子时,得到的 d 即为 密钥d 的值;
2.2 情况二:n1 = 1
2.2.1 按照情况一的步骤,最后得到 n1 = 1 时即可停止;
根据情况一的步骤代入即可得到 密钥d 的值。
3、使用python内置函数 pow函数即可得到 明文m。

题目分析

l9kvgcfj.png

1.题目给我们的是一个python的pyc文件,pyc是python编译出的二进制文件,很好转换成py源码的,想要解密就必须了解RSA加解密算法的原理。

l9kvjl78.png

2.用工具就可以还原出源代码,这里我用一个在线的网站进行转换。
解密网站:https://tool.lu/pyc/

from Crypto.Util.number import *
import gmpy2
import  base64

p = int("0xED7FCFABD3C81C78E212323329DC1EE2BEB6945AB29AB51B9E3A2F9D8B0A22101E467",16) # 将16进制转换成10进制
q = int("0xAD85852F9964DA87880E48ADA5C4487480AA4023A4DE2C0321C170AD801C9",16)
e = 65537
n = p * q
c = int("0x75AB3202DE3E103B03C680F2BEBBD1EA689C8BF260963FE347B3533B99FB391F0A358FFAE5160D6DCB9FCD75CD3E46B2FE3CFFE9FA2E9508702FD6E4CE43486631",16)
phi = (p-1)*(q-1)               #求φ(n),φ(n)=(p-1)(q-1)
d = gmpy2.invert(e,phi)            #求e对于模n的逆元,即解密指数d
m = pow(c,d,n)                    #m=c^e mod n,m为10进制格式
flag = long_to_bytes(m)            #m的字符串形式
print(base64.b64decode(flag))    #上面得到的flag是base64编码,进行一次base64解码即可

# 输出结果:flag{IlikeCTFbutCTFdon'tlikeme}

3.根据RSA解密算法公式,解出flag。

l9kw8759.png

flag{IlikeCTFbutCTFdon'tlikeme}

简单的密码解题

l9jtstns.png

1.题目意思是简单的密码,感觉不会太难,试着把题目下载看下。

l9jtwdbv.png

2.打开后二进制?一开始我想的是二进制转换成字符串,尝试失败了后来观察了下,会不会通过二进制的0和1给我们返回给一种状态呢,真的是没想到题目里的0代表 . 而 1 代表 - 这就是摩斯密码的规则。

l9ju4c0e.png

3.拿到在线网站解码下,果然是这样的 摩斯密码是以大写显示,我们要转换成小写,%u7b代表字符 " { " , %u7d代表的是 " } " 那么flag就是这个了。

l9jv7mzm.png

4.可以对照下这个摩斯密码表。

Bina = "0010 0100 01 110 1111011 11 11111 010 000 0 001101 1010 111 100 0 001101 01111 000 001101 00 10 1 0 010 0 000 1 01111 10 11110 101011 1111101"
strbox = ""
for i in Bina:
    if i == "0":
        strbox += "."
    if i == "1":
        strbox += "-"
    if i == " ":
        strbox += " "

dic = {
    ".-": "A", "-...": "B", "-.-.":"C","-..":"D",
    ".":"E","..-.":"F","--.":"G","....":"H",
    "..":"I",".---":"J","-.-":"K",".-..":"L",
    "--":"M","-.":"N","---":"O",".--.":"P",
    "--.-":"Q",".-.":"R","...":"S","-":"T","----.":"9",
    "..-":"U","...-":"V",".--":"W","-..-":"X",
    "..--.-":"_",".----":"1", "-.--":"Y","--..":"Z",
    "----.--":"{","-----.-":"}","-.-.--":"!","-----":"0"
}

for i in strbox.split():
    print(dic[i].lower(), end="")

l9lcjdpl.png

flag{m0rse_code_1s_interest1n9!}

来自宇宙的信号解题

l9jmpdy2.png

1."标准银河字母(Standard Galactic Alphabet)"出自游戏《指挥官基恩》系列。

l9jng994.png

2.一开始还真不知道是什么,百度过后才发现还有这种的,学习了这是标准银河字母,按照这张表输入对应的字母,就是正确的flag了。

flag{nopqrst}

参考文章
https://blog.csdn.net/weixin_43211186/article/details/125180939

聪明的小羊解题

题目类型:Crypto
描述: 一只小羊翻过了2个栅栏 fa{fe13f590lg6d46d0d0}
l9ht75ai.png

1.题目描述看似给我们提供了flag但经过了加密,他给我们提示了关键信息小羊 栅栏 翻过2个,一开始我还不清楚是个什么加密。

l9htckyt.png

2.顺着关键字百度,找到了个栅栏密码,还有这种加密长知识赶紧学习了。

l9hti6eq.png

3.找到个栅栏密码解密工具,设置翻过2组解密见flag。

2

评论 (0)

取消
0:00