const crypto = require('crypto'); const helpers = require("../utils/Helpers").helpers; console.log(); class RSA { _server_keys = { '216be86c022bb4c3': new RSAServerKey("216be86c022bb4c3", parseInt('C150023E2F70DB7985DED064759CFECF0AF328E69A41DAF4D6F01B538135A6F9' + '1F8F8B2A0EC9BA9720CE352EFCF6C5680FFC424BD634864902DE0B4BD6D49F4E' + '580230E3AE97D95C8B19442B3C0A10D8F5633FECEDD6926A7F6DAB0DDB7D457F' + '9EA81B8465FCD6FFFEED114011DF91C059CAEDAF97625F6C96ECC74725556934' + 'EF781D866B34F011FCE4D835A090196E9A5F0E4449AF7EB697DDB9076494CA5F' + '81104A305B6DD27665722C46B60E5DF680FB16B210607EF217652E60236C255F' + '6A28315F4083A96791D7214BF64C1DF4FD0DB1944FB26A2A57031B32EEE64AD1' + '5A8BA68885CDE74A5BFC920F6ABF59BA5C75506373E7130F9042DA922179251F', 16), parseInt('010001', 16)) }; /** * Encrypts the given data given a fingerprint * @param fingerprint * @param data * @param offset * @param length */ static encrypt(fingerprint, data, offset, length) { if (!(fingerprint.toLowerCase() in RSA._server_keys)) { return; } let key = RSA._server_keys[fingerprint.toLowerCase()]; return key.encrypt(data, offset, length); } } class RSAServerKey { constructor(fingerprint, m, e) { this.fingerprint = fingerprint; this.m = m; this.e = e; } /** * Encrypts the given data with the current key * @param data * @param offset * @param length */ encrypt(data, offset, length) { if (offset === undefined) { offset = 0; } if (length === undefined) { length = data.length; } let dataToWrite = data.split(offset, offset + length); let sha1Data = helpers.sha1(dataToWrite); let writer = Buffer.concat([sha1Data, dataToWrite]); if (length < 235) { writer = Buffer.concat([writer, helpers.generateRandomBytes(235 - length)]); } let result = writer.readBigInt64BE(); result = (result ** this.e) % this.m; let buffer = Buffer.alloc(256); buffer.writeBigInt64BE(result); } } exports.RSA = RSA;