Crypto中常用的数据类型互转方式
k
e
y
w
o
r
d
s
:
keywords:
keywords:十进制与字节互相转换
,十六进制的不同表示方式转换
,列表类型与字符串的转换
十进制与字节互相转换
long_to_bytes()\bytes_to_long()
from Crypto.Util.number import long_to_bytes,bytes_to_long
flag = b"flag{convert}"
nums = bytes_to_long(flag)
flag = long_to_bytes(enc)
python
实践
>>> from Crypto.Util.number import long_to_bytes,bytes_to_long
>>> flag = b"flag{convert}"
>>> nums = bytes_to_long(flag)
>>> flag = long_to_bytes(enc)
>>> nums
8114814712000032644620394591357
>>> flag
b'flag{convert}'
libnum.s2n()\libnum.n2s()
import libnum
flag = "flag{convert}"
# 或者flag = b'flag{convert}'
nums = libnum.s2n(flag)
flag = libnum.n2s(nums)
python
实践
>>> import libnum
>>> flag = "flag{convert}"
>>> nums = libnum.s2n(flag)
>>> flag = libnum.n2s(nums)
>>> nums
8114814712000032644620394591357
>>> flag
b'flag{convert}'
- 工具
cyberchef
的From Decimal
选项
反向转换
十六进制的不同表示方式转换
一般在python
中的字节类型都是写作b'\x01\x02...'
但是也可以转换作01 02...
binascii.hexlify()\binascii.unhexlify()
import binascii
a = b'\x01\x02\x03\x04\x05:abcdefghijklmn'
form1 = binascii.hexlify(a)
form2 = binascii.unhexlify(form1)
form3 = binascii.hexlify(a," ") # 第二个形参是定义每个字节之间的间隔符,默认是""
python
实践
>>> import binascii
>>> a = b'\x01\x02\x03\x04\x05:abcdefghijklmn'
>>> form1 = binascii.hexlify(a)
>>> form2 = binascii.unhexlify(form1)
>>> form3 = binascii.hexlify(a," ")
>>> form1
b'01020304053a6162636465666768696a6b6c6d6e'
>>> form2
b'\x01\x02\x03\x04\x05:abcdefghijklmn'
>>> form3
b'01 02 03 04 05 3a 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e'
binascii.a2b_hex()\binascii.b2a_hex()
分别等价于unhexlify()
以及hexlify()
列表类型与字符串的转换
- 分别将字符串中的单个字符作为一个元素加入列表
a = "abcdefghijklmnopqrstuvwxyz"
ls = list(a)
ori = "".join([i for i in ls])
python
实践
>>> a = "abcdefghijklmnopqrstuvwxyz"
>>> ls = list(a)
>>> ori = "".join([i for i in ls])
>>> ls
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
>>> ori
'abcdefghijklmnopqrstuvwxyz'
- 将字符串中两个或多个字符作为一个元素加入列表
for
循环切片
列表类型与字节类型的转换
list()
a = b'abcdefghijklmnopqrstuvwxyz'
ls = list(a)
ori = "".join([chr(i) for i in ls]).encode()
python
实践
>>> a = b'abcdefghijklmnopqrstuvwxyz'
>>> ls = list(a)
>>> ori = "".join([chr(i) for i in ls]).encode()
>>> ls
[97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122]
>>> ori
b'abcdefghijklmnopqrstuvwxyz'
字节类型与字符串类型的转换
str.encode()\byte.decode()
a = "abc"
byte = a.encode()
string = byte.decode()
python
实践
>>> a = "abc"
>>> byte = a.encode()
>>> string = byte.decode()
>>> byte
b'abc'
>>> string
'abc'
对列表类型整体进行操作
map()
ls = [1,2,3,4,5]
list(map(lambda x:2*x,ls))
python
实践
>>> ls = [1,2,3,4,5]
>>> list(map(lambda x:2*x,ls))
[2, 4, 6, 8, 10]
字符型数字转数值型
eval()
a = "123456"
eval(a)
type(eval(a))
python
实践
>>> a = "123456"
>>> eval(a)
123456
>>> type(eval(a))
<class 'int'>
int(str,base)
可以对字符里的数字进行进一步进制转换
a = "101110111"
int(a,2)
a = b'5e6cb260'
int(a,16)
python
实践
>>> a = "101110111"
>>> int(a,2)
375
>>> a = b'5e6cb260'
>>> int(a,16)
1584181856