Huawei Modem/Router sending encrypted requests
This relates to my Huawei python API here.
I'm adding a dedicated post on this as I expect it may be useful for others.
This took me quite a while to get working and I couldn't find any working solutions online.
This implements the javascript RSA encryption used for encrypting requests to be sent to the modem's underlying API in python.
The javascript code is:
The python code I got working is:
RSAE and RSAN tokens are returned by the router on a successful login.
The content type on the encrypted call also needs to be:
I'm adding a dedicated post on this as I expect it may be useful for others.
This took me quite a while to get working and I couldn't find any working solutions online.
This implements the javascript RSA encryption used for encrypting requests to be sent to the modem's underlying API in python.
The javascript code is:
function RSAEncrypt(text) {
var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3);
if(m == null)
return null;
var c = this.doPublic(m);
if(c == null)
return null;
var h = c.toString(16);
if((h.length & 1) == 0)
return h;
else
return "0" + h;
}
The python code I got working is:
import uuid
import hashlib
import hmac
from binascii import hexlify
import math
import base64
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey.RSA import construct
def rsa_encrypt(rsae, rsan, data):
if (data is None or data == ''): return ''
N = long(rsan,16)
E = long(rsae,16)
b64data = base64.b64encode(data)
pubkey = construct((N, E))
cipher = PKCS1_v1_5.new(pubkey)
blocks = int(math.ceil(len(b64data) / 245.0))
result = []
for i in range(blocks):
block = b64data[i*245:(i+1)*245]
d = cipher.encrypt(block)
result.append(d)
result = hexlify(''.join(result))
if ((len(result) & 1) == 0):
return result
else:
return '0'+result
RSAE and RSAN tokens are returned by the router on a successful login.
The content type on the encrypted call also needs to be:
headers['Content-type'] = 'application/x-www-form-urlencoded; charset=UTF-8;enc'
Comments
Post a Comment