Skip to content

Instantly share code, notes, and snippets.

@stalingino
Created January 8, 2024 12:22
Show Gist options
  • Save stalingino/d9c20f7a95949f73c90bdaa5508cf34e to your computer and use it in GitHub Desktop.
Save stalingino/d9c20f7a95949f73c90bdaa5508cf34e to your computer and use it in GitHub Desktop.
JS Subtle Crypto PKCS8 Example
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<p id="enc" style="word-wrap: break-word;"></p>
<p id="dec"></p>
<script type="module">
var keys = {
privateKey: "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC+NhYCJmAyVfk/DKOMpz0BOcLvedrUhP1dOgfGgdW2LPVpL2HoYGEPpo3Yhx5qPlPU1vLlcl/8cbVwPsPAxCeffWucmgTU4ATmzhglbS90zi/Cxs4N3pehAreL/Wiuf7bpHXZsWPIVRtcFKUk7jn3nmmKF8oth06mPBG+QAusmdbincwnHwJMXWN0lobwnaTWxj/A1JWXITAEUGaqMzFCTZyVapNRXnMbks6e3awnc6dzZYGwfZVx6ec7usn+sOeUENDaR+ND1dIM6i9FG/wRMHTBX3QnLlXkgsnEZMV5KmK3hgo5GZLCFnI6b1HjsrkwxpRY2HwETHGzlg57nAEDpAgMBAAECggEAYS9nTU/oRK+yuuktQzdLry2hERSUn5MXlSOKR32dAQi1lzmzb7SWwxVZUjGvc59G2++7iUpICsbaanBXOk2+5PmDGy+CmnWfa4IPykegQLD8rCtBqsp5dLXbrDYc31O31CHOmQtVHVPlluiCV2C1qbky77d+ScyIzN76VX14QlxwLCe5OqXSvTBqYDNQ/pUCDPvfrX75Y492pkOmZDwZ5o8xHYmcyK7gDhEL5LwiQbCAVDkHUeavoT0GnHsqYXeQGCBkPWCgWxDlLJcVDIgKhUhAetYMcF7PnnuKAvrH6Y/hRaOPd3nFCPVfdvUrT7eOhFtcpN5bLpkhQelLA+rcEQKBgQDerht1RxhpC+utC87dkWNwZ7rzq1KBpYr17bnF7RUlbcRfGhtjwcX1WpfIGB1bCGvdQi4sZ+HWtfFIMINNzB/Bgwef2H7P9vHCRCUcAzo8W6szzumQsjiSJjZ326J2tdvrxVho7KdWAfTChshNPRPRJwceqqklMnvrhOO7Xz+1tQKBgQDarD2s15MuzMPhW6yedXBJXgApXfk3rbbxT6gNHSOdaEdJYJKI/oUfroHI11mtp27iOEVEGxHXfuFhUsdIOaSuVCm/5VC025vCaVCAYMoKX6l0TeFOUDFFZvnur6RGGJ5uUnhJbZPCe87v/UAzsPz8yAsgFehWg8IXh3VCd4me5QKBgQCDHQjV2PKqh3ZRAa7gDwb53Fnbt3hxFcPoYf0MaTgWPbduN7UA28tvV9Qe4PQH8cFxGdKOGuyCu8ZBty7Y0+Ou0TPgDl08ni5jMDSZdd0IRQFdE+u6YvWkOBPCJvRV6WaAQEZ6IT22CpjPIQU3VUshz1UF3X6ShFMqrahZXw/oMQKBgQCbNO2BpHD/Iq9VYPAgeFJ+gI20ztJ4xn+2v0cUJ76DluQiHL1lJuHuHrpXhyJLsy9suWvQbzY2sgPeRBbWGLPeWDZZ0bV66PShBIby18APpN5tgmmMYDbYf8Kdu2Tpq8ennjlqRLA/tginJiVPiyvFb2cWGvaRkWtNsAN2bcnsUQKBgQCeiYGvStya77hDhs2cRXmhcN7OfCKkcSgmr+BYo+iTsDTVJrr7zCqsTzb4FzBO3NneDIU6zlsc9xrXisJrsrBvM4ro5jE1quC6lubAIuNZZblVIGeCCc3ONGrY4uV9mlJl8lxbTQd01NFjAhmtXo0p03AlvnbaZElVyRj6Vg0Pww==",
publicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvjYWAiZgMlX5PwyjjKc9ATnC73na1IT9XToHxoHVtiz1aS9h6GBhD6aN2Iceaj5T1Nby5XJf/HG1cD7DwMQnn31rnJoE1OAE5s4YJW0vdM4vwsbODd6XoQK3i/1orn+26R12bFjyFUbXBSlJO45955pihfKLYdOpjwRvkALrJnW4p3MJx8CTF1jdJaG8J2k1sY/wNSVlyEwBFBmqjMxQk2clWqTUV5zG5LOnt2sJ3Onc2WBsH2VcennO7rJ/rDnlBDQ2kfjQ9XSDOovRRv8ETB0wV90Jy5V5ILJxGTFeSpit4YKORmSwhZyOm9R47K5MMaUWNh8BExxs5YOe5wBA6QIDAQAB"
}
function base64ToArrayBuffer(base64) {
const binary_string = atob(base64);
const len = binary_string.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}
// Utility function to convert ArrayBuffer to string
function arrayBufferToString(arrayBuffer) {
// Convert array buffer to binary string
let binary = "";
const bytes = new Uint8Array(arrayBuffer);
for (let i = 0; i < bytes.byteLength; i++) {
binary += String.fromCharCode(bytes[i]);
}
// Convert binary string to base64
return btoa(binary);
}
var hwEnc = new TextEncoder().encode("Hello World")
// Create private CryptoKey
const privateCryptoKey = await crypto.subtle.importKey(
"pkcs8",
base64ToArrayBuffer(keys.privateKey),
{
name: "RSA-OAEP",
hash: "SHA-256",
},
true,
["decrypt"]
);
// Create public CryptoKey
const publicCryptoKey = await crypto.subtle.importKey(
"spki",
base64ToArrayBuffer(keys.publicKey),
{
name: "RSA-OAEP",
hash: "SHA-256",
},
true,
["encrypt"]
);
// browser code
var encData = await crypto.subtle.encrypt({name: "RSA-OAEP"}, publicCryptoKey, hwEnc)
document.getElementById('enc').innerHTML = arrayBufferToString(encData)
// server code
var decData = document.getElementById('enc').innerHTML
var data = await crypto.subtle.decrypt({name: "RSA-OAEP"}, privateCryptoKey, base64ToArrayBuffer(decData))
document.getElementById('dec').innerHTML = new TextDecoder().decode(data)
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment