58 lines
1.2 KiB
Python
58 lines
1.2 KiB
Python
import sys,math,random,binascii as ba,os
|
|
from struct import unpack as u
|
|
from struct import pack
|
|
is2 = sys.version_info[0]<3
|
|
def bt(b):
|
|
if is2:
|
|
return b
|
|
return ord(b)
|
|
def b2i(b):
|
|
return int(ba.b2a_hex(b),16)
|
|
def i2b(i):
|
|
h='%x'%i
|
|
if len(h)%2==1:
|
|
h ='0'+h
|
|
if not is2:
|
|
h=h.encode('utf-8')
|
|
return ba.a2b_hex(h)
|
|
def rs(a,o):
|
|
if a[o]==bt(pack('B',0x81)):
|
|
return(u('B',a[o+1])[0],2+o)
|
|
elif a[o] == bt(pack('B',0x82)):
|
|
return(u('>H',a[o+1:o+3])[0],3+o)
|
|
def ri(b,o):
|
|
i,o =rs(b,o)
|
|
return(b[o:o+i],o+i)
|
|
def b2me(b):
|
|
if b[0]!=bt(pack('B',0x30)):
|
|
return(None,None)
|
|
_,o=rs(b,1)
|
|
if b[o]!=bt(pack('B',2)):
|
|
return(None,None)
|
|
(m,o)=ri(b,o+1)
|
|
if b[o]!=bt(pack('B',2)):
|
|
return(None,None)
|
|
e=b[o+2:]
|
|
return(b2i(m),b2i(e))
|
|
def der2me(d):
|
|
if d[0]!=bt(pack('B',0x30)):
|
|
return(None,None)
|
|
_,o=rs(d,1)
|
|
while o<len(d):
|
|
if d[o]==bt(pack('B',0x30)):
|
|
o+=u('B',d[o+1:o+2])[0]
|
|
elif d[o]==bt(pack('B',0x05)):
|
|
o+=2
|
|
elif d[o]==bt(pack('B',0x03)):
|
|
_,o=rs(d,o+1)
|
|
return b2me(d[o+1:])
|
|
else:
|
|
return(None,None)
|
|
def rsa_enc(der,msg):
|
|
m,e=der2me(der)
|
|
h=pack('BB',0,2)
|
|
d=pack('B',0)
|
|
l=256-len(h)-len(msg)-len(d)
|
|
p=os.urandom(512).replace(pack('B',0),pack(''))
|
|
return i2b(pow(b2i(h+p[:l]+d+msg),e,m))
|