Skip to content

Commit e179b16

Browse files
save file
1 parent 67c95e5 commit e179b16

1 file changed

Lines changed: 166 additions & 0 deletions

File tree

  • blog/26-04-26/x509-certificates-in-js---encrypt-decrypt-data/ex
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
2+
(async()=>{
3+
4+
5+
var crypto = require('node:crypto');
6+
7+
var {key,cert} = setup();
8+
9+
var secret = 'my-super-secret-token';
10+
var blob = new Blob([secret]);
11+
12+
var blob = await encrypt(blob,cert);
13+
var b64 = await blob_b64(blob);
14+
console.log('Encrypted (base64):',b64);
15+
16+
var recovered = await decrypt(blob,key);
17+
var txt = await recovered.text();
18+
console.log('Recovered:',txt);
19+
20+
21+
// Encrypt with public key from X.509 cert
22+
async function encrypt(source,cert){
23+
24+
var buffer;
25+
26+
var type = datatype(source);
27+
switch(type){
28+
29+
case 'string' : buffer = Buffer.from(source,'utf8');
30+
break;
31+
32+
case 'blob' : const arrayBuffer = await source.arrayBuffer();
33+
buffer = Buffer.from(arrayBuffer);
34+
break;
35+
36+
case 'uint8array' : buffer = source;
37+
break;
38+
39+
}//switch
40+
41+
42+
var key = cert;
43+
var padding = crypto.constants.RSA_PKCS1_OAEP_PADDING;
44+
var oaepHash = 'sha256';
45+
var params = {key,padding,oaepHash};
46+
const encrypted = crypto.publicEncrypt(params,buffer);
47+
48+
var blob = new Blob([encrypted]);
49+
return blob;
50+
51+
}//encrypt
52+
53+
// Decrypt with private key
54+
async function decrypt(source,key){
55+
56+
var buffer;
57+
58+
var type = datatype(source);
59+
switch(type){
60+
61+
case 'string' : buffer = Buffer.from(base64,'base64');
62+
break;
63+
64+
case 'blob' : const arrayBuffer = await source.arrayBuffer();
65+
buffer = Buffer.from(arrayBuffer);
66+
break;
67+
68+
case 'uint8array' : buffer = source;
69+
break;
70+
71+
}//switch
72+
73+
var key = key
74+
var padding = crypto.constants.RSA_PKCS1_OAEP_PADDING;
75+
var oaepHash = 'sha256';
76+
var params = {key,padding,oaepHash};
77+
var decrypted = crypto.privateDecrypt(params,buffer);
78+
79+
var blob = new Blob([decrypted]);
80+
return blob;
81+
82+
}//decrypt
83+
84+
85+
86+
87+
88+
function datatype(v){return v.toString().slice(8,-1).toLowerCase()}
89+
90+
async function blob_b64(blob){
91+
92+
const arrayBuffer = await blob.arrayBuffer();
93+
var buffer = Buffer.from(arrayBuffer);
94+
var b64 = buffer.toString('base64');
95+
return b64;
96+
97+
}//blob_b64
98+
99+
100+
function setup(){
101+
102+
var key = `
103+
-----BEGIN PRIVATE KEY-----
104+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCxmOIm6QsAC/59
105+
OMC/fkLkf4eAuKggR8400SkbtquAk7+z/4mrdlnCnOnpUQqUEr/AN6xDJZqkbxRL
106+
ZRwtlaffZbER1cW3Tbk8xDOzmQiVF/frLJwXjiK8JzfVnqpdVym5w5nK313hJ6OX
107+
tQBrdfMgMKTA84nhbLHtW2CFbOY3yc7dntuUqRkAY53Hry3R3n5pZtJdyjTEVnoz
108+
fURCwEFfnfQxMJJ8ia5oG9w5MIZXi2s+AC2+WCEXYU3K+Wrua74M0S1cLlgRojer
109+
sOctsTpppXLpDh+OtINGiLI9citrH+nLBf61N8Vh5Pzqpx07k4J1qLoBGDXhs9IX
110+
bJZEBhuBAgMBAAECggEANyd0rILZULVo3ni+m3nZyl60tUwjoorKRmriqmGrl23L
111+
Llpg5egGbkMO/c+WSnAcLtTbYasPAJwioFuRSbLdhKpvOEu8cHXp3i5MpC0Vlj/w
112+
VY/wFfylWuuPEn+JBx3nrnJJk9CUtjT6QEYNEFJ8I/YXZHj9zA1WoJEtQ6KTSKWV
113+
c9Ni4SxYqkY0rBvzT/2gGeY2MbGPUGUENLdMFxRdPPCu4XxmM/C/vVG0jJKbvBDT
114+
8UOSHUwGCpnVSqWAeqNYyDjvZu+unDLZXSc87QSN8Y4H9OGAJ96YW1AGcSamkz8m
115+
Qb0u4vpFnfjzhCN4IBWMZNq8DPV7J3MJwK1RzdglBQKBgQDw9X7DrWDC//+D8p8D
116+
2UIN8OlTeVnLveUFZbQLoPPIPaEkw02K2m4Ho8+g/lHnHRygh/aRds9RiBKJ0ydv
117+
gkJwkN9JJ1YzRfpXUNCY+Dv83yXvnoVaX2db/gpFTEEYdU0f7n+GxeEfeIAepcUw
118+
24RSQv5pwT6PhDK6D//mX9FuvwKBgQC8rt9SBPODD4lbjGEvpQGD1Y0HQGma/4Vo
119+
9XAoqnJZCt7DgNAt52Aq9fAC2hR263x2yh4/Bx7pkDCRLAvz2UpNU3jyNRUNVszm
120+
INVv5u1vrO/dnWeqHL1IkNM6wPQzMu5HFuGzkK/hqqxHq+vx1vaXnylXAfWyh2/Y
121+
zZCakdVFvwKBgDLFd5Vhhd7ws/UofSsBbzKizXciPbJ5a7VMbbh5jIRnv/mQEVmt
122+
lruTX59rlvRcpPiKTYDvCNYEFuvliwyq5Lb1P6cZW8dn+kzFoX5p57HrjwHDZBPb
123+
wFqY168sVxcBOGP/C+3o6fuIl25dvYQC7QmsRhEgf78butiLoH75N5bfAoGBALbY
124+
K9earrRCGRTba86080vjZUAyvmQS3CDDQAZYbmk1bHw+Vv806e+X1xecaBp5x2qC
125+
IV9osh8auMXlzktnNWbLzjfBEv6TMAqOpOdE/LCtAOFcyPmD0jYBCoE0PTFkWJ4R
126+
YXUWcCqar0rhIsuASgTSm0gSwRtZvhx10HzJd8iXAoGAB4R5cCA6RAVzlJVXYVQ7
127+
8rAgrI4TiQ6+Jzdq9VNRyLnMJ1ABIN5RK4pa+Gd4LQuSWPyAp8PoVzrN9tv3x0om
128+
yu1oIACUws53sGrzHpEEvCsUMzzLoDjukcViWE3njfQCq8mhW8JUH15lAh/+L7rK
129+
7mJ3nfrCVI3DR83ar/sRG4Q=
130+
-----END PRIVATE KEY-----
131+
`;
132+
133+
var cert = `
134+
-----BEGIN CERTIFICATE-----
135+
MIIDfDCCAmSgAwIBAgIIpL8fq0UzAwgwDQYJKoZIhvcNAQELBQAwJTEjMCEGA1UE
136+
AxMabG9jYWxob3N0IHRlc3QgY2VydGlmaWNhdGUwHhcNMjYwNDI2MTgxOTAwWhcN
137+
MjcwNDI2MTgxOTAwWjAlMSMwIQYDVQQDExpsb2NhbGhvc3QgdGVzdCBjZXJ0aWZp
138+
Y2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALGY4ibpCwAL/n04
139+
wL9+QuR/h4C4qCBHzjTRKRu2q4CTv7P/iat2WcKc6elRCpQSv8A3rEMlmqRvFEtl
140+
HC2Vp99lsRHVxbdNuTzEM7OZCJUX9+ssnBeOIrwnN9Weql1XKbnDmcrfXeEno5e1
141+
AGt18yAwpMDzieFsse1bYIVs5jfJzt2e25SpGQBjncevLdHefmlm0l3KNMRWejN9
142+
RELAQV+d9DEwknyJrmgb3DkwhleLaz4ALb5YIRdhTcr5au5rvgzRLVwuWBGiN6uw
143+
5y2xOmmlcukOH460g0aIsj1yK2sf6csF/rU3xWHk/OqnHTuTgnWougEYNeGz0hds
144+
lkQGG4ECAwEAAaOBrzCBrDAMBgNVHRMBAf8EAjAAMCAGA1UdEQQZMBeCCWxvY2Fs
145+
aG9zdIcEfwAAAYcEfwAAAjAdBgNVHQ4EFgQU3k/k6mVExJziZIwxZxmdsP6lPJEw
146+
CwYDVR0PBAQDAgL0MDsGA1UdJQQ0MDIGCCsGAQUFBwMCBggrBgEFBQcDAwYIKwYB
147+
BQUHAwQGCCsGAQUFBwMBBggrBgEFBQcDCDARBglghkgBhvhCAQEEBAMCAOcwDQYJ
148+
KoZIhvcNAQELBQADggEBAEyq4Fog+tbPN5jzjWz19GreYZdStt7MDPLW9nbL38TK
149+
6DlGZV37HTGdp5F+IWDImh2gCUzPSK9D9QPWNVVG85qC3oZnSktKxjeucjBsMtMi
150+
v18gTYyCdF/nQm34czuYjnPA44RJCiqsJreBtaNERPHP+ki++nsq707dBq8pfl+r
151+
ox+kK4iUcI3x/F6CvDMru1LXxAU81kLY+F7RqJRieZr+SaOxPtlz4+U/HxY5k9FK
152+
ImLsCyhzLJREirc892Cbb8s8Q9mJKnQtydpG7U2SGd/D+Gapwql5Lg1VM+PaJgWW
153+
8nq7W+J/VuFG+JOzYSKe9qzEVnsmnbxvxwZpW6VuFEE=
154+
-----END CERTIFICATE-----
155+
`;
156+
157+
return {key,cert};
158+
159+
}//setu
160+
161+
162+
163+
})();
164+
165+
166+

0 commit comments

Comments
 (0)