python 进制 字符

Author Avatar
Aryb1n 7月 29, 2017

发现自己不会py里的这些十六进制,ascii转换什么的好尴尬

这样子..拿到了hbctf的一道题目,做到这一步,得到一个字符串

>>> s = 6E3A37333036393838363737313632353634323830373433353738333636313031343036323630343236343736383438313733353134353837333530383834363932353733353532313639353135390A653A36353533370A633A3135313136373137373034353031363233303238393033393138313331353035353130353830353939353631333537333837343331323935323839303132313933393830353534303132383131

然后要把每两位看成字符的ascii的十六进制形式的话,把这串字符串转换成原来的字符的话

>>> print s.decode('hex')
n:73069886771625642807435783661014062604264768481735145873508846925735521695159
e:65537
c:15116717704501623028903918131505510580599561357387431295289012193980554012811

这里是一个RSA,这里的c是密文,e是公钥
这里要把n分解可以得到p * q
上这个网站 http://factordb.com/index.php ,分解一下得到两个因子

>>> p = 189239861511125143212536989589123569301
>>> q = 386123125371923651191219869811293586459

RSA 的常见攻击方法看这一篇 http://bobao.360.cn/learning/detail/3058.html
这个时候由公钥ep,q可以解出来私钥d

d =  30854876581442056228588093398155288897790570329196285069001545119486056472273

有个私钥d, 明文c和模数n就能得到最后的密文m

m = pow(c, d, n)
>>> m
630199562897691744494569524488740813666979952696

这个m这次看起来是个十进制
把它变成16进制

>>> hex(m)
'0x6e63203131392e32382e31352e33342038383838'

还原成字符,要把前面的0x去掉

>>> hex(m)[2:].decode('hex')
'nc 119.28.15.34 8888'

就这样子..感觉是不是有些地方有点笨
大佬说可以用libnum,emmmmmmmmm
试了下果然可以,十进制也能直接变过来

>>> import libnum
>>> libnum.n2s(m)
'nc 119.28.15.34 8888'

前面的decode,encode操作对象是字符串,,,而且不带0x
后面这个操作对象是数字