-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdecrypt.js
More file actions
58 lines (48 loc) · 1.98 KB
/
Copy pathdecrypt.js
File metadata and controls
58 lines (48 loc) · 1.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
const fs = require('fs');
const forge = require('node-forge');
function decryptMessage() {
const originalPrivateKeyFile = process.argv[2];
const encryptedMessageBase64 = fs.readFileSync(process.argv[3], 'utf8').trim();
const privateKeyFile = 'rsaprivatekey.tmp';
fs.copyFileSync(originalPrivateKeyFile, privateKeyFile);
// Convert the private key to PEM format using ssh-keygen
const { execSync } = require('child_process');
try {
execSync(`ssh-keygen -p -m pem -N "" -f ${privateKeyFile} -q`);
} catch (error) {
console.error('Error converting private key to PEM format:', error);
process.exit(1);
}
const privateKeyPem = fs.readFileSync(privateKeyFile, 'utf8').trim();
if (!encryptedMessageBase64) {
console.error('Please enter a ciphertext message to decrypt.');
return;
}
if (!privateKeyPem) {
console.error('Please enter the RSA private key for decryption.');
return;
}
const forgePrivateKey = forge.pki.privateKeyFromPem(privateKeyPem);
cipherObj = JSON.parse(encryptedMessageBase64);
// decrypt encapsulated 16-byte secret key
var kdf1 = new forge.kem.kdf1(forge.md.sha1.create());
var kem = forge.kem.rsa.create(kdf1);
var key = kem.decrypt(forgePrivateKey, Buffer.from(cipherObj.encapsulation, 'base64'), 16);
// decrypt some bytes
var decipher = forge.cipher.createDecipher('AES-GCM', key);
decipher.start({ iv: Buffer.from(cipherObj.iv, 'base64'), tag: Buffer.from(cipherObj.tag, 'base64') });
decipher.update(forge.util.createBuffer(Buffer.from(cipherObj.encrypted, 'base64')));
var pass = decipher.finish();
// pass is false if there was a failure (eg: authentication tag didn't match)
if (pass) {
const boundary = 'DECRYPTED MESSAGE';
console.log(`-----BEGIN ${boundary}-----`);
console.log(decipher.output.toString());
console.log(`-----END ${boundary}-----`);
} else {
console.error('Decryption failed.');
}
// clean up the privateKeyFile file
fs.unlinkSync(privateKeyFile);
}
decryptMessage();