目录

[WUSTCTF2020]大数计算

[网鼎杯 2020 青龙组]you_raise_me_up

[UTCTF2020]basic-crypto

[WUSTCTF2020]情书

[HDCTF2019]together

[WUSTCTF2020]dp_leaking_1s_very_d@angerous

[AFCTF2018]BASE

[BJDCTF2020]Polybius

坏蛋是雷宾

[NPUCTF2020]Classical Cipher

[BJDCTF2020]编码与调制

四面八方


[WUSTCTF2020]大数计算

part1用math库中的factorial函数,part2用pow函数,part3中,x = -80538738812075974 ,y = 80435758145817515 , z = 12602123297335631,part4利用高数知识,代码如下:

import math'''n = int(input())
res1 = math.factorial(n)
print(res1)'''
part1 = hex(int('38609695',10))
print(part1)'''res2 = pow(520,1314) + pow(2333,666)
print(res2)'''
part2 = hex(int('67358675',10))
print(part2)'''x = 80538738812075974
y = 80435758145817515
z = 12602123297335631
res3 = x + y + z
print(res3)'''
part3 = hex(int('17357662',10))
print(part3)'''res4 = 520*1314
print(res4)'''
part4 = hex(int('683280',10))
print(part4)

[网鼎杯 2020 青龙组]you_raise_me_up

题目:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Crypto.Util.number import *
import randomn = 2 ** 512
m = random.randint(2, n-1) | 1
c = pow(m, bytes_to_long(flag), n)
print 'm = ' + str(m)
print 'c = ' + str(c)# m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075
# c = 6665851394203214245856789450723658632520816791621796775909766895233000234023642878786025644953797995373211308485605397024123180085924117610802485972584499

这一题的关键在于c = pow(m, bytes_to_long(flag), n),即c = m^flag % n,即m^flag = c%n,其中,m、c、n都是已知的,了解到,这是离散对数问题

a^x ≡ b (mod m)
求解x

利用sympy库中的discrete_log(x,y,z)函数可求解,x:模数,y:余数,z:底数

代码如下:

from Crypto.Util.number import *
import sympy
import binasciim = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075
c = 6665851394203214245856789450723658632520816791621796775909766895233000234023642878786025644953797995373211308485605397024123180085924117610802485972584499
n = 2 ** 512flag = sympy.discrete_log(n, c, m)
print(long_to_bytes(flag))

[UTCTF2020]basic-crypto

给了一堆2进制编码,先转ASCII,得到:

根据第一段的提示,知道接下来是base64,再转:

又有提示:你可能会想找罗马人。与罗马人有关的加密应该就是凯撒加密了,用脚本解出:

因为原文太长了,用脚本得分开。再次根据提示(读懂英文内容!),知道是替换加密,用在线网站再次解得:https://quipqiup.com/

终于没得了。

[WUSTCTF2020]情书 

Encryption:即为c,Public Key中的分别位n和e(公钥),Private Key中的分别位n和d(私钥)

通过枚举字母表求解,代码如下:

import gmpy2
from Crypto.Util.number import *a = "abcdefghijklmnopqrstuvwxyz"
c = '0156 0821 1616 0041 0140 2130 1616 0793'.split(' ')#这一步很关键
n = 2537
e = 13
d = 937flag = ''
for i in c:i = int(i)m = gmpy2.powmod(i,d,n)flag += a[m]
print(flag)
#好像不需要知道p、q以及n的欧拉函数,就不求了

[HDCTF2019]together

题目:

先用在线网站提取公钥:

pubkey1:

pubkey2:

发现n都相同,故猜测是共模攻击

再看两个flag,看到 末尾的==,以为是base64,然后搞不出来,看了大佬的wp:

base64是一种编码方式而不是一种加密算法,所以将他转换成unicode编码,然后再转换成数,最后结合共模攻击即可,代码如下:

import base64
from Crypto.Util.number import *
from gmpy2 import *
import binasciif1 = 'R3Noy6r3WLItytAmb4FmHEygoilucEEZbO9ZYXx5JN03HNpBLDx7fXd2fl+UL5+11RCs/y0qlTGURWWDtG66eNLzGwNpAKiVj6I7RtUJl2Pcm3NvFeAFwI9UsVREyh7zIV6sI9ZP8l/2GVDorLAz5ULW+f0OINGhJmZm8FL/aDnlfTElhQ87LPicWpXYoMtyr6WrxjK6Ontn8BqCt0EjQ7TeXZhxIH9VTPWjDmFdmOqaqdVIT+LZemTgLNESwM5nn4g5S3aFDFwj1YiDYl0/+8etvKfOrfoKOwR0CxsRHagwdUUTES8EcHLmMGCxCkDZn3SzmmA6Nb3lgLeSgG8P1A=='
f2 = 'O+rRCXI3aTB6P1rYIOPUdalUp6ujpwEq4I20CoWA+HIL8xxGtqY6N5gpr0guZv9ZgOEAMFnBxOqMdVNnB9GgnhmXtt1ZWydPqIcHvlfwpd/Lyd0XSjXnjaz3P3vOQvR71cD/uXyBA0XPzmnTIMgEhuGJVFm8min0L/2qI7wg/Z7w1+4mOmi655JIXeCiG23ukDv6l9bZuqfGvWCa1KKXWDP31nLbp0ZN2obUs6jEAa1qVTaX6M4My+sks+0VvHATrAUuCrmMwVEivqIJ/nS6ymGVERN6Ohnzyr168knEBKOVj0FAOx3YLfppMM+XbOGHeqdKJRLpMvqFXDMGQInT3w=='c1 = bytes_to_long(base64.b64decode(f1))
c2 = bytes_to_long(base64.b64decode(f2))#先转Unicode编码,再转成数
e1 = 2333
e2 = 23333
n = 14853081277902411240991719582265437298941606850989432655928075747449227799832389574251190347654658701773951599098366248661597113015221566041305501996451638624389417055956926238595947885740084994809382932733556986107653499144588614105694518150594105711438983069306254763078820574239989253573144558449346681620784979079971559976102366527270867527423001083169127402157598183442923364480383742653117285643026319914244072975557200353546060352744263637867557162046429886176035616570590229646013789737629785488326501654202429466891022723268768841320111152381619260637023031430545168618446134188815113100443559425057634959299s = gcdext(e1, e2)  # 扩展欧几里得算法,得到x,y,即ax+by=gcd(a,b)m1 = pow(c1, s[1], n)
m2 = pow(c2, s[2], n)m = (m1 * m2) % n
print(binascii.unhexlify(hex(m)[2:]))

[WUSTCTF2020]dp_leaking_1s_very_d@angerous

dp泄露题型,直接上代码:

import gmpy2
import binascii
from Crypto.Util.number import *e = 65537
n = 156808343598578774957375696815188980682166740609302831099696492068246337198792510898818496239166339015207305102101431634283168544492984586566799996471150252382144148257236707247267506165670877506370253127695314163987084076462560095456635833650720606337852199362362120808707925913897956527780930423574343287847
c = 108542078809057774666748066235473292495343753790443966020636060807418393737258696352569345621488958094856305865603100885838672591764072157183336139243588435583104423268921439473113244493821692560960443688048994557463526099985303667243623711454841573922233051289561865599722004107134302070301237345400354257869
dp = 734763139918837027274765680404546851353356952885439663987181004382601658386317353877499122276686150509151221546249750373865024485652349719427182780275825for i in range(1, e):  # 在范围(1,e)之间进行遍历if (dp * e - 1) % i == 0:if n % (((dp * e - 1) // i) + 1) == 0:  # 存在p使得n能被p整除p = ((dp * e - 1) // i) + 1q = n // (((dp * e - 1) // i) + 1)phi_n = (q - 1) * (p - 1)d = gmpy2.invert(e, phi_n)m = pow(c, d, n)print(binascii.unhexlify(hex(m)[2:]))

[AFCTF2018]BASE

给了一个有很长字符串的文件,观察发现,字符串内仅有0-9,A-F,猜测是16进制,用在线网站解码,

 看到末尾有=,进行base64解码,多次后仍有=,以及乱码,回望题目BASE,猜测要么是base32,要么是base16,借鉴大佬们的代码:

import base64
#选自己的路径
with open(r'C:\Users\lenovo\Desktop\flag_encode.txt', 'r', encoding='utf-8') as f:for a in f:while 1:try:a = base64.b64decode(a).decode("utf-8")except:passtry:a = base64.b32decode(a).decode("utf-8")except:passtry:a = base64.b16decode(a).decode('utf-8')except:passif "{" in a:print(a)break

[BJDCTF2020]Polybius 

题目:

看到提示后面有=,用base64解码:

得到长度

大佬wp:http://t.csdn.cn/4K7en

import itertools
s="aeoiu"
sumresult=[]
numsumresult=[]
ciper="ouauuuoooeeaaiaeauieuooeeiea"
for i in itertools.permutations(s,5):#找出所有全排列sumresult.append("".join(i))
for i in sumresult:temp=""for j in ciper:temp+=str(i.index(j)+1)numsumresult.append(temp)
for i in numsumresult:ans_=""for j in range(0, len(i),2):xx=(int(i[j])-1)*5+int(i[j+1])+96if xx>ord('i'):xx+=1ans_+=chr(xx)print(ans_)

坏蛋是雷宾

雷宾加密算法,没遇过,学习学习:

Rabin算法是一种基于模平方和模平方根的非对称加密算法,属于rsa加密中的一类。在rsa加密中,公钥 e 满足 1<e<φ(n),且gcd(e,φ(n))=1。而在Rabin密码中,e=2。
密钥生成过程:

1、取两个大的不同素数 p与q ,p、q都同余3模4,即p≡q≡3mod4(p、q作私钥)
2、计算n = p ∗ q(n作公钥)

加密过程:

c ≡   mod  n

解密过程:(参考:http://t.csdn.cn/lmKHt)

故需要在四个解中,找到二进制符合题目的解

解题:

首先分解n得到p、q:

接着计算r1、r2、r3、r4,然后输出2进制形式,与校验码对应,找到正确的,接着将去掉6位校验码的部分进行md5解密,用在线网站和脚本均可:

import gmpy2
import hashlibn = 523798549
c = 162853095
yz = 110001
p = 49123
q = 10663mp = gmpy2.powmod(c,(p+1)//4,n)
mq = gmpy2.powmod(c,(q+1)//4,n)yp = gmpy2.invert(p,q)
yq = gmpy2.invert(q,p)r1 = (yp*p*mq + yq*q*mp) % n
r2 = n - r1
r3 = (yp*p*mq - yq*q*mp) % n
r4 = n - r3print(bin(r1)[2:])
print(bin(r2)[2:])
print(bin(r3)[2:])
print(bin(r4)[2:])m = '10010011100100100101010'#去掉后面6位的校验码
mc = str(int(m,2))#转10进制,转为10进制后就可用在线网站解
md = hashlib.md5()
md.update(mc.encode("utf8"))
flag = md.hexdigest()
print(flag)

 [NPUCTF2020]Classical Cipher

压缩包里的压缩包被加密了,这里需要解出明文,

直接进行词频分析:

解开之后得到:

猪圈和另一种动物加密:

一一对应得到flag:classicalcode

[BJDCTF2020]编码与调制

根据提示知道是曼彻斯特编码,利用在网上找的曼彻斯特解码器。使用方法:先将密文放入16进制栏中,下面选择‘标准曼切斯特’,按照1、2、3的顺序依次进行,最后将得到的16进制转字符串即可

 四面八方

题目:

四方密码是一种对称式加密法

加密过程:

用4个5×5的矩阵来加密。每个矩阵都有25个字母(通常会取消Q或将I,J视作同一样,或改进为6×6的矩阵,加入10个数字)。

首先选择两个英文字作密匙,例如example和keyword。对于每一个密匙,将重复出现的字母去除,即example要转成exampl,然后将每个字母顺序放入矩阵,再将余下的字母顺序放入矩阵,便得出加密矩阵。

将这两个加密矩阵放在右上角和左下角,余下的两个角放a到z顺序的矩阵:

加密的步骤:

两个字母一组地分开讯息:(例如hello world变成he ll ow or ld);

找出第一个字母在左上角矩阵的位置;

同样道理,找第二个字母在右下角矩阵的位置;

找右上角矩阵中,和第一个字母同行,第二个字母同列的字母;

找左下角矩阵中,和第一个字母同列,第二个字母同行的字母;

得到的这两个字母就是加密过的讯息。

参考:https://baike.baidu.com/item/%E5%9B%9B%E6%96%B9%E5%AF%86%E7%A0%81/2250168

对此题,

key1:security 对应 密钥1:securityabdfghklmnopqvwxz

key2:information --》informat(删除重复字母)对应 密钥2:informatbcdeghklpqsuvwxyz

不好敲表格,手写算了:

密钥1,密钥2得到过程,先写下删掉重复字母的key1、key2,然后按照字母顺序白写a-z,key中出现的字母不需要再写。

得到两个密钥过后,可以利用在线网站解:

得到的结果明显不是一串通顺语义字符串,看了大佬们的wp后,知道是youngandsuccessful

也可以用脚本,借鉴了大佬的代码:

#coding:utf-8
import collections
import rematrix = 'ABCDEFGHIJKLMNOPRSTUVWXYZ'
pla = 'abcdefghijklmnoprstuvwxyz'
key1 = '[SECURITY]'
key2 = '[INFORMATION]'
key1 = ''.join(collections.OrderedDict.fromkeys(key1))
key2 = ''.join(collections.OrderedDict.fromkeys(key2))matrix1 = re.sub('[\[\]]','',key1) + re.sub(key1,'',matrix)
matrix2 = re.sub('[\[\]]','',key2) + re.sub(key2,'',matrix)matrix_list1 = []
matrix_list2 = []
pla_list = []
for i in range(0,len(matrix1),5):matrix_list1.append(list(matrix1[i:i+5]))
#print matrix_list1for i in range(0,len(matrix2),5):matrix_list2.append(list(matrix2[i:i+5]))
#print matrix_list2for i in range(0,len(pla),5):pla_list.append(list(pla[i:i+5]))
#print pla_list#查询两个密文字母位置
def find_index1(x):for i in range(len(matrix_list1)):for j in range(len(matrix_list1[i])):if matrix_list1[i][j] == x:return i,j
def find_index2(y):for k in range(len(matrix_list2)):for l in range(len(matrix_list2[k])):if matrix_list2[k][l] == y:return k,ldef gen_pla(letter):#两个子母中第一个字母位置first = find_index1(letter[0])#两个子母中第二个字母位置second = find_index2(letter[1])pla = ''pla += pla_list[first[0]][second[1]]pla += pla_list[second[0]][first[1]]return pladef main():cip = 'ZHNJINHOOPCFCUKTLJ'pla = ''for i in range(0,len(cip),2):pla += gen_pla(cip[i:i+2])print(pla)if __name__ == '__main__':main()

BUUCTF——CRYPTO(记录不熟悉的题)(4)相关推荐

  1. BUUCTF——CRYPTO(记录不熟悉的题)(2)

    目录 达芬奇密码 rot [WUSTCTF2020]佛说:只能四天 这是什么 [MRCTF2020]古典密码知多少 [NCTF2019]Keyboard 传感器 [MRCTF2020]天干地支+甲子 ...

  2. 记录考研英语一真题单词汇总及APP制作

    记录考研英语一真题单词汇总及APP制作 很高兴在此记录我第一个拥有著作权的书,以及自己做的第一个APP(软件著作权还在申请中). 著作权证书如下: 2020年考研结束便很想做一个真题单词本.因为考研时 ...

  3. buuctf解题记录

    buuctf解题记录 Basic 1. Linux labs Ssh连接查看目录 2.BUU LFI COURSE 1 打开环境 是一道文件包含题 进行get传参 构造payload: http:// ...

  4. [buuctf] crypto全解——前84道(不建议直接抄flag)

    buuctf crypto 1.MD5 2.Url编码 3.一眼就解密 4.看我回旋踢 5.摩丝 6.[BJDCTF 2nd]签到-y1ng 7.password 8.变异凯撒 9.Quoted-pr ...

  5. 记录一下自己刷题的错题

    记录一下自己刷题的错题 1.小v所在的公司即将举行年会,年会方案设计过程中必不可少的一项就是抽奖活动.小v在本次活动中被委以重任,负责抽奖活动的策划:为了让中奖的礼物更加精美且富有神秘感,打算采用礼品 ...

  6. BUUCTF Crypto Rabbit

    BUUCTF Crypto Rabbit 1.一个新的加密方式 2.下载题目 3.拿到在线[网站](http://www.jsons.cn/rabbitencrypt/)解密 1.一个新的加密方式 r ...

  7. [buuctf]crypto刷题学习记录(1-22)

    目录 一.MD5 二.Url编码 三.看我回旋踢 四.一眼就解密 五.摩丝 六.[BJDCTF 2nd]签到-y1ng 七.[BJDCTF 2nd]password 八.变异凯撒 九.Quoted-p ...

  8. 庆祝祖国成立72周年 做点题目之 BUUCTF Crypto 刷题

    BUUCTF 刷题之 Crypto 部分wp 大二了,事情很多,省赛在即,速刷题,强技能,展风采! 文章目录 BUUCTF 刷题之 Crypto 部分wp 一.这是什么 二.[HDCTF2019]bb ...

  9. BUUCTF Crypto题目记录

    MD5 e00cf25ad42683b3df678c61f42c6bda 进行MD5加密 flag{admin1} Url编码 %66%6c%61%67%7b%61%6e%64%20%31%3d%31 ...

最新文章

  1. python io流a+_Python基础——文件操作及IO流
  2. 掌握 Ajax,第 8 部分: 在请求和响应中使用 XML
  3. Java this关键字
  4. Android 开发(一)项目概况
  5. 自建CDN Xnign产品指标
  6. java 串的顺序存储_算法入门之串的顺序存储表示
  7. 今年美国什么工作最吃香?程序猿薪酬超医生
  8. 分众传媒的连夜雨和消化不良症
  9. Ubuntu的超宽屏支持2560*1080
  10. 算法-粒子群算法-Matlab实现
  11. c++标准程序库:STL容器之map
  12. Hbase-1.1.1-java API
  13. Linux基础----gcc工具的使用
  14. Python 多重共线性检验
  15. 计算机画图保存的图片怎么找到,想知道电脑截图保存在哪儿找
  16. 南大和中科大计算机哪个好,南京大学和中国科技大学哪个更好?
  17. 易代账好会计zip导入提示不平衡
  18. 秒换算 天 时 分 秒
  19. 视唱练耳训练小程序开发,摆脱传统训练制约性
  20. Android学习网址大全

热门文章

  1. 转:管理者必备技能之全局观:找出复杂环境中的秩序
  2. Linux虚拟机下FTP服务器的搭建(详细)
  3. 齿坯基准面径向和端面圆跳动公差(μm)
  4. 在线android机型测试,免费兼容测试/MonkeyTest/100款安卓机型真机测试
  5. 漫画人脸检测 | 全局和局部信息融合的深度神经网络(文末源码)
  6. 第十一章 性能与可伸缩性(待续)
  7. uniapp 标签技能多选 最多选三个
  8. 成功帮我拿3家大厂offer(阿里、美团、虾皮),这份Java面试宝典,简直神了
  9. 微信小程序在线知识答题有奖多开版源码
  10. (KWS-LSTM)Max-pooling loss training of long short-term memory networks for small-footprint keyword s