Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

214
Vistas
Javascript Vernam Cipher: garantiza la salida entre Unicode 32 y 126

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!

about 4 years ago · Juan Pablo Isaza
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda