CTF总结

打印 上一主题 下一主题

主题 850|帖子 850|积分 2550

CTF misc crypto re pyjail总结

MISC

常见文件16进制头尾

一些CTF题目标附件会去掉文件头,需要补全文件头,在一些文件里也可能隐藏多个文件,这就需要认识文件尾/文件头以方便提取或做判断,题目附件在下载的时间可能会没有文件后缀,无法判断是那种文件,由于各文件的16进制都有规定格式,在将文件在 010Editor 中打开后根据文件16进制头可以判断是哪一种文件,总之需要认识常见文件头以及格式,010里面有模板,方便识别各类文件,但也会有识别出错的情况,MISC题目千变万化...
PNG

文件头 89 50 4E 47 0D 0A 1A 0A
文件尾  AE 42 60 82
**JPEG **

文件头 FF D8 FF
文件尾 FF D9
GIF

**文件头 47 49 46 38 39(37) 61 **
文件尾 00 3B
BMP

文件头 42 4D
ZIP

文件头 50 4B 03 04
**文件尾 50 4B 01 02 / 50 4B 05 06 **
RAR Archive (rar)
文件头:52 61 72 21
Wave (wav)
文件头:57 41 56 45
其他16进制

TGA

未压缩的前4字节 00 00 02 00 RLE压缩的前5字节 00 00 10 00 00
TIFF (tif)

文件头:49 49 2A 00
ico
文件头:00 00 01 00
MS Word/Excel (xls.or.doc)
文件头:D0 CF 11 E0
MS Access (mdb) 文件头:
53 74 61 6E 64 61 72 64 20 4A
WordPerfect (wpd) 文件头:
FF 57 50 43
Adobe Acrobat (pdf) 文件头:
25 50 44 46 2D 31 2E
application/vnd.visio(vsd) 文件头:
D0 CF 11 E0 A1 B1 1A E1
Email [thorough only] (eml) 文件头:
44 65 6C 69 76 65 72 79 2D 64 61 74 65 3A
Outlook Express (dbx) 文件头:
CF AD 12 FE C5 FD 74 6F
Outlook (pst) 文件头:
21 42 44 4E
Rich Text Format (rtf) 文件头:
7B 5C 72 74 66
txt 文件(txt) 文件头:Unicode:FE FF / Unicode big endian:FF FE / UTF-8:EF BB BF /ANSI编码是没有文件头的
audio(Audio)
文件头: 4D 54 68 64
audio/x-aac(aac)
文件头:FF F1(9)
AVI (avi) 文件头:41 56 49 20
Real Audio (ram) 文件头:2E 72 61 FD
Real Media (rm) 文件头:2E 52 4D 46
MPEG (mpg) 文件头:00 00 01 BA(3)
Quicktime (mov) 文件头:6D 6F 6F 76
Windows Media (asf) 文件头:30 26 B2 75 8E 66 CF 11
MIDI (mid) 文件头:4D 54 68 64
XML (xml) 文件头:3C 3F 78 6D 6C
HTML (html) 文件头:68 74 6D 6C 3E
Quicken (qdf) 文件头:AC 9E BD 8F
Windows Password (pwl) 文件头:E3 82 85 96
windows证书文件(der) 文件头:30 82 03 C9
CAD (dwg) 文件头:41 43 31 30
Windows Shortcut (lnk) 文件头:4C 00 00 00
Windows reg(reg) 文件头:52 45 47 45 44 49 54 34
注:并非全部文件只收集常见,够用
隐写术

常用工具:

**16进制查看:010Editor  winhex **
音频查看:Audacity
等等
遇到举例
png:

起首先容一款好用的检测png隐写工具
zsteg:https://github.com/zed-0xff/zsteg
一些隐藏的文件,lsb隐写等都可以检测到
binwalk:
可以检测分离文件
  1. #检测图片
  2. binwalk filename
  3. DECIMAL       HEXADECIMAL     DESCRIPTION
  4. --------------------------------------------------------------------------------
  5. 0             0x0             PNG image, 640 x 1743, 8-bit/color RGBA, non-interlaced
  6. #分离图片
  7. binwalk -e filename
  8. (可能报错使用 binwlak -e filename --run-as=root)
  9. #刀操作,也可以分离图片
  10. dd if=filename of=newfilename skip=DECIMAL bs=1
复制代码
foremost:
同样可以分离文件,而且细分化,有log,有时间有奇效
  1. foremost -o 存放文件名 文件名
复制代码
使用非常方便:
  1. zsteg filename
  2. zsteg filename -a
  3. 还有其他参数指令
  4. zsteg -h
复制代码
宽高隐写:
png文件最常见的就是宽高隐写,通过修改宽高隐藏一些内容,这类图片肉眼一样平常无法判断,有的倒非常显着,可以通过修改宽高的16进制来实验规复,但有可能无法得到预期图片,可以通过工具或者crc爆破得到正确的宽高再修改文件的16进制得到原来的图片。
文件16进制中:
隐藏的信息可能存放在16进制文件尾,使用010打开在末尾处查看,也可能存放在文件中,使用搜索实验寻找
010功能强大
IDAT隐写:
pngcheck可以检测文件IDAT,粉碎,多余
文件IDAT通常中间的会保持一致再满了的时间才会举行下一个
此时就需要提取或者删除来达到规复的目标
里面通常会有zilb,也可能隐写在这里面
StegSolve:一款工具
png jpg gif都可以使用,检测图片lsb隐写,各颜色通道等
Data Extract:lsb隐写等
Frame Browser:gif帧分析
exiftool:
查看图片exif等信息,flag可能隐藏在这里
PNGdebugger/TweakPNG(png工具):
均可查看png文件数据,支持修改删除等操作
stegpy:
带有key的隐写
  1. stegpy filename -p
复制代码
png相干隐写暂时这么多
JPEG/JPG:

EXIF:
最常见的就是EXIF,备注,具体信息等,会有提示信息或者flag,
使用exiftool:
  1. exiftool filename
复制代码
或在线:EXIF信息查看器 (tuchong.com)
文件16进制:
同png一样,也可能存放在末尾或者文件中。
文件提取:
存在附件文件,使用binwalk/foremost
JSteg&&JPHide&&OutGuess&&F5:
四个隐写方式
可以使用相应工具提取
Stegdetect 可以资助探测
SilentEye:
jpg或者wav文件隐写flag
一些非预期(strings filename)
音频隐写:

MP3/WAV:
使用Audacity查看波形图或者频谱图,一些信息会隐藏在上面,波形图的摩斯暗码,频谱图可能有key,pass,乃至flag等
MP3Stego:MP3隐写工具
  1. encode -E txt -P 密码 MP3文件
  2. decode -X -P 密码 MP3name
复制代码
这种一样平常会有pass提示在文件尾等
LSB:DerbyCon CTF - WAV Steganography · ethackal
deepsound:WAV工具
需要暗码
dtmf2num:拨号音
音频滴滴滴
MMSSTV:
一种电报,可以将音频转化为图片,音频多嘈杂
SilentEye:wav工具
xls:

文件可能存在隐写有二维码,手点检测块是否不同,将其黑白变化得到二维码,可以使用QR扫描得到flag
使用7z点开里面存在内容,这类欠好找可以使用步伐寻找等
word:

字体隐藏:ctrl+a修改全局字体得到隐藏内容,修改设置得到隐藏文字,修改后缀或使用7z打开得到里面的文件,可能存在flag等有用信息
pyc隐写:

使用剑龙隐写可以得到隐藏的flag
  1. stegosaurus -x pycname
复制代码
CRYPTO

常见编码:

rabbit/aes/des加密:
U2FsdGVkX1通常为rabbit密文头,特征类似base64(aes ,des相似)
rabbit为一种流暗码,其详情高速流暗码——Rabbit - 掘金 (juejin.cn)
在线解密网:在线Rabbit加密 | Rabbit解密- 在线工具 (sojson.com)
  1. 例子:
  2. U2FsdGVkX188nKW3XYAppATn9y3lZg==  解密为:flag
复制代码
base家属:

(base64是每6bit位一个映射base32是每5bit位一个映射base16是每bit4位一个映射)
base64加密:( 编码后的数据比原始数据略长,为原来的4/3)
密文结尾通常为,由(A-Z、a-z、0-9、+、/)组成,以为填充
加密原理:用64个可打印字符表现二进制全部数据的方法...(Base64 算法原理,以及编码、解码【加密、解密】 先容 - 程默 - 博客园 (cnblogs.com))
  1. 例子:
  2. ZmxhZ3tiYXNlfQ== 解密为:flag{base}
复制代码
在线解密网:Base64 编码/解码 - 在线工具 (toolhelper.cn)
base58加密:(在比特币加密中有涉及,区块链)
base58的编码表相比base64少了数字0,大写字母I,O,小写字母 l (这个是L),以及符号‘+’和‘/’
加密原理:将字符流转成256进制的一个超大数 然后不绝的模58
  1. 例子:
  2. 2w6zoHymm2SU4UfhE 解密为: flag{base58}
复制代码
在线解密网:在线Base58编码解码 (lddgo.net)
base32加密:
由(A-Z、2-7)32个可见字符构成,“=”符号用作后缀填充,无数字+/,会有多个=。
  1. 例子:
  2. MZWGCZ33MJQXGZJTGJ6Q====  解密为: flag{base32}
复制代码
在线解密网:Base32编码解码,Base32在线转换工具 - 千千秀字 (qqxiuzi.cn)
base16加密:
将二进制文件转换成由16个字符组成的文本,由a-z,0-9组成,无=填充,与md5,hex相似。
  1. 例子:
  2. 666c61677b6261736531367d  解密为:flag{base16}
复制代码
在线解密网:Base16编码解码,Base16在线转换工具 - 千千秀字 (qqxiuzi.cn)
除此之外还有
base62,base85,base91,base92,base100。
base91的密文由91个字符(0-9,a-z,A-Z,!#$%&()*+,./:;?@[]^_`{|}~”)组成
base100为表情包

<strong>base85为BOu!rDst>tGAhM (c1^s1*c2^s2)%n = ((m^e1%n)^s1%n*(m^e2%n)^s2%n)%n #(a * b) % p = (a % p * b % p) % p=> (c1^s1*c2^s2)%n = ((m^e1)^s1%n*(m^e2)^s2%n)%n #((a % p) ^ b) % p =a ^ b % p=> (c1^s1*c2^s2)%n = ((m^e1)^s1*(m^e2)^s2)%n # (a % p * b % p) % p=(a * b) % p=>(c1^s1*c2^s2)%n = ((m^(e1*s1)*(m^(e2*s2))%n #。幂的乘方,底数稳定,指数相乘。(c1^s1*c2^s2)%n = (m^(e1*s1+e2*s2))%n  # 同底数幂相乘,底数稳定,指数相加。因为 e1*s1+e2*s2 = 1 得:(c1^s1*c2^s2)%n = (m^1)%n(c1^s1*c2^s2)%n=m[/code]同一m,同一n,不同e,举行加密。在不知道d的情况下,可以举行解密
wiener(维纳)攻击脚本
  1. from Crypto.Util.number import *
  2. n = p * q
  3. m = "flag"
  4. m = bytes_to_long(m)
  5. e = 65537
  6. phi = (p-1)*(q-1)
  7. d = inverse(e,phi)
  8. c = pow(m,e,n)
  9. m = pow(c,d,n)
  10. flag = long_to_bytes(m)
复制代码
低加密指数广播攻击
  1. def isqrt(n):
  2.   x = n
  3.   y = (x + n // x) // 2
  4.   while y < x:
  5.     x = y
  6.     y = (x + n // x) // 2
  7.   return x
  8. def fermat(n, verbose=True):
  9.     a = isqrt(n) # int(ceil(n**0.5))
  10.     b2 = a*a - n
  11.     b = isqrt(n) # int(b2**0.5)
  12.     count = 0
  13.     while b*b != b2:
  14.         # if verbose:
  15.         #     print('Trying: a=%s b2=%s b=%s' % (a, b2, b))
  16.         a = a + 1
  17.         b2 = a*a - n
  18.         b = isqrt(b2) # int(b2**0.5)
  19.         count += 1
  20.     p=a+b
  21.     q=a-b
  22.     assert n == p * q
  23.     # print('a=',a)
  24.     # print('b=',b)
  25.     # print('p=',p)
  26.     # print('q=',q)
  27.     # print('pq=',p*q)
  28.     return p, q
  29. fermat(n)
复制代码
解密脚本2
  1. import gmpy2
  2. import libnum
  3. p=
  4. q=
  5. e=
  6. c=
  7. n=p*q
  8. phi_n=(p-1)*(q-1)
  9. #求逆元
  10. #d=libnum.invmod(e,phi_n)
  11. d=gmpy2.invert(e,phi_n)
  12. m=pow(c,d,n)
  13. print(m)
  14. print(libnum.n2s(int(m)).decode())
  15. 出题脚本
  16. p,q接近,很快就能分解
  17. import libnum
  18. import gmpy2
  19. p=libnum.generate_prime(1024)
  20. #下一个素数
  21. q=gmpy2.next_prime(p)
  22. print(p)
  23. print(q)
  24. print(gmpy2.is_prime(q))
  25. e=65537
  26. m="flag{20d6e2da95dcc1fa5f5432a436c4be18}"
  27. m=libnum.s2n(m)
  28. n=p*q
  29. phi_n=(p-1)*(q-1)
  30. d=libnum.invmod(e,phi_n)
  31. c=pow(m,e,n)
  32. print("n=",n)
  33. print ("e=",e)
  34. print ("c=",c)
复制代码
N不互素(共享素数)

解题脚本
  1. import  gmpy2
  2. import libnum
  3. def isqrt(n):
  4.   x = n
  5.   y = (x + n // x) // 2
  6.   while y < x:
  7.     x = y
  8.     y = (x + n // x) // 2
  9.   return x
  10. def fermat(n, verbose=True):
  11.     a = isqrt(n) # int(ceil(n**0.5))
  12.     b2 = a*a - n
  13.     b = isqrt(n) # int(b2**0.5)
  14.     count = 0
  15.     while b*b != b2:
  16.         # if verbose:
  17.         #     print('Trying: a=%s b2=%s b=%s' % (a, b2, b))
  18.         a = a + 1
  19.         b2 = a*a - n
  20.         b = isqrt(b2) # int(b2**0.5)
  21.         count += 1
  22.     p=a+b
  23.     q=a-b
  24.     assert n == p * q
  25.     # print('a=',a)
  26.     # print('b=',b)
  27.     print('p=',p)
  28.     print('q=',q)
  29.     # print('pq=',p*q)
  30.     return p, q
  31. n=
  32. e= 65537
  33. c=
  34. pq=fermat(n)
  35. p=pq[0]
  36. q=pq[1]
  37. phi_n=(p-1)*(q-1)
  38. #求逆元
  39. #d=libnum.invmod(e,phi_n)
  40. d=gmpy2.invert(e,phi_n)
  41. m=pow(c,d,n)
  42. print(m)
  43. print(libnum.n2s(int(m)).decode())
复制代码
dp泄漏

解密脚本
  1. from Crypto.PublicKey import RSA
  2. p=
  3. q=
  4. n=
  5. d=
  6. e= 65537
  7. rsa_components = (n, e)
  8. keypair = RSA.construct(rsa_components)
  9. with open('pubckey.pem', 'wb') as f :
  10.     f.write(keypair.exportKey())
  11. from Crypto.PublicKey import RSA
  12. p= 787228223375328491232514653709
  13. q= 814212346998672554509751911073
  14. n= 640970939378021470187479083920100737340912672709639557619757
  15. d= 590103645243332826117029128695341159496883001869370080307201
  16. e= 65537
  17. rsa_components = (n,e,d,p,q)
  18. keypair = RSA.construct(rsa_components)
  19. with open('private1.pem', 'wb') as f :
  20.     f.write(keypair.exportKey())
  21. 公钥读取
  22. from Crypto.PublicKey import RSA
  23. with open("pubckey.pem","rb") as f:
  24.     key = RSA.import_key(f.read())
  25.     print('n = %d' % key.n)
  26.     print('e = %d' % key.e)
  27. 私钥读取
  28. from Crypto.PublicKey import RSA
  29. with open("private1.pem","rb") as f:
  30.     key = RSA.import_key(f.read())
  31.     print('n = %d' % key.n)
  32.     print('e = %d' % key.e)
  33.     print('d = %d' % key.d)
  34.     print('p = %d' % key.p)
  35.     print('q = %d' % key.q)
  36. 出题脚本 -基于N分解的题目
  37. import libnum
  38. import gmpy2
  39. from Crypto.PublicKey import RSA
  40. p=libnum.generate_prime(1024)
  41. #下一个素数
  42. q=int(gmpy2.next_prime(p))
  43. e=65537
  44. m="flag{}"
  45. m=libnum.s2n(m)
  46. n=p*q
  47. c=pow(m,e,n)
  48. flag_c=libnum.n2s(c)
  49. rsa_components = (n, e)
  50. keypair = RSA.construct(rsa_components)
  51. with open('pubckey1.pem', 'wb') as f :
  52.     f.write(keypair.exportKey())
  53. with open("flag.txt","wb") as f:
  54.     f.write(flag_c)
  55. 解题脚本
  56. import libnum
  57. import gmpy2
  58. from Crypto.PublicKey import RSA
  59. def isqrt(n):
  60.   x = n
  61.   y = (x + n // x) // 2
  62.   while y < x:
  63.     x = y
  64.     y = (x + n // x) // 2
  65.   return x
  66. def fermat(n, verbose=True):
  67.     a = isqrt(n) # int(ceil(n**0.5))
  68.     b2 = a*a - n
  69.     b = isqrt(n) # int(b2**0.5)
  70.     count = 0
  71.     while b*b != b2:
  72.         # if verbose:
  73.         #     print('Trying: a=%s b2=%s b=%s' % (a, b2, b))
  74.         a = a + 1
  75.         b2 = a*a - n
  76.         b = isqrt(b2) # int(b2**0.5)
  77.         count += 1
  78.     p=a+b
  79.     q=a-b
  80.     assert n == p * q
  81.     # print('a=',a)
  82.     # print('b=',b)
  83.     # print('p=',p)
  84.     # print('q=',q)
  85.     # print('pq=',p*q)
  86.     return p, q
  87. with open("pubckey1.pem","rb") as f:
  88.     key = RSA.import_key(f.read())
  89.     n=key.n
  90.     e=key.e
  91. with open("flag.txt","rb") as f:
  92.     c=f.read()
  93.     c=libnum.s2n(c)
  94. #费马分解,
  95. n1=fermat(n)
  96. p=n1[0]
  97. q=n1[1]
  98. phi_n=(p-1)*(q-1)
  99. #求逆元
  100. d=libnum.invmod(e,phi_n)
  101. m=pow(c,d,n)
  102. print(m)
  103. print(libnum.n2s(int(m)).decode())
  104. 进阶——自动生成密钥及加解密
  105. from Crypto.Cipher import PKCS1_v1_5
  106. from Crypto import Random
  107. from Crypto.PublicKey import RSA
  108. from Crypto.Cipher import PKCS1_OAEP
  109. random_generator = Random.new().read
  110. rsa = RSA.generate(2048, random_generator)
复制代码
dp,dq

解题脚本
  1. private_key = rsa.exportKey()
  2. # print(private_key.decode('utf-8'))
  3. with open('rsa_private_key.pem', 'wb')as f:
  4.     f.write(private_key)
复制代码
n是p的r次方

解密脚本
先分解n
  1. public_key = rsa.publickey().exportKey()
  2. # print(public_key.decode('utf-8'))
  3. with open('rsa_public_key.pem', 'wb')as f:
  4.     f.write(public_key)
  5. #测试用密钥加密
  6. public_key = RSA.importKey(public_key)
  7. msg='flag'
  8. pk = PKCS1_v1_5.new(public_key)
  9. encrypt_text = pk.encrypt(msg.encode())
  10. print(encrypt_text)
  11. #测试密钥解密
  12. private_key = RSA.importKey(private_key)
  13. pk = PKCS1_v1_5.new(private_key)
  14. msg = pk.decrypt(encrypt_text,0)
  15. print(msg)
  16. #两种标准
  17. rsa_components = (n, e, int(d), p, q)
  18. arsa = RSA.construct(rsa_components)
  19. rsakey = RSA.importKey(arsa.exportKey())
  20. rsakey = PKCS1_OAEP.new(rsakey)
  21. decrypted = rsakey.decrypt(c)
  22. print(decrypted)
复制代码
RSA NC不互素

解题脚本
  1. #coding:utf-8
  2. import gmpy2
  3. import libnum
  4. n=
  5. e1=
  6. c1=
  7. e2=
  8. c2=
  9. #共模攻击
  10. #共模攻击函数
  11. def rsa_gong_N_def(e1,e2,c1,c2,n):
  12.     e1, e2, c1, c2, n=int(e1),int(e2),int(c1),int(c2),int(n)
  13.     s = gmpy2.gcdext(e1, e2)
  14.     s1 = s[1]
  15.     s2 = s[2]
  16.     if s1 < 0:
  17.         s1 = - s1
  18.         c1 = gmpy2.invert(c1, n)
  19.     elif s2 < 0:
  20.         s2 = - s2
  21.         c2 = gmpy2.invert(c2, n)
  22.     m = (pow(c1,s1,n) * pow(c2 ,s2 ,n)) % n
  23.     return int(m)
  24. m = rsa_gong_N_def(e1,e2,c1,c2,n)
  25. print(m)
  26. print(libnum.n2s(int(m)))
复制代码
sage脚本_p高位攻击

脚本1
  1. c1 = pow(m, e1, n)
  2. c2 = pow(m, e2, n)
  3. e1,e2互质,则有
  4. gcd(e1,e2)=1
  5. 根据扩展欧几里德算法 对于不完全为 0 的整数 a,b,gcd(a,b)表示 a,b 的最大公约数。那么一定存在整数 x,y 使得 gcd(a,b)=ax+by
  6. e1*s1+e2*s2 = 1
  7. s1、s2皆为整数,但是一正一负,假设s1为正数,s2为负数
  8. 因为
  9. c1 = m^e1%n
  10. c2 = m^e2%n
  11. 可得:
  12. (c1^s1*c2^s2)%n = ((m^e1%n)^s1(m^e2%n)^s2)%n
  13. 根据模运算性质: 幂运算是一种关于幂的数学运算。同底数幂相乘,底数不变,指数相加。同底数幂相除,底数不变,指数相减。幂的乘方,底数不变,指数相乘。
  14. (a * b) % p = (a % p * b % p) % p
  15. a ^ b % p = ((a % p) ^ b) % p
复制代码
sage脚本_维纳变形(三素数pqr)

这一段代码求d
  1. (c1^s1*c2^s2)%n = ((m^e1%n)^s1*(m^e2%n)^s2)%n
  2. => (c1^s1*c2^s2)%n = ((m^e1%n)^s1%n*(m^e2%n)^s2%n)%n #(a * b) % p = (a % p * b % p) % p
  3. => (c1^s1*c2^s2)%n = ((m^e1)^s1%n*(m^e2)^s2%n)%n #((a % p) ^ b) % p =a ^ b % p
  4. => (c1^s1*c2^s2)%n = ((m^e1)^s1*(m^e2)^s2)%n # (a % p * b % p) % p=(a * b) % p
  5. =>(c1^s1*c2^s2)%n = ((m^(e1*s1)*(m^(e2*s2))%n #。幂的乘方,底数不变,指数相乘。
  6. (c1^s1*c2^s2)%n = (m^(e1*s1+e2*s2))%n  # 同底数幂相乘,底数不变,指数相加。
  7. 因为 e1*s1+e2*s2 = 1 得:
  8. (c1^s1*c2^s2)%n = (m^1)%n
  9. (c1^s1*c2^s2)%n=m
复制代码
PEM证书格式

from Crypto.Util.number import *
q = 0x00befff9907f75bb7ad561131b5c76ae137bd67ae0e32b90f92b997b044277cab3dfeb84f255138127e1a4e53751a68db743a00ed8acc58f33107fe35db6b4813bc048db48bd530bcb35fba434dbb70e27d78aede2de0d4745df35a245417b8c74a31a7b55a77db45ebd6ed1dc4b3dcaa435a79dbf7240d96775372e64b58b0803
dq = 0x1c1005fdea0c454075eb6e603dc49e2cf4abfd9fdf20be8b2d91be5650e1c2e18ccbd0dbbe0e4092b87f7ec212f812a8538247cc240e5eccd4e6c564367cece3f78b7cd482249a7dffef7a1fde0c56431a532a4283f7957a39a26ab61c39e7d81742c3ce40eea23aad40840b06ef0c3ff6362b623e8a32a715bcc6cf3b31333b
c = 2329206064672111950904450292941421573350591294207157652026787098178545948258554492347649016030892000747909819064473414536692222493030122267884839986067073054508582403564557167583565364976046083954888777809177108315052118912603290095925912298584322873410379937455462434313487981715516761071523410121549134193124709612876311518391130974466069686830456036397449773159386026998482557500868323733155606973727191287617806211911722356975478414165867941665666556476756617951672736466672410799762479373101996896644454778482896784598378016390592459460753042458284030795009957030383305268628413551730442224404807955926606496353
m = pow(c, dq, q)
print(long_to_bytes(m))
  1. 解密脚本
  2. import gmpy2
  3. import libnum
  4. def continuedFra(x, y):
  5.     """计算连分数
  6.     :param x: 分子
  7.     :param y: 分母
  8.     :return: 连分数列表
  9.     """
  10.     cf = []
  11.     while y:
  12.         cf.append(x // y)
  13.         x, y = y, x % y
  14.     return cf
  15. def gradualFra(cf):
  16.     """计算传入列表最后的渐进分数
  17.     :param cf: 连分数列表
  18.     :return: 该列表最后的渐近分数
  19.     """
  20.     numerator = 0
  21.     denominator = 1
  22.     for x in cf[::-1]:
  23.         # 这里的渐进分数分子分母要分开
  24.         numerator, denominator = denominator, x * denominator + numerator
  25.     return numerator, denominator
  26. def solve_pq(a, b, c):
  27.     """使用韦达定理解出pq,x^2−(p+q)∗x+pq=0
  28.     :param a:x^2的系数
  29.     :param b:x的系数
  30.     :param c:pq
  31.     :return:p,q
  32.     """
  33.     par = gmpy2.isqrt(b * b - 4 * a * c)
  34.     return (-b + par) // (2 * a), (-b - par) // (2 * a)
  35. def getGradualFra(cf):
  36.     """计算列表所有的渐近分数
  37.     :param cf: 连分数列表
  38.     :return: 该列表所有的渐近分数
  39.     """
  40.     gf = []
  41.     for i in range(1, len(cf) + 1):
  42.         gf.append(gradualFra(cf[:i]))
  43.     return gf
  44. def wienerAttack(e, n):
  45.     """
  46.     :param e:
  47.     :param n:
  48.     :return: 私钥d
  49.     """
  50.     cf = continuedFra(e, n)
  51.     gf = getGradualFra(cf)
  52.     for d, k in gf:
  53.         if k == 0: continue
  54.         if (e * d - 1) % k != 0:
  55.             continue
  56.         phi = (e * d - 1) // k
  57.         p, q = solve_pq(1, n - phi + 1, n)
  58.         if p * q == n:
  59.             return d
  60. n=
  61. e=
  62. c=
  63. d=wienerAttack(e, n)
  64. m=pow(c, d, n)
  65. print(libnum.n2s(m).decode())
复制代码
Standard commands
asn1parse         ca                ciphers           cms
crl               crl2pkcs7         dgst              dhparam
dsa               dsaparam          ec                ecparam
enc               engine            errstr            gendsa
genpkey           genrsa            help              list
nseq              ocsp              passwd            pkcs12
pkcs7             pkcs8             pkey              pkeyparam
pkeyutl           prime             rand              rehash
req               rsa               rsautl            s_client
s_server          s_time            sess_id           smime
speed             spkac             srp               storeutl
cast-cbc          cast5-cbc         cast5-cfb         cast5-ecb
cast5-ofb         des               des-cbc           des-cfb
des-ecb           des-ede           des-ede-cbc       des-ede-cfb
des-ede-ofb       des-ede3          des-ede3-cbc      des-ede3-cfb
des-ede3-ofb      des-ofb           des3              desx
idea              idea-cbc          idea-cfb          idea-ecb
idea-ofb          rc2               rc2-40-cbc        rc2-64-cbc
rc2-cbc           rc2-cfb           rc2-ecb           rc2-ofb
rc4               rc4-40            seed              seed-cbc
seed-cfb          seed-ecb          seed-ofb          sm4-cbc
sm4-cfb           sm4-ctr           sm4-ecb           sm4-ofb
  1. import libnum
  2. from gmpy2 import invert, gcd, iroot
  3. def op(x):
  4.     res = 1
  5.     for i in x:
  6.         res *= i
  7.     return res
  8. def CRT(m, a):
  9.     assert (len(m) == len(a))
  10.     M = op(m)
  11.     sum = 0
  12.     for m, a in zip(m, a):
  13.         Mi = M // m
  14.         ti = invert(Mi, m)
  15.         sum += a * ti * Mi
  16.     return sum % M
  17. def GCRT(m, a):
  18.     assert (len(m) == len(a))
  19.     curm, cura = m[0], a[0]
  20.     for m, a in zip(m[1:], a[1:]):
  21.         d = gcd(curm, m)
  22.         c = a - cura
  23.         assert (c % d == 0)
  24.         K = c // d * invert(curm // d, m // d)
  25.         cura += curm * K
  26.         curm = curm * m // d
  27.     return cura % curm
  28. e= 23
  29. n= [, , , , , , ]
  30. c= [, , , , , , ]
  31. m = CRT(n, c)
  32. m1 = iroot(m, e)  # 开e次方
  33. print(m1)
  34. print(libnum.n2s(int(m1[0])))
复制代码
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  指定输入是一个RSA公钥
-RSAPublicKey_out  Output is an RSAPublicKey  指定输出是一个RSA公钥
-noout             Don't print key out  不要打印输入的密钥内容
-text              Print the key in text  用文本格式打印密钥内容
-modulus           Print the RSA key modulus  打印RSA密钥的模数
-check             Verify key consistency   检测密钥是否一致
-*                 Any supported cipher  其他参数
-pvk-strong        Enable 'Strong' PVK encoding level (default)  启用“强”PVK编码级别(默认)
-pvk-weak          Enable 'Weak' PVK encoding level  启用“弱”PVK编码级别
-pvk-none          Don't enforce PVK encoding  不强制执行PVK编码
-engine val        Use engine, possibly a hardware device  指定解析引擎
  1. import binascii,gmpy2
  2. from functools import reduce
  3. import libnum
  4. def CRT(mi, ai):
  5.     assert(reduce(gmpy2.gcd,mi)==1)
  6.     assert (isinstance(mi, list) and isinstance(ai, list))
  7.     M = reduce(lambda x, y: x * y, mi)
  8.     ai_ti_Mi = [a * (M // m) * gmpy2.invert(M // m, m) for (m, a) in zip(mi, ai)]
  9.     return reduce(lambda x, y: x + y, ai_ti_Mi) % M
  10. e= 23
  11. n= [, , , , , , ]
  12. c= [, , , , , , ]
  13. m=gmpy2.iroot(CRT(n, c), e)[0]
  14. print(m)
  15. print(libnum.n2s(int(m)))
复制代码
openssl rsa -in key.pem -inform PEM
  1. import libnum
  2. import gmpy2
  3. e= 65537
  4. n1=
  5. n2=
  6. c1=
  7. c2=
  8. #求最大公约数
  9. q=gmpy2.gcd(n1,n2)
  10. p1=n1//q
  11. phi_n=(q-1)*(p1-1)
  12. #求逆元d
  13. d1=libnum.invmod(e,phi_n)
  14. m=pow(c1,d1,n1)
  15. print(m)
  16. #数字转字节,转字符串
  17. print(libnum.n2s(int(m)).decode())
复制代码
openssl rsa -in key.pem -inform PEM -text
  1. #coding:utf-8
  2. import libnum
  3. import gmpy2
  4. n=
  5. e= 65537
  6. dp=
  7. c=
  8. for i in range(1,65535):
  9.     p=(dp*e-1)//i+1
  10.     if n%p==0:
  11.         q=n//p
  12.         break
  13. print(p)
  14. print(q)
  15. phi_n= (p-1)*(q-1)
  16. d=gmpy2.invert(e,phi_n)
  17. m=pow(c,d,n)
  18. print(m)
  19. flag=libnum.n2s(int(m)).decode()
  20. print(flag)
复制代码
RSA Private-Key: (1023 bit, 2 primes)
modulus:
70:64:78:79:fa:43:ae:e8:a5:d3:78:57:54:b7:98:
8d:12:b1:4b:98:cf:39:be:21:b5:d9:0f:3e:32:64:
e3:16:cf:99:c3:05:8b:89:48:0f:2b:46:a0:ed:a9:
be:e6:b4:d7:53:19:96:71:ef:17:ba:b4:ec:25:7a:
ab:e4:5e:7e:b6:f6:68:14:65:97:a0:c9:a0:5d:05:
23:e7:51:1e:88:52:a7:6e:aa:92:e8:1d:16:af:ac:
7a:f5:22:42:3a:a0:09:83:11:0c:e2:d6:50:99:d3:
7c:74:8c:c2:ae:a0:e2:a9:f4:b0:61:3f:d8:a3:0a:
8c:bd:89:18:7d:b4:7f:85
publicExponent: 65537 (0x10001)
privateExponent:
2f:2e:7e:44:f6:82:a3:52:97:0a:87:62:61:f6:10:
dc:68:14:75:9f:d8:9e:6c:ea:c9:e4:2d:39:f6:fd:
d3:37:28:3f:6c:57:4f:94:79:e3:a4:4f:2a:0f:9b:
4a:c0:9e:fa:25:b0:80:2f:a4:27:5a:01:c9:80:92:
56:c6:af:c4:03:2f:fd:48:6f:9e:02:96:81:a3
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表