当前位置:首页 > CTF > 攻防世界 > 正文内容

XCTF_crypto新手区

七星9个月前 (08-11)攻防世界797


做题之前放上做题地址,一次性写完了一些密码学基础概念,看完直接入门密码学. 

    XCTF_Crypto

文章篇幅有点长,建议收藏食用.或者专门挑一下午时间入坑密码学.

文章重点第八题的概念.讲述了对称秘钥加密算法和非对称密钥加密算法,以及各自的举例.

详细讲述了RSA算法的密钥生成和破解.

ECC算法等待更新...

文章中的大部分书写语法是python的.比如  **代表幂, ^代表异或 等.


第一题 base64

下载题目,打开得到下面东西:

    Y3liZXJwZWFjZXtXZWxjb21lX3RvX25ld19Xb3JsZCF9


根据题目判断是base64,我们用下面种方式解一下.

1.在线网站:

  base64解密

image.png

2.离线工具小葵解密(网上有下载的):

image.png

3.python写脚本:

在写脚本的时候有个坑,可能会有人把脚本名写成base64.py...不能这么写.

我们看写好的脚本:

image.png


我用的是deepin,颜值高,个人非常推荐,可以在虚拟机里面装一个.镜像的话,去清华大学镜像源下载.


第二题 caesar

下载得到一串东西:

    oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}


根据题目名称可以得知,是凯撒密码

关于凯撒:

凯撒密码最早由古罗马军事统帅盖乌斯·尤利乌斯·凯撒在军队中用来传递加密信息,故称凯撒密码.

这是一种替代加密方式,只对26个字母进行替换加密,规则简单,容易破解.

我们可以想一下,把原文" I MISS YOU ", 向后移两位就能得到" K OKUU AQW "

所以这道题我们可以猜一下,根据上一道题的flag头是" cyberpeace{ "看出,

密文" oknqdbqmoq{ "向后移14位得到明文" cyberpeace{ ",所以我们可以挨个向后数.当然,太麻烦了,我们用几种方式解一下

1.在线网站把密文向后移14位(加密):

凯撒加密

image.png

2.写脚本:

image.png

虽然是位移, 但其本质是替代, 所以凯撒密码是替代密码.



第三题 morse

下载题目得到:

11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110


看见0,1要么是二进制转字符串要么是摩斯电码.由题目名称可知,是摩斯电码

在线工具或者

直接代码:

image.png



第四题 混合编码

下载题目得到:

    JiM3NjsmIzEyMjsmIzY5OyYjMTIwOyYj..........后面太长,不复制了


后面有两个等于,很明显的base64,用base64解一下得到:

    LzExOS..........后面太长,不复制了

这种编码方式是Unicode编码,两种方式

1.在线网址:Unicode编码

image.png

2.浏览器手动.随便打开一个网站, F12,改里面的html标签:

image.png

然后

image.png

点击空白处,可在浏览器页面看到转换后的结果:

image.png

得到:

LzExOS8xMDEvMTA4Lzk5LzEx..........后面太长,不复制了

大小写,数字,依旧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

数字小于128,所以可以推测是ASCII编码,在线解:

ASCII转字符串

得到:

welcometoattackanddefenceworld

更好用的工具你们可以自己找.


第五题 不仅仅是morse

下载的得到一串摩斯

--/.-/-.--/..--.-/-..././..--.-/..../.-/...-/./..--.-/.-/-./---/- ..........后面太长,不复制了


直接在线网站

image.png

关于摩斯电码的介绍,可以看这里

然后得到:

may_be_have_another_decodehhhhaaaaabaabbbaabbaaaaaaaabaa...(后面跟了一堆ab)

有ab,想到的培根密码.

我们把上面的到的ab单独拿出来:

aaaaabaabbbaabbaaaaaaaabaa...(后面跟了一堆ab)

在线解密:

image.png

或者脚本:

image.png

得到flag,用flag{}包起来提交


第六题 幂数加密

拿到题目,给了一串数字:

8842101220480224404014224202480122

题目是幂数加密

从上面的介绍应该可以想到解题思路了叭,下面附上python3.x脚本:

image.png

运行脚本直接获得弗拉格.(脚本得自己看明白了)


第七题 Railfence

下载题目得到:

  ccehgyaefnpeoobe{lcirg}epriec_ora_g

然后题目名称提示:

image.png

题目提示:

image.png

再看看栅栏密码的简介

嗯,我们简单理一理这个栅栏:

现在有明文:

   Let's go to the movies after school

然后去空格得到:

    Let'sgotothemoviesafterschool

假如现在三位栅栏加密就是:

从上到下排完,排三列(以为是三位栅栏):

    L ' o h o e f r h l

    e s t e v s t s o

    t g o m i a e c o

然后三行合起来得到密文:

    L'ohoefrhlestevstsotgomiaeco

然后这个题,题目提示是五只小鸡(五位栅栏),用在线的工具:

image.png

但是这不对啊,不信邪,从1到26全部试了一遍都不行

然后查资料,发现栅栏还有另一种w型栅栏:

还是上面那个例子:

    Let'sgotothemoviesafterschool

六位栅栏吧,它是以w形状去排列的,所以叫w型,六位表示有六行,空格用+表示:

    L+++++++++h+++++++++t++++++++

    +e+++++++t+e+++++++f+e+++++++

    ++t+++++o+++m+++++a+++r+++++l

    +++'+++t+++++o+++s+++++s+++o+

    ++++s+o+++++++v+e+++++++c+o++

    +++++g+++++++++i+++++++++h+++

你瞅瞅,这是谁没事干瞎想出来的..然后就是行合并:

    Lhtetefetomarl'tossosovecogih

于是直接在线工具走一走:

image.png

直接getshell.当然,你也可以试试自己写脚本



第十一题 转轮机加密

转子机是一种多轮替代的乘积密码.它是古典密码的最高峰作品.

主要用于第二次世界大战的军方.比如德国的Enigma,盟军的Hagelin,日本的Purple.

转子机是机械加密,有齿轮:

image.png

通过齿轮转动来选择密码表.

假设有三个齿轮,每个齿轮有26个字母,那么他的字母表就有26**3个字母表

每个齿轮的转速是不一样的:

image.png

每输入一个信息,快速转子会走一格

快速转子走一圈之后 中速转子会走一格,中速转子走一圈之后,慢速转子会走一格.

转子机是通过内部连线来选择字母表的.比如下面这个例子:

我现在需要加密"AA"这两个字母:

image.png

这是一个三排转子的转子机,左边是输入明文, 通过内部连线,把密文从右边输出

现在输个A,转子机内部连线到第二个转子,然后到第三个转子,第三个转子通过内部连线,输出密文B.

此时,A被加密成了B.快速转子也会转一格:

image.png

这时候,再输入A,通过转子加密,就会得到Y.

此时,这个A被加密成了Y

所以此时的AA被加密成了BY

转子机的出现,也促使了计算机的发展.

在当时参加破译转子机的科学家有很多,包括图灵.


介绍完转子机,直接看题

image.png



image.png

image.png

所以,这个题,我也不知道考的啥...看其他大佬wp做的...


第八题 easy_RAS

上面只讲了几种加密解密的方法,下面讲一讲密码学.

为什么会有密码学,是因为我们是有这个需求的.

互联网传输信道是不安全的, 我们不能依赖不安全的信道去传输明文.

 所以在传输之前, 需要对明文进行安全相关的变换, 再进行传输.

  对方收到之后,再进行一个安全相关的反变换,还原出原来的信息.


从密码学加密解密方式看, 大体可分两种, 对称密钥加密和非对称密钥加密

先看一下对称加密:

    讲个简单的例子, 我在一根木头上缠上绳子,在绳子上写了一点东西.

    然后把绳子给另一个人.

    另一个人想要知道绳子上写了什么,就需要把绳子缠在相同粗细的木头上.

在这个例子中,

    明文就是我在绳子上写的东西,我把绳子从木头上取下来,就是加密

    密文就是绳子展开后的东西,另一个人把绳子缠在木头上,就是解密

    而密钥就是这个木头. 密钥可以理解为:仅能被发送者和接收者知道的秘密

这就类似古典密码中斯巴达人的羊皮传书:

image.png


再回想一下在凯撒密码中, 替代的位数就是密钥.凯撒密码是最早的替代密码.

所以可以总结: 对称密钥密码的密钥是对称的,相同的.大部分的古典密码都是对称秘钥加密体系

对称密钥加密主要用于数据加密.

在对称密钥加密中, 有一个前提, 就是在任何通信开始之前, 双方必须要交换密钥.

那么,问题来了.我怎么才能把密钥安全的交给对方.

好问题.在古代,密钥一般是要人送过去.比如,抗战剧中,派个人送密码本.

  那么,在现代, 这种方式明显不可行.所以就有了非对称密钥加密算法

因为非对称密钥加密算法在加密和解密数据时, 效率比较低.

  所以一般用这种算法,传递对称加密的密钥,数据还是用对称秘钥加密方式来加密.


现在应该基本了解了对称密钥密码模型,下面就开始讲非对称密钥密码模型

在非对称密钥加密里,发送方和接收方都有两个密钥:

    public key <公钥>  和  private key <私钥>

公钥是公开的,可以发布在互联网上等其他地方, 私钥就是自己的.

在这个加密模型中, 密钥是成对出现的.

在这个加密体系中,如果使用公钥加密,就需要用私钥解密,如果用私钥加密,就需要用公钥解密.

发送方使用接收方的公钥加密数据,接收方接收到数据之后,用自己的私钥解密.从而保证了信息的保密性

    上述场景,发送方可以确定 信息不会被破解. 但接收方不能保证 数据就是发送方发的.(有保密性,但没有可靠性)

发送方使用自己的私钥加密,接收方接收到加密信息之后,用发送方的公钥解密.从而保证了信息的可靠性(确定就是发送方发的.)

    上述场景,用于数字签名,和抗抵赖.

        就比如我需要发布一个信息在互联网上,我用我的私钥加密了这个信息,用户拿到信息,用我的公钥解开了, 说明这个信息就是我发布的.

是不是感觉很神奇.接着,我们看加解密是怎么实现的.就,先从这道题的算法开始.

RSA算法

rsa算法是一个分组加密算法.分组加密就是说,明文在处理之前,需要先分组.比如之前的栅栏

这里的分组,是按需求分组.就比如64个比特一组或者1024个比特一组.

为什么需要分组?接着往下看就会有答案.

再讲加密之前,我们需要先讲密钥的生成.因为在通信开始之前,我们需要拥有公钥和私钥.

密钥的生成有五个步骤:

    1.生成两个大素数(质数) p和q

    2.计算p和q的乘积. n=p*q 这个n也叫系统的模

    3.计算小于n,并且与n互质的整数的个数,即欧拉函数, f(n)=(p-1)*(q-1)

    4.选择一个随机数e,且满足 1<e<f(n) ,并且e与f(n)互质.即: gcd(e,f(n))=1

    5.解方程 e*d ≡ 1 mod f(n) 求d的值

    最后保密d.两个大素数p和q销毁,公开n和e

即:

    公钥: PU = {e,n}

    私钥: PR = {d,n}


大素数,多大才算大呢? 在RSA算法的设计文献中有写到.p和q的值至少需要一百位十进制数以上.

恒等方程是说:

e乘上d的值,再除以f(n)之后,余数等于1.求仅有的未知数d.

这个方程求解的过程叫辗转相除法,或者叫扩展的欧几里得算法.


在这个过程中,有两个比较难的问题.

  1. 如何得到两个大素数(素性判定)

  2. 如何解方程


大素数可以这么来产生:

先随机生成一个大奇数,然后采用一个 概率多项式时间算法, 来检测该随机数是否为素数.

通常的算法有Solovay-strassen素性测试, Miller-Rabin素性测试.

通过30次Miller-Rabin算法测试后,大随机数不是素数的概率就非常非常小,就可以把它看做一个素数.

关于辗转相除法,下面举个简单的例子:

image.png

这个可能看着有点迷糊,看下面这个例子:

image.png




到目前为止, 应该理解了RSA算法的密钥生成流程.下面写一下加密算法和解密算法.

加密算法

    发送方获得接收方的公钥:PU = {e,n}

    通过下面计算得到密文:

    密文 = 明文^e mod n 且 0 <= 明文 <= n

看完上面这个式子,应该理解为什么RSA算法需要分组了吧. 因为加密条件的明文需要比n小.

解密算法

    接收方得到密文,利用自己的私钥PR = {d,n}解出明文

    明文 = 密文^d mod n


举个栗子:

image.png

image.png

可以发现, 用公钥加密,就可以用私钥解密.


在这个过程中, e和n是公开的, 如果系统的模n取值较小的话, 破解者就会通过n分解出p和q.从而得到私钥.

这一套算法就是基于三大数学难题中的大数分解难题实现的,即:

    要得到两个大素数的乘积是容易的,但要分解一个合数为两个大素数的乘积,则在计算上几乎不可行.

所以这个p和q一定要足够大. 当然, 正常的素数p和q对于上述运算也是成立的.

这是一个大数分解的网站,在做题时可能会用到: http://www.factordb.com/


关于RSA算法的安全性说明:

  1. 在理论上,RSA的安全性取决于模n分解的困难性.若n被分解成功,则RSA被攻破.

    目前最快的分解因子算法其时间复杂性为: O(e**(√(ln(n)*ln(ln(n)))))

    image.png

  2. 并没有证明分解大整数就是NP问题(NP问题是指 可以在多项式的时间里验证一个解的问题。另一个定义是,可以在多项式的时间里猜出一个解的问题),

    并不能排除存在尚未发现的多项式时间算法.也没有证明对RSA的攻击的难度与分解n等价,因此对RSA的攻击其困难程度不比大数分解难.

  3. 目前,RSA的一些变种算法已经被证明等价于大数分解

  4. 不管怎样,分解n是最显然的攻击方法.目前已经能分解多个十进制的大素数,因此,模数n必须选择大一些.


好了,对RSA算法的讨论就到这里结束了,我们看一下题目:

在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17

求解出d

1.算出系统的模n:

n = p*q = 2135733555619387051‬

2.计算小于n并且与n互质的整数的个数,即欧拉函数f(n)=(p-1)(q-1):

f(n)=(473398607161-1)*(4511491-1)=2135733082216268400

3.解方程e*d ≡ 1modψ(n),求出d.

17*d ≡ 1 (mod2135733082216268400)

            2135733082216268400 mod 17 = 16

                2135733082216268400 = 17 * 125631357777427552 + 16

            17 mod 16 = 1

                17 = 16 + 1

                 1 = 17 - 16

                   = 17 - (2135733082216268400 - 17 * 125631357777427552)

                   = 17 * 125631357777427553 + 2135733082216268400

d = 125631357777427553

好了,这个题就解完了.

下面用一种快捷方式解题直接求出d:

image.png

这就是Windows下的RSATool,下载地址:

https://share.weiyun.com/ArXOtx08



第九题 easychallenge

下载题目,得到一个pyc文件, 需要反编译一下.

先安装个uncompyle6

    python -m pip install --upgrade pip

    python -m pip install uncompyle6

然后反编译pyc并以文件形式输出:

    uncompyle6 12.pyc > 12.py

然后打开这个12.py分析之:

image.png

这个代码风格是python2的.运行一下:

image.png

是让输入flag.感觉有点像逆向的味儿....

这道题需要有编程基础,(至少得懂方法,函数.) 来分析下这个代码.

首先需要我们input一个flag(第29行)

然后调用了三个函数对输入的flag进行运算(加密), 然后与final里的字符串做对比

如果对了, 输出"correct", 如果错了,输出"wrong"


然后接着分析调用的第一个函数encode1():

image.png

有个for循环,循环获取flag(传入的参数ans)中的每个字符串值

然后获得每个i的unicode编码的数字,这个数字再和36做异或运算,然后再加上25, 再变成chr

这是一个加密过程, 我们需要解密, 就得反过来:

先把加密的字符变成unicode编码的数字, 再减去25, 然后和36做异或,然后变成chr:

image.png


然后看第二个函数.和第一个一样.直接逆.

代码就不贴了,自己写.自己写的才又成就感.


第三个函数

image.png

这里用了一个b32encode(),这里做了一个base32编码.解密也很简单, 直接b32decode()就可以了.

我们发现, 加密的过程是从第一个函数开始的, 解密就需要返回去, 从第三个函数开始,

所以代码就有了:

image.png

如果代码写对了, 就能得到弗拉格:

image.png

这个代码是用py3写的.

这个题应该丢逆向里..XD


第十题 Normal_RSA

下载题目, 得到一个加密文件和一个公钥文件

image.png

题目已经给出了是标准的RSA加密,

所以这个加密文件是用公钥加密的,需要用私钥解密.

(回忆一下私钥和公钥是怎么来的,从公钥推算到私钥需要什么东西)

那就直接用kali自带的OpenSSL工具去解密公钥中的参数:

    openssl rsa -pubin -text -modulus -in pubkey.pem

image.png

得到了以下结果:

    Modulus(大整数):

        C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD

    Exponent(就是e):

        65537

然后把大整数用python转成十进制:

image.png

得到:

    87924348264132406875276140514499937145050893665602592992418171647042491658461L

然后对大素数分解:

http://www.factordb.com/

image.png

得到p和q的值:

    p=275127860351348928173285174381581152299

    q=319576316814478949870590164193048041239

接着用rsatool生成私钥文件private.pem

    python rsatool.py -o private.pem -e XXX -p <p的值> -q <q的值>image.png


然后就能愉快的使用私钥解密了:

    openssl rsautl -decrypt -in flag.enc -inkey private.pem

image.png

已经get到了flag.


另一种更直接的解题方法:

使用RsaCtfTool工具:

我是安装过程

直接出flag:

    python RsaCtfTool.py --publickey 公钥文件 --uncipherfile 加密的文件

image.png



第十二题 easy_ECC

ECC详解地址:

https://qixingbit.com/%E7%AE%97%E6%B3%95/ECC/



七星比特|qixingbit.com

相关文章

XCTF_pwn新手区_whendidyouborn

XCTF_pwn新手区_whendidyouborn

pwnpwn的变量覆盖相关.开启场景,下载附件,放到Linux执行一下.大概就是让你输个年龄,然后姓名,根据输入返回结果.然后拖到ida里面分析一下.这个程序是64位的,所以用64位ida打开.选中m...

XCTF_web进阶区_baby_web

XCTF_web进阶区_baby_web

开启题目,创建场景:根据题目提示:初始页面是index.php,所以访问index.php就行了.但是发现,他还是会定向到1.php,于是用burpsuite:...

XCTF_crypto进阶区_cr3-what-is-this-encryption

XCTF_crypto进阶区_cr3-what-is-this-encryption

明显的RSA.把十六进制转二进制数字:已知p,q,e和密文c,求明文.参考第八题,RSA算法详解:https://qixingbit.com/xctf/%E5%AF%86%E7%A0%81%E5%AD...

XCTF_pwn新手区_guess-num

XCTF_pwn新手区_guess-num

下载题目,ida查看main函数伪代码:这里可以看出,v8是个随机数.而这个v6就是我们需要输入的猜测数分析这个代码,逻辑是这样的:先输入name,然后进入for循环,生成随机数,然后要求输入随机数,...

XCTF_pwn新手区_hellopwn

XCTF_pwn新手区_hellopwn

下载题目,运行之,得未知物,非flag:丢ida,找main函数,f5分析:有个if判断,如果条件成立,执行sub_400686()这个函数.双击这个函数进去看看:那就是说,只要让dword_6010...

XCTF_reverse新手区_csaw2013reversing2

XCTF_reverse新手区_csaw2013reversing2

下载题目后, 是exe的, 直接运行, 乱码,和题目的提示一样:  拖到ida里面,main函数双击然后f5看见伪代码里面main函数调用了这个方法做了if判断: &nb...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。