Skip to content

Commit 67c95e5

Browse files
save file
1 parent 8e03c51 commit 67c95e5

1 file changed

Lines changed: 181 additions & 0 deletions

File tree

  • blog/26-04-26/x509-certificates-in-js---encrypt-decrypt-data/ex
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
2+
3+
4+
!async function(){
5+
console.clear();
6+
7+
8+
var {forge} = await import('https://libs.ext-code.com/external/js/node-forge/node-forge.m.js');
9+
10+
11+
12+
var key = `
13+
-----BEGIN PRIVATE KEY-----
14+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCxmOIm6QsAC/59
15+
OMC/fkLkf4eAuKggR8400SkbtquAk7+z/4mrdlnCnOnpUQqUEr/AN6xDJZqkbxRL
16+
ZRwtlaffZbER1cW3Tbk8xDOzmQiVF/frLJwXjiK8JzfVnqpdVym5w5nK313hJ6OX
17+
tQBrdfMgMKTA84nhbLHtW2CFbOY3yc7dntuUqRkAY53Hry3R3n5pZtJdyjTEVnoz
18+
fURCwEFfnfQxMJJ8ia5oG9w5MIZXi2s+AC2+WCEXYU3K+Wrua74M0S1cLlgRojer
19+
sOctsTpppXLpDh+OtINGiLI9citrH+nLBf61N8Vh5Pzqpx07k4J1qLoBGDXhs9IX
20+
bJZEBhuBAgMBAAECggEANyd0rILZULVo3ni+m3nZyl60tUwjoorKRmriqmGrl23L
21+
Llpg5egGbkMO/c+WSnAcLtTbYasPAJwioFuRSbLdhKpvOEu8cHXp3i5MpC0Vlj/w
22+
VY/wFfylWuuPEn+JBx3nrnJJk9CUtjT6QEYNEFJ8I/YXZHj9zA1WoJEtQ6KTSKWV
23+
c9Ni4SxYqkY0rBvzT/2gGeY2MbGPUGUENLdMFxRdPPCu4XxmM/C/vVG0jJKbvBDT
24+
8UOSHUwGCpnVSqWAeqNYyDjvZu+unDLZXSc87QSN8Y4H9OGAJ96YW1AGcSamkz8m
25+
Qb0u4vpFnfjzhCN4IBWMZNq8DPV7J3MJwK1RzdglBQKBgQDw9X7DrWDC//+D8p8D
26+
2UIN8OlTeVnLveUFZbQLoPPIPaEkw02K2m4Ho8+g/lHnHRygh/aRds9RiBKJ0ydv
27+
gkJwkN9JJ1YzRfpXUNCY+Dv83yXvnoVaX2db/gpFTEEYdU0f7n+GxeEfeIAepcUw
28+
24RSQv5pwT6PhDK6D//mX9FuvwKBgQC8rt9SBPODD4lbjGEvpQGD1Y0HQGma/4Vo
29+
9XAoqnJZCt7DgNAt52Aq9fAC2hR263x2yh4/Bx7pkDCRLAvz2UpNU3jyNRUNVszm
30+
INVv5u1vrO/dnWeqHL1IkNM6wPQzMu5HFuGzkK/hqqxHq+vx1vaXnylXAfWyh2/Y
31+
zZCakdVFvwKBgDLFd5Vhhd7ws/UofSsBbzKizXciPbJ5a7VMbbh5jIRnv/mQEVmt
32+
lruTX59rlvRcpPiKTYDvCNYEFuvliwyq5Lb1P6cZW8dn+kzFoX5p57HrjwHDZBPb
33+
wFqY168sVxcBOGP/C+3o6fuIl25dvYQC7QmsRhEgf78butiLoH75N5bfAoGBALbY
34+
K9earrRCGRTba86080vjZUAyvmQS3CDDQAZYbmk1bHw+Vv806e+X1xecaBp5x2qC
35+
IV9osh8auMXlzktnNWbLzjfBEv6TMAqOpOdE/LCtAOFcyPmD0jYBCoE0PTFkWJ4R
36+
YXUWcCqar0rhIsuASgTSm0gSwRtZvhx10HzJd8iXAoGAB4R5cCA6RAVzlJVXYVQ7
37+
8rAgrI4TiQ6+Jzdq9VNRyLnMJ1ABIN5RK4pa+Gd4LQuSWPyAp8PoVzrN9tv3x0om
38+
yu1oIACUws53sGrzHpEEvCsUMzzLoDjukcViWE3njfQCq8mhW8JUH15lAh/+L7rK
39+
7mJ3nfrCVI3DR83ar/sRG4Q=
40+
-----END PRIVATE KEY-----
41+
`;
42+
43+
var cert = `
44+
-----BEGIN CERTIFICATE-----
45+
MIIDfDCCAmSgAwIBAgIIpL8fq0UzAwgwDQYJKoZIhvcNAQELBQAwJTEjMCEGA1UE
46+
AxMabG9jYWxob3N0IHRlc3QgY2VydGlmaWNhdGUwHhcNMjYwNDI2MTgxOTAwWhcN
47+
MjcwNDI2MTgxOTAwWjAlMSMwIQYDVQQDExpsb2NhbGhvc3QgdGVzdCBjZXJ0aWZp
48+
Y2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALGY4ibpCwAL/n04
49+
wL9+QuR/h4C4qCBHzjTRKRu2q4CTv7P/iat2WcKc6elRCpQSv8A3rEMlmqRvFEtl
50+
HC2Vp99lsRHVxbdNuTzEM7OZCJUX9+ssnBeOIrwnN9Weql1XKbnDmcrfXeEno5e1
51+
AGt18yAwpMDzieFsse1bYIVs5jfJzt2e25SpGQBjncevLdHefmlm0l3KNMRWejN9
52+
RELAQV+d9DEwknyJrmgb3DkwhleLaz4ALb5YIRdhTcr5au5rvgzRLVwuWBGiN6uw
53+
5y2xOmmlcukOH460g0aIsj1yK2sf6csF/rU3xWHk/OqnHTuTgnWougEYNeGz0hds
54+
lkQGG4ECAwEAAaOBrzCBrDAMBgNVHRMBAf8EAjAAMCAGA1UdEQQZMBeCCWxvY2Fs
55+
aG9zdIcEfwAAAYcEfwAAAjAdBgNVHQ4EFgQU3k/k6mVExJziZIwxZxmdsP6lPJEw
56+
CwYDVR0PBAQDAgL0MDsGA1UdJQQ0MDIGCCsGAQUFBwMCBggrBgEFBQcDAwYIKwYB
57+
BQUHAwQGCCsGAQUFBwMBBggrBgEFBQcDCDARBglghkgBhvhCAQEEBAMCAOcwDQYJ
58+
KoZIhvcNAQELBQADggEBAEyq4Fog+tbPN5jzjWz19GreYZdStt7MDPLW9nbL38TK
59+
6DlGZV37HTGdp5F+IWDImh2gCUzPSK9D9QPWNVVG85qC3oZnSktKxjeucjBsMtMi
60+
v18gTYyCdF/nQm34czuYjnPA44RJCiqsJreBtaNERPHP+ki++nsq707dBq8pfl+r
61+
ox+kK4iUcI3x/F6CvDMru1LXxAU81kLY+F7RqJRieZr+SaOxPtlz4+U/HxY5k9FK
62+
ImLsCyhzLJREirc892Cbb8s8Q9mJKnQtydpG7U2SGd/D+Gapwql5Lg1VM+PaJgWW
63+
8nq7W+J/VuFG+JOzYSKe9qzEVnsmnbxvxwZpW6VuFEE=
64+
-----END CERTIFICATE-----
65+
`;
66+
67+
68+
69+
70+
var secret = "hello world";
71+
var blob = new Blob([secret]);
72+
var encrypted_blob = await encrypt(blob,cert);
73+
var b64 = await blob_b64(encrypted_blob);
74+
console.log("Encrypted:",b64);
75+
var blob = await decrypt(encrypted_blob,key);
76+
var decrypted = await blob.text();
77+
console.log("Decrypted:", decrypted);
78+
79+
80+
//:
81+
82+
83+
function extract_spki(cert){
84+
85+
var cert = forge.pki.certificateFromPem(cert);
86+
var spkiAsn1 = forge.pki.publicKeyToAsn1(cert.publicKey);
87+
var der = forge.asn1.toDer(spkiAsn1).getBytes();
88+
var uint8 = Uint8Array.from(der, c => c.charCodeAt(0));
89+
return uint8;
90+
91+
}//extract_spki
92+
93+
94+
async function pub_key(cert){
95+
96+
var spki = extract_spki(cert);
97+
var buf = spki.buffer;
98+
var pub_key = await crypto.subtle.importKey('spki',buf,{name:'RSA-OAEP',hash:'SHA-256'},true,['encrypt']);
99+
return pub_key;
100+
101+
}//pub_key
102+
103+
104+
async function encrypt(blob,cert){
105+
106+
var publicKey = await pub_key(cert);
107+
var buf = await blob.arrayBuffer();
108+
var encrypted = await crypto.subtle.encrypt({name:'RSA-OAEP'},publicKey,buf);
109+
var uint8 = new Uint8Array(encrypted);
110+
var blob = new Blob([unint8]);
111+
return blob;
112+
113+
}//encrypt
114+
115+
116+
//:
117+
118+
119+
async function priv_key(pem){
120+
121+
var b64 = pem.replace(/-----BEGIN PRIVATE KEY-----/, "")
122+
.replace(/-----END PRIVATE KEY-----/, "")
123+
.replace(/\s+/g, "");
124+
var bin = atob(b64);
125+
var der = Uint8Array.from(bin,c=>c.charCodeAt(0));
126+
var priv_key = await crypto.subtle.importKey("pkcs8",der.buffer,{name: "RSA-OAEP",hash: "SHA-256",},true,["decrypt"]);
127+
return priv_key;
128+
129+
}//priv_key
130+
131+
132+
async function decrypt(blob,key){
133+
134+
var privateKey = await priv_key(key);
135+
var uint8 = await blob_uint8(blob);
136+
//var bin = atob(b64)
137+
//var uint8 = Uint8Array.from(bin,c=>c.charCodeAt(0));
138+
var buffer = await crypto.subtle.decrypt({name:"RSA-OAEP",},privateKey,uint8);
139+
var blob = new Blob([buffer]);
140+
return blob;
141+
142+
var txt = new TextDecoder().decode(plaintextBuffer);
143+
return txt;
144+
145+
}//decrypt
146+
147+
148+
149+
function b64_uint8(b64){
150+
151+
var str = atob(b64);
152+
var n = str.length;
153+
var uint8 = new Uint8Array(n);
154+
for(var i=0;i<n;i++){
155+
156+
var c = str[i];
157+
uint8[i] = c.charCodeAt(0);
158+
159+
}//for
160+
return uint8;
161+
162+
}//b64_uint8
163+
164+
165+
async function blob_b64(blob){
166+
167+
var buf = await blob.arrayBuffer();
168+
return btoa(String.fromCharCode(...new Uint8Array(buf)));
169+
170+
}//blob_b64
171+
172+
173+
174+
175+
}();
176+
177+
178+
179+
180+
181+

0 commit comments

Comments
 (0)