PwnTheBox 刷题记录crypto篇

PwnTheBox 刷题记录crypto篇

简单

1、佛法

先与佛论禅在线解密:与佛论禅
在这里插入图片描述再base64解密,得到乱码

.¤.|)
.©9.©
.p
.©
]i
.©.

在这里插入图片描述
凯撒密码用密钥23加密后再base64解密得到flag(看wp才知道,这里可以用爆破,flagbase64加密后的内容为ZmxhZw==)
在这里插入图片描述

2、Caesar

阅读python代码

import hashlib

def change(key, str):
    result = ""
    for i in str:
        if ord(i) >= 97 and ord(i) <= 122:
            result += chr(97+(ord(i)+key) % 26)
        else:
            result += i
    return result

key = *
str1 = "********************************"
str2 = change(key, str1)  # zab81501z9740b67dc0by8z15093a426
flag = hashlib.md5(str1).hexdigest()
print(flag[10:16])  # aebc0a

首先定义一个函数,遍历str里面的字符,当字符的ascii值在给定范围内时就加上key再模26(97-122为大小写英文字符),key和str1未知,str2是str1加密后的结果,flag为str1MD5加密后的结果,并给了flag的部分字符
解密脚本

import hashlib
from opcode import hasjrel
def change(key, str):
    result = ""
    for i in str:
        if ord(i) >= 97 and ord(i) <= 122:
            result += chr(97+(ord(i)+key) % 26)
        else:
            result += i
    return result
for realKey in range(26):
    str1 = "zab81501z9740b67dc0by8z15093a426"
    str2 = change(realKey, str1)
    md  = hashlib.md5()
    md.update(str2.encode('utf-8'))
    flag = md.hexdigest()
    if flag[10:16] == 'aebc0a':
        print('flag{' + flag + '}')

# flag{8f36ba62b0aebc0ae2a9c7abea36f7ef}

3、栅栏

在这里插入图片描述

4、jsfuck

进入网站,按f12,将js编码放入控制台(console)回车后会弹出flag
在这里插入图片描述
flag{hello javascript}

5、Url

直接url解码
在这里插入图片描述
flag{and 1=1}

6、hill
Can you climb this hill?
17 17 5 21 18 21 2 2 19
ygc

通过网上的加密脚本加密ygc得到flag

import numpy as np
import sys


# 判断矩阵是否存在逆矩阵
def judge_inverse_matrix(matrix):
    try:
        np.linalg.inv(matrix)
    except:
        return False
    return True


# 输入列表并转换为矩阵
def inputmatrix():
    row_num = int(input("请输入矩阵的行数:"))
    all_list = []
    for i in range(1, row_num + 1):
        row = input(f"请输入加密矩阵第{i}行(以空格为分隔):")
        if row[0] == ' ':
            print("输入有误,第一位不该为空格")
            sys.exit()
        else:
            row_list = row.split(' ')
        # 将列表中str转换为int
        if len(row_list) == row_num:
            for n in row_list:
                row_list[row_list.index(n)] = int(row_list[row_list.index(n)])
            all_list.append(row_list)
        else:
            print("前后输入的行数不一致,请重修输入")
            break
    encrypt_matrix = np.array(all_list)
    if not judge_inverse_matrix(encrypt_matrix):
        print("该矩阵不存在逆矩阵,请重修输入")
    return encrypt_matrix


# 生成矩阵的逆矩阵。如果逆矩阵含有小数,就四舍五入
def generate_inverse_matrix(matrix):
    inverse_matrix = np.linalg.inv(matrix)
    for row in inverse_matrix:
        for num in row:
            num = round(num)
    print("加密矩阵的逆矩阵为:")
    for array in inverse_matrix:
        print(array)
    return inverse_matrix


# 生成字母-数字对应的字典
def alphabet_number():
    alphabet_number_dict = {}
    for i in range(97, 123):
        alphabet_number_dict[chr(i)] = i % 97
    return alphabet_number_dict


def encrypt():
    # 明文字母转换成对应数字
    input_plaintext = input("请输入明文:")
    num_list = []
    dic = alphabet_number()
    for i in input_plaintext:
        num_list.append(dic[i])

    # 如果矩阵行数不能整除明文,则用'z'的数字25补全
    matrix = inputmatrix()
    row_num = len(matrix)
    supple_num = row_num - (len(num_list) % row_num)
    if len(num_list) % row_num != 0:
        for n in range(1, supple_num + 1):
            num_list.append(25)
    print(f"\n添加了{supple_num}个z补全明文")

    # 分组加密
    group_num = int(len(num_list) / row_num)
    whole_encrypt_num_list = []
    for g in range(0, group_num):
        plaintext_matrix = np.array(num_list[0 + g * row_num: (g + 1) * row_num])
        encrypt_num_list = np.matmul(plaintext_matrix, matrix)
        for num in encrypt_num_list:
            whole_encrypt_num_list.append(num)

    # 将加密后的数字转换为字母
    ciphertext = ""
    for ennum in whole_encrypt_num_list:
        # 对超出范围的数字取模
        if ennum > 25:
            ennum = ennum % 26
        for k in dic:
            if dic[k] == ennum:
                ciphertext = ciphertext + k
    print("加密后密文为:", ciphertext, '\n')


def decrypt():
    # 输入密文并转换为对应数字
    input_ciphertext = input("请输入密文:")
    num_list2 = []
    dic2 = alphabet_number()
    for i in input_ciphertext:
        num_list2.append(dic2[i])

    # 解密就不添加'z'来补全密文了
    matrix = inputmatrix()
    row_num2 = len(matrix)
    supple_num2 = row_num2 - (len(num_list2) % row_num2)

    # 用逆矩阵分组解密
    inserve_matrix = generate_inverse_matrix(matrix)
    group_num2 = int(len(num_list2) / row_num2)
    whole_decrypt_num_list = []
    for g in range(0, group_num2):
        plaintext_matrix = np.array(num_list2[0 + g * row_num2: (g + 1) * row_num2])
        decrypt_num_list = np.matmul(plaintext_matrix, inserve_matrix)
        for num in decrypt_num_list:
            whole_decrypt_num_list.append(num)

    # 将解密后的数字转换为对应字母
    plaintext = ""
    for denum in whole_decrypt_num_list:
        if denum > 25 or denum < -26:
            denum = denum % 26

        # 防止取模后是负数,字典中找不到对应的字母
        if denum < 0:
            denum = denum + 26
        # 字典中寻找与数字对应的字母
        for k in dic2:
            if dic2[k] == denum:
                plaintext = plaintext + k
    print("解密后明文为:", plaintext, '\n')


if __name__ == '__main__':
    while True:
        print("========Hill密码========\n")
        print("1.加密\n2.解密\n")
        print("注意:如果输入矩阵的逆矩阵中含有小数,采用四舍五入的方法\n")
        pattern = input("请选择模式:")
        if pattern == '1':
            encrypt()
        elif pattern == '2':
            decrypt()
        else:
            print("输入有误,请重修输入")

运行结果
在这里插入图片描述得到flag
flag{say}

7、Morse

摩斯密码解码
在这里插入图片描述
再十六进制解码
在这里插入图片描述
得到flag:afctf{1s’t_s0_345y}

8、Vigenère

通过网站破解没有密码的维吉尼亚密码,在解出来的文本中搜索flag
解密网站
在这里插入图片描述在这里插入图片描述afctf{Whooooooo_U_Gotcha!}

9、来题中等的吧

摩斯密码解密
flag{ALPHALAB}

10、栅栏

TEESCPEHRIAIHR
栅栏解密:THEREISACIPHER
在这里插入图片描述flag{THEREISACIPHER}

11、回转

先rot13再base64
FlagIS6cvkrhFpVEHAK8Ap

12、来题简单的吧

摩斯密码解码
MORSECODE

13、caesar

凯撒密码爆破
flagiscaesar

14、warmup1

密文:llkjmlmpadkkc
密钥:thisisalilkey
通过维吉尼亚解密得到flag
secretmessage

15、warmup2

rot13解密
picoCTF{this_is_crypto!}

16、simpleCrypto

在这里插入图片描述用密码:zheshimima解压缩,得到flag
flag{5a851c56-75a3-4899-911b-0bb48bc31a52}

17、4进制更安全
题目:
1212 1230 1201 1213 1323 1012 1233 1311 1302 1202 1201 1303 1211 301 302 303 1331

解题脚本
list = "1212 1230 1201 1213 1323 1012 1233 1311 1302 1202 1201 1303 1211 301 302 303 1331"
dict = list.split(" ")   #用空格对list分片
flag = ""
for i in dict:
    flag+=chr(int(i,4))    
#base存在时,视 x 为 base 类型数字,并将其转换为 10 进制数字,base默认为10,这里base=4
print(flag)

flag{Fourbase123}
18、easy_crypto
0010 0100 01 110 1111011 11 11111 010 000 0 001101 1010 111 100 0 001101 01111 000 001101 00 10 1 0 010 0 000 1 01111 10 11110 101011 1111101

通过摩斯密码解密,再转换为小写
在这里插入图片描述
flag{m0rse_code_1s_interest1n9!}

19、RSA
4153372421328787064168548641845708183921443446990158572506114559735441950501706984118235944441928889749083563790293558028143373121367441549974248211570336802004821051820943229232421937298269855190652251294220483768084460779714162849925877879859830009443131489814222929347727735616113359695228615432020363240247474622132986939108457393618346100033147945959684443762976681454755482192433993286205527003029269574787026484389622816932835184754540312561890719407986296481186847292967270288752616

将给的数分解大素数,得到

16074357572745018593418837326290993512421736655307780242162599660198598253230550168811761868953242350136362894008095983571749530656901163555918436741973772511575306

将该数字转换成字节数据,得到b’Guvf vf gur cnffjbeq lbh arrq sbe gur MVC svyr: synt{efnZ0erQ33crE}\n’


from Crypto.Util.number import *
str1 = 16074357572745018593418837326290993512421736655307780242162599660198598253230550168811761868953242350136362894008095983571749530656901163555918436741973772511575306
str2 = long_to_bytes(str1)
print(str2)


b'Guvf vf gur cnffjbeq lbh arrq sbe gur MVC svyr: synt{efnZ0erQ33crE}\n'

再将得到的字符串synt{efnZ0erQ33crE}进行凯撒密码爆破得到flag
flag{rsaM0reD33peR}

20、古典密码

先通过basecrack.py解密后得到 CLF{TCAASISCLWASPSOEDARRIETENRS}INTG
在这里插入图片描述然后六个字符一分组

0    1    2   3   4    5
C    L    F   {   T    C
A    A    S   I   S    C
L    W    A   S   P    S
O    E    D   A   R    R
I    E    T   E   N    R
S    }    I   N   T    G

根据特征CTF{},按照042351排列,得到flag

0      4      2      3	   5     1
C      T      F      {	   C      L	
A      S      S      I	   C      A	
L      P      A      S	   S      W
O      R      D      A     R      E
I      N      T      E	   R      E
S      T      I      N	   G      }

CTF{CLASSICALPASSWORDAREINTERESTING}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值