CryptoHack 简介
CryptoHack 简介
文章目录
- CryptoHack 简介
- 一、python的安装,运行
- 二、ASCII码
- 三、十六进制
- 四、Base64
- 五、字节和大整数
- 六、XOR
- 1.基本
- 2.xor属性
- 3.xor隐藏字节
- 4.cryptohack——You either know, XOR you don't
一、python的安装,运行
二、ASCII码
-
chr()
函数可用于将 ASCII 序数转换为字符(该ord()
函数执行相反的操作)。 -
a=[99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 110, 116, 52, 98, 108, 51, 125] for i in range(len(a)):print(chr(a[i])) #crypto{ASCII_pr1nt4bl3}
三、十六进制
-
首先,根据 ASCII 表将每个字母转换为序数。然后将十进制数转换为以 16 为基数的数字,也称为十六进制。这些数字可以组合在一起,形成一个长的十六进制字符串。
-
在 Python 中,该
bytes.fromhex()
函数可用于将十六进制转换为字节。.hex()
可以对字节字符串调用实例方法来获取十六进制表示形式。 -
a="63727970746f7b596f755f77696c6c5f62655f776f726b696e675f776974685f6865785f737472696e67735f615f6c6f747d" print(bytes.fromhex(a)) #b'crypto{You_will_be_working_with_hex_strings_a_lot}'
四、Base64
-
Base64,它允许我们使用 64 个字符的字母表将二进制数据表示为 ASCII 字符串。Base64 字符串的一个字符编码 6 个二进制数字(位),因此 Base64 的 4 个字符编码 3 个 8 位字节。
-
在 Python 中,使用 导入 base64 模块后
import base64
,即可使用该base64.b64encode()
函数。请记住先解码十六进制,如挑战描述所述。 -
import base64 a="72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf" print(base64.b64encode(bytes.fromhex(a))) #crypto/Base+64+Encoding+is+Web+Safe/
五、字节和大整数
-
最常见的方法是获取消息的序数字节,将其转换为十六进制,然后连接起来。这可以解释为 16 进制/十六进制数字,也可以用 10 进制/十进制表示。
-
消息:HELLO
ascii 字节:[72, 69, 76, 76, 79]
十六进制字节:[0x48, 0x45, 0x4c, 0x4c, 0x4f]
十六进制:0x48454c4c4f
十进制:310400273487 -
Python 的 PyCryptodome 库使用方法
bytes_to_long()
和来实现这一点long_to_bytes()
。您首先必须安装 PyCryptodome 并使用导入它from Crypto.Util.number import *
-
from Crypto.Util.number import * a=11515195063862318899931685488813747395775516287289682636499965282714637259206269 print(long_to_bytes(a)) b'crypto{3nc0d1n6_4ll_7h3_w4y_d0wn}'
六、XOR
1.基本
- 对于较长的二进制数,我们逐位进行异或:
0110 ^ 1010 = 1100
。我们可以先将整数从十进制转换为二进制,然后对整数进行异或。我们可以先将每个字符转换为表示 Unicode 字符的整数,然后对字符串进行异或。 - 给定字符串
label
,将每个字符与整数13进行异或。将这些整数转换回字符串并将标志提交为crypto{new_string}
。Pythonpwntools
库有一个方便的xor()
函数,可以将不同类型和长度的数据异或在一起。但首先,您可能需要实现自己的函数来解决这个问题。
from pwn import xor# 定义字符串
label = "label"# 将字符串转换为字节
label_bytes = label.encode()# 使用 pwntools 的 xor 函数进行 XOR 操作
new_bytes = xor(label_bytes, 13)# 将结果转换回字符串
new_string = new_bytes.decode()# 格式化输出
flag = f"crypto{{{new_string}}}"
print(flag)
2.xor属性
使用 XOR 运算符解决挑战时,我们应该考虑四个主要属性
交换律:A ⊕ B = B ⊕ A
结合律:A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C恒
等式:A ⊕ 0 = A
自逆:A ⊕ A = 0
from pwn import xork1=bytes.fromhex("a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313")
k12=bytes.fromhex("37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e")
k2=xor(k1,k12)
k23=bytes.fromhex(" c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1")
k3=xor(k2,k23)
flag_xor=bytes.fromhex("04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf")
flag=xor(k1,k2,k3,flag_xor)
print(flag)
#b'crypto{x0r_i5_ass0c1at1v3}'
3.xor隐藏字节
#我使用 XOR 与单个字节隐藏了一些数据,但该字节是秘密。别忘了先从十六进制解码。#73626960647f6b206821204f21254f7d694f7624662065622127234f726927756dfrom pwn import xor# 已知的十六进制加密数据
encrypted_hex = "73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d"
encrypted_bytes = bytes.fromhex(encrypted_hex)# 尝试所有可能的单字节密钥
for key in range(256):decrypted = xor(encrypted_bytes, key)try:# 尝试解码成可读字符串result = decrypted.decode("utf-8")print(f"Key: {key} -> {result}")except UnicodeDecodeError:# 跳过不可解码的字节组合continue
#crypto{0x10_15_my_f4v0ur173_by7e}
4.cryptohack——You either know, XOR you don’t