1
0

RSA.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. const crypto = require('crypto');
  2. const helpers = require("../utils/Helpers").helpers;
  3. console.log();
  4. class RSA {
  5. _server_keys = {
  6. '216be86c022bb4c3': new RSAServerKey("216be86c022bb4c3", parseInt('C150023E2F70DB7985DED064759CFECF0AF328E69A41DAF4D6F01B538135A6F9' +
  7. '1F8F8B2A0EC9BA9720CE352EFCF6C5680FFC424BD634864902DE0B4BD6D49F4E' +
  8. '580230E3AE97D95C8B19442B3C0A10D8F5633FECEDD6926A7F6DAB0DDB7D457F' +
  9. '9EA81B8465FCD6FFFEED114011DF91C059CAEDAF97625F6C96ECC74725556934' +
  10. 'EF781D866B34F011FCE4D835A090196E9A5F0E4449AF7EB697DDB9076494CA5F' +
  11. '81104A305B6DD27665722C46B60E5DF680FB16B210607EF217652E60236C255F' +
  12. '6A28315F4083A96791D7214BF64C1DF4FD0DB1944FB26A2A57031B32EEE64AD1' +
  13. '5A8BA68885CDE74A5BFC920F6ABF59BA5C75506373E7130F9042DA922179251F', 16), parseInt('010001', 16))
  14. };
  15. /**
  16. * Encrypts the given data given a fingerprint
  17. * @param fingerprint
  18. * @param data
  19. * @param offset
  20. * @param length
  21. */
  22. static encrypt(fingerprint, data, offset, length) {
  23. if (!(fingerprint.toLowerCase() in RSA._server_keys)) {
  24. return;
  25. }
  26. let key = RSA._server_keys[fingerprint.toLowerCase()];
  27. return key.encrypt(data, offset, length);
  28. }
  29. }
  30. class RSAServerKey {
  31. constructor(fingerprint, m, e) {
  32. this.fingerprint = fingerprint;
  33. this.m = m;
  34. this.e = e;
  35. }
  36. /**
  37. * Encrypts the given data with the current key
  38. * @param data
  39. * @param offset
  40. * @param length
  41. */
  42. encrypt(data, offset, length) {
  43. if (offset === undefined) {
  44. offset = 0;
  45. }
  46. if (length === undefined) {
  47. length = data.length;
  48. }
  49. let dataToWrite = data.split(offset, offset + length);
  50. let sha1Data = helpers.sha1(dataToWrite);
  51. let writer = Buffer.concat([sha1Data, dataToWrite]);
  52. if (length < 235) {
  53. writer = Buffer.concat([writer, helpers.generateRandomBytes(235 - length)]);
  54. }
  55. let result = writer.readBigInt64BE();
  56. result = (result ** this.e) % this.m;
  57. let buffer = Buffer.alloc(256);
  58. buffer.writeBigInt64BE(result);
  59. }
  60. }
  61. exports.RSA = RSA;