@meg-shit/aes-256-ecb-js
Version:
encrypt and dencrypt by aes-256-ecb for Javascript
62 lines (59 loc) • 1.82 kB
JavaScript
import crypto from 'crypto';
const index = "@meg-shit/aes-256-ecb-js";
const ModeMap = {
16: "aes-128-ecb",
24: "aes-192-ecb",
32: "aes-256-ecb"
};
function validateKey(key) {
if (!(key.length in ModeMap))
throw new Error(`Invalid key length: ${key.length}`);
else
return ModeMap[key.length];
}
function createDecipher(key) {
const mode = validateKey(key);
return crypto.createDecipheriv(mode, key, null);
}
function createCipher(key) {
const mode = validateKey(key);
return crypto.createCipheriv(mode, key, null);
}
function encrypt(data, key, options) {
const _options = {
inputEncoding: "utf8",
outputEncoding: "base64",
autoPadding: true,
padding: "00",
...options
};
let dataBuffer = Buffer.from(data, _options.inputEncoding);
if (!_options.autoPadding) {
const len = 16 - data.length % 16;
const paddingBuf = Buffer.from(new Array(len).fill(_options.padding));
dataBuffer = Buffer.concat([
Buffer.from(data, _options.inputEncoding),
paddingBuf
]);
}
const cipher = createCipher(key);
cipher.setAutoPadding(_options.autoPadding);
const segment = cipher.update(dataBuffer);
const finals = cipher.final();
return Buffer.concat([segment, finals]).toString(_options.outputEncoding);
}
function decrypt(data, key, options) {
const _options = {
inputEncoding: "base64",
outputEncoding: "utf8",
autoPadding: true,
padding: "00",
...options
};
const decipher = createDecipher(key);
decipher.setAutoPadding(_options.autoPadding);
const segment = decipher.update(Buffer.from(data, _options.inputEncoding));
const finals = decipher.final();
return Buffer.concat([segment, finals]).toString(_options.outputEncoding);
}
export { createCipher, createDecipher, decrypt, index as default, encrypt };