You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.5 KiB
112 lines
3.5 KiB
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const crypto = require("crypto");
|
|
const BLOCK_SIZE = 256;
|
|
const MAX_CHUNK_SIZE = BLOCK_SIZE - 11; // 11 is the PCKS1 padding
|
|
function encrypt(key, txt) {
|
|
try {
|
|
const buf = Buffer.from(txt);
|
|
let finalBuf = Buffer.from([]);
|
|
const n = Math.ceil(buf.length / MAX_CHUNK_SIZE);
|
|
const arr = Array(n).fill(0);
|
|
const pubc = cert.pub(key);
|
|
arr.forEach((_, i) => {
|
|
const f = crypto.publicEncrypt({
|
|
key: pubc,
|
|
padding: crypto.constants.RSA_PKCS1_PADDING,
|
|
}, buf.subarray(i * MAX_CHUNK_SIZE, i * MAX_CHUNK_SIZE + MAX_CHUNK_SIZE));
|
|
finalBuf = Buffer.concat([finalBuf, f]);
|
|
});
|
|
return finalBuf.toString('base64');
|
|
}
|
|
catch (e) {
|
|
return '';
|
|
}
|
|
}
|
|
exports.encrypt = encrypt;
|
|
function decrypt(privateKey, enc) {
|
|
try {
|
|
const buf = Buffer.from(enc, 'base64');
|
|
let finalDec = '';
|
|
const n = Math.ceil(buf.length / BLOCK_SIZE);
|
|
const arr = Array(n).fill(0);
|
|
const privc = cert.priv(privateKey);
|
|
arr.forEach((_, i) => {
|
|
const b = crypto.privateDecrypt({
|
|
key: privc,
|
|
padding: crypto.constants.RSA_PKCS1_PADDING,
|
|
}, buf.subarray(i * BLOCK_SIZE, i * BLOCK_SIZE + BLOCK_SIZE));
|
|
finalDec += b.toString('utf-8');
|
|
});
|
|
return finalDec;
|
|
}
|
|
catch (e) {
|
|
return '';
|
|
}
|
|
}
|
|
exports.decrypt = decrypt;
|
|
function genKeys() {
|
|
return new Promise((resolve, reject) => {
|
|
crypto.generateKeyPair('rsa', {
|
|
modulusLength: 2048
|
|
}, (err, publicKey, privKey) => {
|
|
const pubPEM = publicKey.export({
|
|
type: 'pkcs1', format: 'pem'
|
|
});
|
|
const pubBase64 = cert.unpub(pubPEM);
|
|
const privPEM = privKey.export({
|
|
type: 'pkcs1', format: 'pem'
|
|
});
|
|
const privBase64 = cert.unpriv(privPEM);
|
|
resolve({
|
|
public: pubBase64,
|
|
private: privBase64,
|
|
});
|
|
});
|
|
});
|
|
}
|
|
exports.genKeys = genKeys;
|
|
function testRSA() {
|
|
crypto.generateKeyPair('rsa', {
|
|
modulusLength: 2048
|
|
}, (err, publicKey, privateKey) => {
|
|
const pubPEM = publicKey.export({
|
|
type: 'pkcs1', format: 'pem'
|
|
});
|
|
const pub = cert.unpub(pubPEM);
|
|
const msg = 'hi';
|
|
const enc = encrypt(pub, msg);
|
|
const privPEM = privateKey.export({
|
|
type: 'pkcs1', format: 'pem'
|
|
});
|
|
const priv = cert.unpriv(privPEM);
|
|
const dec = decrypt(priv, enc);
|
|
console.log("SUCESS:", msg === dec);
|
|
});
|
|
}
|
|
exports.testRSA = testRSA;
|
|
const cert = {
|
|
unpub: function (key) {
|
|
let s = key;
|
|
s = s.replace('-----BEGIN RSA PUBLIC KEY-----', '');
|
|
s = s.replace('-----END RSA PUBLIC KEY-----', '');
|
|
return s.replace(/[\r\n]+/gm, '');
|
|
},
|
|
unpriv: function (key) {
|
|
let s = key;
|
|
s = s.replace('-----BEGIN RSA PRIVATE KEY-----', '');
|
|
s = s.replace('-----END RSA PRIVATE KEY-----', '');
|
|
return s.replace(/[\r\n]+/gm, '');
|
|
},
|
|
pub: function (key) {
|
|
return '-----BEGIN RSA PUBLIC KEY-----\n' +
|
|
key + '\n' +
|
|
'-----END RSA PUBLIC KEY-----';
|
|
},
|
|
priv: function (key) {
|
|
return '-----BEGIN RSA PRIVATE KEY-----\n' +
|
|
key + '\n' +
|
|
'-----END RSA PRIVATE KEY-----';
|
|
}
|
|
};
|
|
//# sourceMappingURL=rsa.js.map
|