Crypto方向CTF笔记
一些知识
-ZIP文件的16进制开头是 504B(0xPK)
-观察各种明显的进制
-wireshark异常流量分析,寻找data长度异常的包(将包的大小进行排序)。
-ZERO ONE(01)组合的字符串,考虑二进制转字符串或者摩斯密码
-替代密码(维吉尼亚密码,rot3,凯撒密码)。http://quipqiup.com/ 词频分析网站
-Python libnum库,求逆元、生成素数等功能。
-openssl查看.pub和.key文件。
-熟悉rsa计算流程
-栅栏密码以及W型,poem codes(诗歌密码)
-RSA低加密指数广播攻击:明文m和公钥e相同,攻击者利用拦截的密文c1,c2,c3…,和n1,n2,n3…。完成攻击。攻击原理:https://www.jianshu.com/p/8ebccf708c40
-base编码:base16(数字0-9和字母A-F)、base32(字母A-Z和数字2-7)、base64(A-Z、a-z、0-9、+、/)、base58(base58编码去掉了几个看起来会产生歧义的字符,如 0 (零), O (大写字母O), I (大写的字母i) and l (小写的字母L) ,和几个影响双击选择的字符,如/, +)。
-ICMP协议最主要的作用是PING
-openssl基本使用方法:
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]
-in filename:指明私钥文件
-out filename:指明将提取出的公钥保存至指定文件中
-pubout:根据私钥提取出公钥
eg:查看公钥.key
openssl rsa -pubin -text -modulus -in gy.key
eg:利用私钥解密
openssl rsautl -decrypt -in key.txt -inkey psa.key -out flag.txt
-RSA解密脚本
import gmpy2
import rsa
p = 273821108020968288372911424519201044333
q = 280385007186315115828483000867559983517
n = 76775333340223961139427050707840417811156978085146970312315886671546666259161
e = 65537
d = int(gmpy2.invert(e,(p-1)*(q-1)))
privatekey = rsa.PrivateKey(n,e,d,p,q)
with open("E:\\fllllllag.txt","rb") as f:
print(rsa.decrypt(f.read(),privatekey).decode())
-RSA公钥e常见值:3、17、65537
-openssl中pem文件格式:
version | pad | n | pad | e | pad | d | pad | p | pad | q | pad | x1 | pad | x2 | pad | x3
其中,pad是填充信息,x1=d mod (p−1),x2=d mod (q−1),x3=p−1 mod q
\x02为pad开头的标记,\x02后面两位的是内容长度
私钥信息按照上述顺序排列好之后,再进行base64编码。
-RSA素数分解问题:给定两个不同的n的时候一定要看看n1,n2有没有最大公约数(素数),如果有,那么该最大公约数就是两者共同的p
-RSA共模攻击:给定两个相同的n的时候,那就要考虑共模攻击了。
http://blog.chinaunix.net/uid-10376640-id-5820055.html
-维吉尼亚密码破解网站:https://guballa.de/vigenere-solver
-查看pem后缀文件
import gmpy2
from Crypto.Util.number import *
from Crypto.PublicKey import RSA
#若给出公钥文件,从公钥文件中分解出n和e
public_key1 = RSA.importKey(open(r"G:\ctf\CTF题目\c2d6e7158d7b4cd6a747774f0bdc5f72\publickey1.pem",'rb').read())
public_key2 = RSA.importKey(open(r"G:\ctf\CTF题目\c2d6e7158d7b4cd6a747774f0bdc5f72\publickey2.pem",'rb').read())
#int型
n1 = public_key1.n
e1 = public_key1.e
n2 = public_key2.n
e2 = public_key2.e
-base64隐写术:https://blog.csdn.net/l8947943/article/details/123507255
-RsaCtfTools使用方法:
将key.pem与cipher.bin移到与RsaCtfTool.py同目录下:
sudo python3 RsaCtfTool.py --publickey key.pem --uncipherfile cipher.bin --attack fermat