RC4 encrypt/decrypt

author: https://github.com/Aleksandr-JS-Developer

by Alexander

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js" integrity="sha512-E8QSvWZ0eCLGk4km3hxSsNmGWbLtSCSUcewDQPQWZF6pEU8GlT8a5fF32wOl1i8ftdMhssTrF/OhyGWwonTcXA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

<div>
  <h1>encrypt/decrypt file</h1>
	<ol>
		<li>Set password</li>
		<li>Pick a file</li>
		<li>Download decrypted/encrypted file</li>
	</ol>
  <div>
    <input type="text" id="pass" placeholder="pass">
    <button id="encrypt">encrypt file</button>
    <button id="decrypt">decrypt file</button>
		<button id="test">test</button>
  </div>
</div>

JavaScript

// support
const download = (data, filename, type) => {
  const file = new Blob([data], { type: type });
  const a = document.createElement('a');
  const url = URL.createObjectURL(file);

  a.href = url;
  a.download = filename;
  document.body.appendChild(a);

  a.click();

  setTimeout(function () {
    document.body.removeChild(a);
    window.URL.revokeObjectURL(url);
  }, 0);
};

const pickAFile = (getText = true) => {
  return new Promise((resolve, reject) => {
    const input = document.createElement('input');
    input.type = 'file';
    input.onchange = (e) => {
      const file = e.target.files[0];
      const reader = new FileReader();
      if (!getText) {
        resolve(file);
      } else {
        reader.onload = (e) => resolve(e.target.result);
        reader.onerror = (e) => reject(e);
        reader.readAsText(file);
      }
    };
    input.click();
  });
};
// /support

function app() {
  const passNode = document.querySelector('input#pass');
  const encryptNode = document.querySelector('#encrypt');
  const decryptNode = document.querySelector('#decrypt');

  encryptNode.addEventListener('click', () => {
    if (!passNode.value) return alert('Password input is empty! Aborting.');
    const pass = CryptoJS.SHA3(passNode.value);
    pickAFile(false).then((file) => {
      const reader = new FileReader();
			
      reader.onload = (e) => {
        const wordArray = CryptoJS.lib.WordArray.create(e.target.result);
        const encrypted = CryptoJS.RC4.encrypt(wordArray, pass).toString();
        download(encrypted, `encrypted-${file.name}`, file.type);
      };
			
      reader.readAsArrayBuffer(file);
    });
  });

  decryptNode.addEventListener('click', () => {
    if (!passNode.value) return alert('Password input is empty! Aborting.');
    const pass = CryptoJS.SHA3(passNode.value);
    pickAFile(false).then((file) => {
      const reader = new FileReader();
			
      reader.onload = (e) => {
        try {
          const decrypted =...