Created
December 18, 2019 08:43
-
-
Save slaveofcode/8e72d5cc8ffa75347a6f344c787848b2 to your computer and use it in GitHub Desktop.
XOR Cipher for as Nuxt Plugin
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* eslint-disable one-var */ | |
/* eslint-disable camelcase */ | |
/* eslint-disable unicorn/number-literal-case */ | |
import Vue from 'vue' | |
import { map } from 'lodash' | |
// inspired from here: https://gist.github.com/sukima/5613286 | |
const b64_table = | |
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' | |
const Encrypt = (key, data) => b64_encode(xor_encrypt(key, data)) | |
const Decrypt = (key, data) => xor_decrypt(key, b64_decode(data)) | |
function b64_encode(data) { | |
let o1, | |
o2, | |
o3, | |
h1, | |
h2, | |
h3, | |
h4, | |
bits, | |
i = 0, | |
enc = '' | |
if (!data) { | |
return data | |
} | |
do { | |
o1 = data[i++] | |
o2 = data[i++] | |
o3 = data[i++] | |
bits = (o1 << 16) | (o2 << 8) | o3 | |
h1 = (bits >> 18) & 0x3f | |
h2 = (bits >> 12) & 0x3f | |
h3 = (bits >> 6) & 0x3f | |
h4 = bits & 0x3f | |
enc += | |
b64_table.charAt(h1) + | |
b64_table.charAt(h2) + | |
b64_table.charAt(h3) + | |
b64_table.charAt(h4) | |
} while (i < data.length) | |
const r = data.length % 3 | |
return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3) | |
} | |
function b64_decode(data) { | |
let o1, | |
o2, | |
o3, | |
h1, | |
h2, | |
h3, | |
h4, | |
bits, | |
i = 0 | |
const result = [] | |
if (!data) { | |
return data | |
} | |
data += '' | |
do { | |
h1 = b64_table.indexOf(data.charAt(i++)) | |
h2 = b64_table.indexOf(data.charAt(i++)) | |
h3 = b64_table.indexOf(data.charAt(i++)) | |
h4 = b64_table.indexOf(data.charAt(i++)) | |
bits = (h1 << 18) | (h2 << 12) | (h3 << 6) | h4 | |
o1 = (bits >> 16) & 0xff | |
o2 = (bits >> 8) & 0xff | |
o3 = bits & 0xff | |
result.push(o1) | |
if (h3 !== 64) { | |
result.push(o2) | |
if (h4 !== 64) { | |
result.push(o3) | |
} | |
} | |
} while (i < data.length) | |
return result | |
} | |
function keyCharAt(key, i) { | |
return key.charCodeAt(Math.floor(i % key.length)) | |
} | |
function xor_encrypt(key, data) { | |
return map(data, function(c, i) { | |
return c.charCodeAt(0) ^ keyCharAt(key, i) | |
}) | |
} | |
function xor_decrypt(key, data) { | |
return map(data, function(c, i) { | |
return String.fromCharCode(c ^ keyCharAt(key, i)) | |
}).join('') | |
} | |
Vue.filter('XOREncrypt', Encrypt) | |
Vue.filter('XORDecrypt', Decrypt) | |
// inject to context to be able to use across client-server | |
// see: https://nuxtjs.org/guide/plugins/#inject-into-context | |
export default ({ app }) => { | |
app.$XOR = { | |
Decrypt, | |
Encrypt | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment