process.stdin.resume();
process.stdin.setEncoding('utf8');
// your code goes here
'use strict';
const crypto = require('crypto');
const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY; // Must be 256 bits (32 characters)
const IV_LENGTH = 16; // For AES, this is always 16
function encrypt(text) {
let iv = crypto.randomBytes(IV_LENGTH);
let cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
let encrypted = cipher.update(text);
encrypted = Buffer.concat([encrypted, cipher.final()]);
return iv.toString('hex') + ':' + encrypted.toString('hex');
}
function decrypt(text) {
let textParts = text.split(':');
let iv = Buffer.from(textParts.shift(), 'hex');
let encryptedText = Buffer.from(textParts.join(':'), 'hex');
let decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
let decrypted = decipher.update(encryptedText);
decrypted = Buffer.concat([decrypted, decipher.final()]);
return decrypted.toString();
}
module.exports = { decrypt, encrypt };
cHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTsKcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZygndXRmOCcpOwoKLy8geW91ciBjb2RlIGdvZXMgaGVyZQondXNlIHN0cmljdCc7Cgpjb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTsKCmNvbnN0IEVOQ1JZUFRJT05fS0VZID0gcHJvY2Vzcy5lbnYuRU5DUllQVElPTl9LRVk7IC8vIE11c3QgYmUgMjU2IGJpdHMgKDMyIGNoYXJhY3RlcnMpCmNvbnN0IElWX0xFTkdUSCA9IDE2OyAvLyBGb3IgQUVTLCB0aGlzIGlzIGFsd2F5cyAxNgoKZnVuY3Rpb24gZW5jcnlwdCh0ZXh0KSB7CiBsZXQgaXYgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoSVZfTEVOR1RIKTsKIGxldCBjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywgQnVmZmVyLmZyb20oRU5DUllQVElPTl9LRVkpLCBpdik7CiBsZXQgZW5jcnlwdGVkID0gY2lwaGVyLnVwZGF0ZSh0ZXh0KTsKCiBlbmNyeXB0ZWQgPSBCdWZmZXIuY29uY2F0KFtlbmNyeXB0ZWQsIGNpcGhlci5maW5hbCgpXSk7CgogcmV0dXJuIGl2LnRvU3RyaW5nKCdoZXgnKSArICc6JyArIGVuY3J5cHRlZC50b1N0cmluZygnaGV4Jyk7Cn0KCmZ1bmN0aW9uIGRlY3J5cHQodGV4dCkgewogbGV0IHRleHRQYXJ0cyA9IHRleHQuc3BsaXQoJzonKTsKIGxldCBpdiA9IEJ1ZmZlci5mcm9tKHRleHRQYXJ0cy5zaGlmdCgpLCAnaGV4Jyk7CiBsZXQgZW5jcnlwdGVkVGV4dCA9IEJ1ZmZlci5mcm9tKHRleHRQYXJ0cy5qb2luKCc6JyksICdoZXgnKTsKIGxldCBkZWNpcGhlciA9IGNyeXB0by5jcmVhdGVEZWNpcGhlcml2KCdhZXMtMjU2LWNiYycsIEJ1ZmZlci5mcm9tKEVOQ1JZUFRJT05fS0VZKSwgaXYpOwogbGV0IGRlY3J5cHRlZCA9IGRlY2lwaGVyLnVwZGF0ZShlbmNyeXB0ZWRUZXh0KTsKCiBkZWNyeXB0ZWQgPSBCdWZmZXIuY29uY2F0KFtkZWNyeXB0ZWQsIGRlY2lwaGVyLmZpbmFsKCldKTsKCiByZXR1cm4gZGVjcnlwdGVkLnRvU3RyaW5nKCk7Cn0KCm1vZHVsZS5leHBvcnRzID0geyBkZWNyeXB0LCBlbmNyeXB0IH07