const { subtle } = crypto const iterations = 1000; const dec = async () => { try { let password = await prompt('password for decrypt: ') password = password.trim() let data = await prompt('encrypted base64 data: ') data = data.trim() const encoder = new TextEncoder() const keyMaterial = await subtle.importKey( 'raw', encoder.encode(password), 'PBKDF2', false, ['deriveKey', 'deriveBits'] ) const salt = encoder.encode(password) const bits = await subtle.deriveBits({ name: 'PBKDF2', hash: 'SHA-512', salt, iterations }, keyMaterial, 256) const key = await subtle.deriveKey( { name: 'PBKDF2', hash: 'SHA-512', salt, iterations }, keyMaterial, { name: 'AES-GCM', length: 256, }, true, ['encrypt', 'decrypt'] ) const ciphertext = Uint8Array.from(atob(data), c => c.charCodeAt(0)) const decrypted = await subtle.decrypt( { name: 'AES-GCM', iv: bits }, key, ciphertext ) const decoder = new TextDecoder() console.log('original: ', decoder.decode(decrypted)) } catch (err) { console.error('Question rejected', err) } }