Soreat_u

@IYoc3SsnQxKAyugQqLKgDg

Joined on Mar 8, 2019

  • ###### tags: `tutorial` # Set-up for Cryptography ## 0x00 Why > 为什么要来学习密码学? 一个比较直接的原因是打CTF的需要。CTF线上解题模式里面,一般Crypto占的分挺多的(也就仅次于Web、Re和PWN),有的时候做出一道没人解出的Crypto其实也挺拉分的。 一个根本的因素是对这个方向比较感兴趣,那种破解密码的快感,真的挺爽的(不过有时苦思良久仍未解出也挺沮丧的)。学习各种密码算法,真的能感受到那些设计这些算法的天才们是多么的smart ~~(进而自己设计出一种优秀的加密算法)~~。 而且,学了密码学,能为其他几个方向打点基础。怼逆向加密算法的时候,如果熟悉的话,三下两下应该就能搞出来 ~~(没怎么打过,随便说的)~~;理解Web协议的时候,应该也会有一种熟悉感 ~~(没学过Web,瞎说的)~~。 ~~而且而且,密码学是信安的核心和基础,你不学一点密码学,怎么好意思说自己是搞安全的?~~ ~~或者说,你想对你心爱的女生(男生)表白时,你可以用这个:`J MPWF ZPV`。~~ ## What
     Like  Bookmark
  • ###### tags: `writeups` # Writeup for RSA in 2019西湖决赛 ## 0x00 Observation ![](https://i.imgur.com/Aat4tqf.png) 这是一道标准的RSA加密,给出了`n, e, d` 用`Winhex`打开`output`文件提取数据 ![](https://i.imgur.com/GWPfG0f.png) ## 0x01 Analysis `flag`是对`p+q`的`md5`加密值,所以需要根据`n, e, d`将`n`质因数分解成`p`和`q`。 关于如何在给定的`e`和`d`的情况下分解`n`,有一篇 [paper](http://www.ams.org/notices/199902/boneh.pdf) 提供了一个通法。 ![](https://i.imgur.com/QHCfQjG.png) ## 0x02 Decryption 根据paper所给出的方法,写出解密脚本: ```python # python2 from md5 import md5 def gcd
     Like  Bookmark
  • ###### tags: `writeups` # Writeup for 强网先锋-辅助 in 2019强网杯 ## 0x00 Problem 下载附件,打开得到加密脚本: ```python flag=open("flag","rb").read() from Crypto.Util.number import getPrime,bytes_to_long p=getPrime(1024) q=getPrime(1024) e=65537 n=p*q m=bytes_to_long(flag) c=pow(m,e,n) print c,e,n p=getPrime(1024) e=65537 n=p*q m=bytes_to_long("1"*32) c=pow(m,e,n) print c,e,n ''' output: 248208389374661824854442673702375040012454345208243633439850498602350171063940206094910669327946289696883902971209933623597622
     Like  Bookmark
  • ###### tags: `writeups` # Writeup for copperstudy in 2019强网杯 ## Description ![](https://i.imgur.com/VgO4rQM.png) ## 0x00 proof nc过去,发现要先过一道proof才能看到题目 ``` [+]proof: skr=os.urandom(8) [+]hashlib.sha256(skr).hexdigest()=520dc1cebc492b91dcc96787a791c182328d54adb63afef73c485e93f714627a [+]skr[0:5].encode('hex')=497625a6d2 [-]skr.encode('hex')= ... [+]teamtoken: ... ``` `proof`是对一个随机的8-bit字节进行sha256加密,给出了字节的前5bits,要算出字节的后3bits。 选择**爆破**: ```python from Crypto.Util.number import * import os impor
     Like  Bookmark
  • ###### tags: `writeups` # Writeup for part_des in 2019国赛 ## 0x00 Problem ``` Round n part_encode-> 0x92d915250119e12b Key map -> 0xe0be661032d5f0b676f82095e4d67623628fe6d376363183aed373a60167af537b46abc2af53d97485591f5bd94b944a3f49d94897ea1f699d1cdc291f2d9d4a5c705f2cad89e938dbacaca15e10d8aeaed90236f0be2e954a8cf0bea6112e84 ``` ## 0x01 Observation DES加密,给出了所有的(16对)子密钥和第n轮的加密结果。 DES是一个对称的加密结构,既然都有了所有的子密钥了,解密不会是问题。 ![](https://i.imgur.com/JLoRFkD.png) DES的加解密十分对称,解密就是用子密钥倒着加密。 不过这里第n轮中的n未知,可以
     Like  Bookmark
  • ###### tags: `writeups` # Writeup for easyRSA in 2019神盾杯 ## 0x00 分析加密代码 ![](https://i.imgur.com/9kkC9Tt.png) 首先是一个常规的RSA密钥生成,给出的信息是`n`和`e*d`,这边其实可以直接根据这两个信息求出`p`和`q`。 ![](https://i.imgur.com/sFnWSdG.png) 然后是对前面的`p`和`q`进行了一个`destroy`操作,生成了两个新的`p`和`q`,再用这两个新`p`和`q`进行RSA加密。 再看一下`destroy`: ![](https://i.imgur.com/tXR3Ld7.png) 实际上就是修改输入数的低位,直至生成一个新的质数。 另外还给出了`new_n, dp, dq, c`。 ## 0x01 计算p,q ![](https://i.imgur.com/EHDf5zH.png) 根据此方法,可以直接根据`ed`和`n`求出`p`和`q`: ```python def gcd(a, b): if
     Like  Bookmark
  • ###### tags: `writeups` # Writeup for Zakukozh in CyBRICS ## Description 题目描述如下图: ![](https://i.imgur.com/mU1hsd2.png) 意思是说,这是一个被`Affine Cipher`(仿射密码)加密过的一个图片文件,试着解密。 ## Analysis 仿射密码是个什么东西? [wiki](https://zh.wikipedia.org/wiki/%E4%BB%BF%E5%B0%84%E5%AF%86%E7%A2%BC) ![](https://i.imgur.com/xcahiuN.png) 说白了,就是一个线性变换。 看到只是mod 26,心里一喜,爆破分分钟啊。瞬间又意识到这是个二进制文件,应该不会是mod 26这么简单,估计是mod 256,但这个爆破也分分钟(后面可以看到,其实都不要用1秒)。 题目里面另外一个信息:**图片** 图片格式也就那么几种,能说的上来的也就`png`,`jpg`,... 好吧,说不出来了。 那么。。直接拖进`WinHex
     Like  Bookmark
  • ###### tags: `writeups` # Writeup for Fast Crypto in CyBRICS ## Description ![](https://i.imgur.com/4XQArEj.png) 意思就是说,这是一个*very modern*的加密算法,试着凭借一个*secret message*来解密这个*WAV*文件。 ## Analysis 加密脚本: ```python import json from tqdm import tqdm from egcd import egcd from pathlib import Path import sys def get_next(a, power, N): b = a ** power % N return b, b % 256 if not Path('public.key').exists(): print("Key file not found") exit(1) if len(sys.argv) != 3: print("Usage:
     Like  Bookmark
  • ###### tags: `writeups` # Writeup for warmup in 2019 SCTF ## Analysis ```python #!/usr/bin/python # -*- coding: utf-8 -*- from Crypto.Cipher import AES from Crypto.Util.strxor import strxor from Crypto.Random import get_random_bytes from FLAG import flag class MAC: def __init__(self): self.key = get_random_bytes(16) self.iv = get_random_bytes(16) def pad(self, msg): pad_length = 16 - len(msg) % 16 return msg + chr(pad_length) * pad_length def unp
     Like  Bookmark
  • ###### tags: `writeups` # Writeup for babygame in 2019 SCTF ## Analysis ```python #!/usr/bin/python # -*- coding: utf-8 -*- from Crypto.Util.number import * from Crypto.Cipher import AES from Crypto.Random import get_random_bytes from binascii import * from FLAG import flag from MESSAGE import message class telecom: def __init__(self, name): self.name = name self.key = get_random_bytes(16) self.iv = get_random_bytes(16) self.e = 3 p = getPrime(5
     Like  Bookmark
  • ###### tags: `writeups` # Writeup for baby_rsa in GUET_CTF2019 ## 0x00 Observation 用16进制编辑器*WinHex*打开,能看到以下信息。 ![WinHex内容](https://i.imgur.com/CsrWbEG.png) 这道题直接给出了 1. p+q 2. (p+1)(q+1) 3. e 4. d 5. c 要解密,需要**c**、**d**、**n**。现在只需要求出n即可。而 ``` n = p*q = (p+1)(q+1)-(p+q)-1 ``` 因此可以直接通过简单的加减法即可求得n。 ## 0x01 Script ```python # -*- coding: utf-8 -*- from binascii import unhexlify paq = 0x1232fecb92adead91613e7d9ae5e36fe6bb765317d6ed38ad890b4073539a6231a6620584cea5730b5af83a3e80cf30141282c97be44
     Like  Bookmark