Skip to content

Instantly share code, notes, and snippets.

@slaveofcode
Created December 18, 2019 08:43
Show Gist options
  • Save slaveofcode/8e72d5cc8ffa75347a6f344c787848b2 to your computer and use it in GitHub Desktop.
Save slaveofcode/8e72d5cc8ffa75347a6f344c787848b2 to your computer and use it in GitHub Desktop.
XOR Cipher for as Nuxt Plugin
/* 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