He implementado lo siguiente como máscara para algunos datos:
function jEncryptDecrypt(data,key) { let jKey = '' let bytKey = []; let bytData = []; for (let i = 1; i < (data.length/key.length) +1; i++) { jKey = jKey + key; } let str = jKey.substring(0, data.length); for (let i = 0; i < str.length; ++i) { var code = str.charCodeAt(i); bytKey = bytKey.concat([code & 0xff, code / 256 >>> 0]); } let str2 = data for (let i = 0; i < str2.length; ++i) { var code = str2.charCodeAt(i); bytData = bytData.concat([code & 0xff, code / 256 >>> 0]); } for (let i = 0; i < bytData.length; ++i) { bytData[i] = bytData[i] ^ bytKey[i]; } str3 = String.fromCharCode(...bytData) str3 = str3.replace(/\0/g, ''); return str3; }Para algunas salidas, los bytes en el mapa bytData para escapar de los caracteres; dependiendo de dónde ejecute el código, obtengo el carácter (JSFiddle) o obtengo \uXXXX (aplicación de terceros). La salida podría terminar siendo tratada en diferentes plataformas/idiomas, por lo que idealmente me gustaría evitar los caracteres especiales y solo tener caracteres en el rango Unicode de 32 a 126.
es posible? La aplicación en la que estoy implementando esto es bastante restrictiva, por lo que no puedo usar ninguna biblioteca, solo JS puro.
Editar
Cambié el código al siguiente, que genera una serie de números en el cifrado y los acepta como entrada en el descifrado
function jEncryptDecrypt(data,key) { let jKey = '' let bytKey = []; let bytData = []; //expand key to cover length of input for (let i = 1; i < (data.length/key.length) +1; i++) { jKey = jKey + key; } //shorten key to same lenght as input let str = jKey.substring(0, data.length); //loop over key to create array of numbers from unicode value for (let i = 0; i < str.length; ++i) { var code = str.charCodeAt(i); bytKey = bytKey.concat([code & 0xff, code / 256 >>> 0]); } //if data input is array no need to do anything if (Array.isArray(data)) { bytData = data; //otherwise loop over data to create array of numbers from unicode value } else { let str2 = data for (let i = 0; i < str2.length; ++i) { var code = str2.charCodeAt(i); bytData = bytData.concat([code & 0xff, code / 256 >>> 0]); } } //XOR each data value with each key value in turn for (let i = 0; i < bytData.length; ++i) { bytData[i] = (bytData[i] ^ bytKey[i]); } //if input was array return string, otherwise return array if (Array.isArray(data)) { str3 = String.fromCharCode(...bytData) str3 = str3.replace(/\0/g, ''); return str3; } else { return bytData; } }Es torpe y hacky, pero funciona para mis necesidades. ¡Si hay una respuesta a la pregunta original, sería muy apreciada!