Crypto中常用的数据类型互转方式

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}'
  • 工具cyberchefFrom 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
  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用DBMS_CRYPTO加密NUMBER数据类型的数据后,需要先将加密后的数据转换成HEX格式的,然后再进行存储。那么查询加密后的数据时,需要先将查询条件转换成HEX格式的字符串,然后再与存储的加密数据进行比较。 以下是一个示例,假设我们要加密的数据为数字123,加密算法为AES128: ``` DECLARE v_key RAW(128) := UTL_RAW.CAST_TO_RAW('mysecretkey'); v_data NUMBER := 123; v_encrypted RAW(2000); v_hex_str VARCHAR2(4000); BEGIN v_encrypted := DBMS_CRYPTO.ENCRYPT( UTL_RAW.CAST_TO_RAW(v_data), DBMS_CRYPTO.TYPE_AES128, v_key ); v_hex_str := RAWTOHEX(v_encrypted); DBMS_OUTPUT.PUT_LINE('Encrypted data: ' || v_hex_str); END; ``` 输出结果为: ``` Encrypted data: 4A8C65F25A9D827C830B9A79E8C9F7C9 ``` 我们将加密后的数据存储到数据库,然后查询加密后的数据时,需要将查询条件也转换成HEX格式的字符串: ``` DECLARE v_key RAW(128) := UTL_RAW.CAST_TO_RAW('mysecretkey'); v_data NUMBER := 123; v_encrypted RAW(2000); v_hex_str VARCHAR2(4000); v_decrypted RAW(2000); v_result NUMBER; BEGIN v_encrypted := DBMS_CRYPTO.ENCRYPT( UTL_RAW.CAST_TO_RAW(v_data), DBMS_CRYPTO.TYPE_AES128, v_key ); v_hex_str := RAWTOHEX(v_encrypted); -- 查询加密后的数据 SELECT COUNT(*) INTO v_result FROM my_table WHERE TO_CHAR(TO_NUMBER(RAWTOHEX(my_column)), 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') = v_hex_str; DBMS_OUTPUT.PUT_LINE('Result: ' || v_result); END; ``` 这里使用了TO_NUMBER和TO_CHAR函数将HEX格式的字符串转换成NUMBER类型,然后再与加密后的数据进行比较。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M3ng@L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值