Created
April 4, 2020 22:35
-
-
Save chornobils/0c7bf4bdbb09f6fa4e33c8fb8aded09b to your computer and use it in GitHub Desktop.
window.crypto.encode/decode Javascript example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var secretmessage = ""; | |
var password = ""; | |
var key_object = null; | |
var promise_key = null; | |
var encrypted_data = null; | |
var encrypt_promise = null; | |
var vector = window.crypto.getRandomValues(new Uint8Array(16)); | |
var decrypt_promise = null; | |
var decrypted_data = null; | |
function encryptThenDecrypt() { | |
secretmessage = document.getElementById("secretmessageField").value; // some string to encrypt | |
password = document.getElementById("passwordField").value; // some user-chosen password | |
promise_key = window.crypto.subtle.importKey( | |
"raw", | |
convertStringToArrayBuffer(password), | |
{"name": "PBKDF2"}, | |
false, | |
["deriveKey"] | |
); | |
promise_key.then(function(importedPassword) { | |
return window.crypto.subtle.deriveKey( | |
{ | |
"name": "PBKDF2", | |
"salt": convertStringToArrayBuffer("the salt is this random string"), | |
"iterations": 100000, | |
"hash": "SHA-256" | |
}, | |
importedPassword, | |
{ | |
"name": "AES-GCM", | |
"length": 128 | |
}, | |
false, | |
["encrypt", "decrypt"] | |
); | |
}).then(function(key) { | |
key_object = key; | |
encrypt_data(); | |
}); | |
promise_key.catch = function(e) { | |
alert("Error while importing key: " + e.message); | |
} | |
} | |
function encrypt_data() { | |
encrypt_promise = window.crypto.subtle.encrypt({name: "AES-GCM", iv: vector}, key_object, convertStringToArrayBuffer(secretmessage)); | |
encrypt_promise.then( | |
function(result) { | |
encrypted_data = new Uint8Array(result); | |
decrypt_data(); | |
}, | |
function(e) { | |
alert("Error while encrypting data: " + e.message); | |
} | |
); | |
} | |
function decrypt_data() { | |
decrypt_promise = window.crypto.subtle.decrypt({name: "AES-GCM", iv: vector}, key_object, encrypted_data); | |
decrypt_promise.then( | |
function(result){ | |
decrypted_data = new Uint8Array(result); | |
alert("Decrypted data: " + convertArrayBuffertoString(decrypted_data)); | |
}, | |
function(e) { | |
alert("Error while decrypting data: " + e.message); | |
} | |
); | |
} | |
function convertStringToArrayBuffer(str) { | |
var encoder = new TextEncoder("utf-8"); | |
return encoder.encode(str); | |
} | |
function convertArrayBuffertoString(buffer) { | |
var decoder = new TextDecoder("utf-8"); | |
return decoder.decode(buffer); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment