基础知识
ASCII
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种用于表示字符的编码系统。它使用7位二进制数来表示128个不同的字符,包括英文字母、数字、标点符号以及一些控制字符。
-
使用7位二进制数,表示范围为0-127。
-
ASCII码表将每个字符与一个唯一的整数值关联起来。
-
ASCII码中的前32个字符是控制字符,用于控制打印机等外部设备。
-
ASCII码中的后96个字符包括大写字母、小写字母、数字和一些特殊字符。
可显示字符
可显示字符编号范围是32-126(0x20-0x7E),共95个字符。
控制字符
ASCII控制字符的编号范围是0-31和127(0x00-0x1F和0x7F),共33个字符。
在 Python 中,该函数可用于将 ASCII 序号转换为字符(该函数的作用相反)。
chr()
ord=[99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 110, 116, 52, 98, 108, 51, 125]
print("".join(chr(i) for i in ord))
'''
for i in ord 部分表示一个循环,它会遍历列表 ord 中的每个整数值,并将当前值赋给变量 i。
chr(i) 函数会将整数 i 转换为相应的 ASCII 字符。
"".join(...) 是一个将一系列字符串连接在一起的方法。在这里,我们将每个通过 chr(i) 转换的字符连接在一起。
'''
ord()
十六进制
十六进制使用十六个不同的符号,最常见的符号“0”-“9”表示值 0 到 9,“A”-“F”(或者“a”-“f”)表示十到十五的值。每个十六进制数字代表四个位(二进制数字),也称为半字节(或nybble)。[1] 例如,一个 8 位字节的值范围从 00000000 到 11111111 的二进制形式,可以方便地表示为十六进制的 00 到 FF。
在 Python 中,该函数可用于将十六进制转换为字节。可以在字节字符串上调用实例方法以获取十六进制表示形式。bytes.fromhex()
用于将十六进制字符串转换为字节对象。具体来说,它将一个十六进制字符串解析并将其转换为一个包含相应字节的不可变字节对象
.hex()
hex()
函数接受一个整数作为参数,并返回其对应的十六进制表示。
Base64
Base64 是一种基于 64 个可打印字符(包括字母 A-Z、a-z、数字 0-9,这样共有 62 个字符,,此外两个可打印符号在不同的系统中而不同)来表示二进制数据的表示方法,由于 2^6=64,所以每 6 个比特为一个单元,对应某个可打印字符。
把 3 个 8 位字节(3* 8=24)转化为 4 个 6 位的字节(4*6=24),之后在 6 位的前面补两个 0,形成 8 位一个字节的形式。 如果剩下的字符不足 3 个字节,则用 0 填充,输出字符使用 =,因此编码后输出的文本末尾可能会出现 1 或 2 个 =。
64.b64encode()
用于将字节数据进行 Base64 编码。Base64 编码是一种将二进制数据转换为可打印 ASCII 字符的编码方式
ss="72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf"#16进制
s=bytes.fromhex(ss)#将十六进制字符串解码字节
flag=base64.b64encode(s)#字节进行base64编码
print(flag)
#crypto/Base+64+Encoding+is+Web+Safe/
long_to_bytes
信息转换为数字: 最常见的方法是获取消息的序号字节,将它们转换为十六进制,然后连接起来。这可以解释为基数 16/十六进制数,也可以以 10 进制/十进制表示。
举例说明:
消息: HELLO
ASCII 字节: [72, 69, 76, 76, 79] 十六进制字节: [0x48, 0x45, 0x4c, 0x4c, 0x4f]
基数 16: 0x48454c4c4f
基数 10: 310400273487
from Crypto.Util.number import long_to_bytes
t= 310400273487
m=long_to_bytes(t)
print(m)
#b'HELLO'
XOR
基础:
如果位相同,则返回 0,否则返回 1
A ⊕ B = B ⊕ A
A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C
A ⊕ 0 = A
A ⊕ A = 0
pwntools库 xor()
可以将不同类型和长度的数据异或在一起,xor函数自动将key匹配为与密文长度一致进行异或解密
t = 'label'
flag = bytes([ord(c) ^ 13 for c in t])
print(flag)
from Crypto.Util.number import long_to_bytes
KEY1 = 0xa6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313
TKEY2=0x37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e
TKEY3 = 0xc1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1
TFLAG= 0x04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf
key1=KEY1
print("key1",key1)
key2=TKEY2
print("key2",key2)
#直接转换成int类型了
# key1 268011609358571820305085369857896955256986936039734864838603539
# key2 89766933348497060915487216344088108257338583381171202642566686
# b'crypto{x0r_i5_ass0c1at1v3}'
key3=TKEY3
flag=TFLAG
k2=key1^key2
k3=k2^key3
m=flag^key1^k2^k3
print(long_to_bytes(m))
两个图片的异或
#库
from PIL import Image
import numpy as np
np.array()
函数Image
对象转换为NumPy数组
Image.fromarray()
函数将处理后的NumPy数组转换回PIL的Image
对象
字节
字节是计量信息容量的单位,通常表示为8个二进制位(bit)的组合。一个字节可以表示一个ASCII字符或者8个二进制位的整数值。一个字节存储8位无符号数,储存的数值范围为0-255。如同字元一样,字节型态的变数只需要用一个位元组(8位元)的内存空间储存
字符与字节
ASCII码:一个英文字母(不分大小写)占一个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数(二级制数即计算机中的0或1)。换算为十进制 ,最小值-128,最大值127。如一个ASCII码就是一个字节。
UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节
Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字
数据格式
PEM
PEM 是发送密钥、证书和其他加密材料的常用格式. 扩展名为.pem, .crt, .cer, and .key。内容为Base64编码的ASCII码文件,有类似"-----BEGIN CERTIFICATE-----" 和 "-----END CERTIFICATE-----"的头尾标记
(1)CSR(证书签名请求)
-----BEGIN CERTIFICATE REQUEST----- and -----END CERTIFICATEREQUEST-----
(2)私钥
-----BEGIN RSA PRIVATE KEY----- and -----END RSA PRIVATEKEY-----
(3)证书文件
-----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----
读取密钥数据
from Crypto.PublicKey import RSA
key=RSA.importKey()
key.d
#获取并打印出私钥的`d`属性,即私钥指数
DER
PEM格式:使用Base64 ASCII进行编码的纯文本格式
DER格式:二机制格式 ( Distinguished Encoding Rules,可分辩编码规则。DER格式文件后缀通常为 “.der” 和 “.cer”)
读取密钥数据
from Crypto.PublicKey import RSA
key=RSA.importKey(open(" ","rb").read())
key.d
#获取并打印出私钥的`d`属性,即私钥指数
安全外壳协议SSH
SSH即安全外壳协议,英文全称是Secure Shell Protocol或Secure Shell,其具有很高的安全性。通过使用SSH,你可以把所有传输的数据进行加密,这样“中间人”这种攻击方式就不可能实现了,而且也能够防止DNS和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度
SSH之所以能够保证安全性,原因在于它采用了非对称加密技术(RSA)加密了所有传输的数据,SSH 私钥以 PEM 格式存储,但是,SSH 公钥使用不同的格式:
ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAABgQCtPLqba+GFvDHdFVs1Vvdk56cKqqw5cdomlu034666UsoFI…3fqk8GDJYREaoyoL3HKQt1Ue/ZW7TlPRYzAoIB62C0=bschneier@facts
from Crypto.PublicKey import RSA
key=RSA.importKey()
key.n
#获取n(模式)
透明度
证书透明度。每个 CA 都必须将其颁发的所有证书发布到任何人都可以搜索的日志中。
Transparency
fofo搜索 fofo