const crypto = require('crypto');
function getKeyFromPassword(password, salt) {
return new Promise((resolve, reject) => {
crypto.pbkdf2(password, salt, 65536, 32, 'sha256', (err, key) => {
if (err) reject(err);
resolve(key)
;
});
});
}
async function encryptPasswordBased(plainText, key, iv) {
return new Promise((resolve, reject) => {
try {
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
let encrypted = cipher.update(plainText, 'utf8', 'base64');
encrypted += cipher.final('base64');
resolve(encrypted);
} catch (err) {
reject(err);
}
});
}
async function decryptPasswordBased(encryptedText, key, iv) {
return new Promise((resolve, reject) => {
try {
const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
let decrypted = decipher.update(encryptedText, 'base64', 'utf8');
decrypted += decipher.final('utf8');
resolve(decrypted);
} catch (err) {
reject(err);
}
});
}
async function encrypt(stringToEncrypt, password, salt) {
try {
const base64Encoded = Buffer.from(stringToEncrypt).toString('base64');
console.log('Base64 Encoded:', base64Encoded);
const iv = Buffer.alloc(16, 0);
const key = await getKeyFromPassword(password, salt);
console.log('Derived Key:', key.toString('hex'));
const encrypted = await encryptPasswordBased(base64Encoded, key, iv);
console.log('Encrypted:', encrypted);
return encrypted;
} catch (ex) {
console.error('Encryption failed:', ex);
throw new Error('Encryption failed');
}
}
async function decrypt(encryptedText, password, salt) {
try {
const iv = Buffer.alloc(16, 0);
const key = await getKeyFromPassword(password, salt);
console.log('Derived Key:', key.toString('hex'));
const decryptedBase64 = await decryptPasswordBased(encryptedText, key, iv);
console.log('Decrypted Base64:', decryptedBase64);
const decrypted = Buffer.from(decryptedBase64, 'base64').toString('utf8');
console.log('Decrypted:', decrypted);
return decrypted;
} catch (ex) {
console.error('Decryption failed:', ex);
throw new Error('Decryption failed');
}
}
(async () => {
const password = 'your encryption key';
const salt = 'your aoi key';
const plainText = 'things to test';
try {
const encrypted = await encrypt(plainText, password, salt);
console.log('Encrypted:', encrypted);
const decrypted = await decrypt(encrypted, password, salt);
console.log('Decrypted:', decrypted);
} catch (ex) {
console.error(ex);
}
})();