在浏览器里加密文件

使用 OpenPGP.JS 实现了在浏览器中加密文件并且下载

main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
const downloadBlob = (data, fileName, mimeType) => {
let blob, url;
blob = new Blob([data], {
type: mimeType
});
url = window.URL.createObjectURL(blob);
downloadURL(url, fileName);
setTimeout(function() {
return window.URL.revokeObjectURL(url);
}, 1000);
};

const downloadURL = (data, fileName) => {
let a;
a = document.createElement('a');
a.href = data;
a.download = fileName;
document.body.appendChild(a);
a.style = 'display: none';
a.click();
a.remove();
};

document.getElementById('file').onchange = (e) => {
const key = `-----BEGIN PGP PUBLIC KEY BLOCK-----

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
QrMVlvN/M1x2KYGBnSnyjivh35/eL0R8Irau
=pm+Y
-----END PGP PUBLIC KEY BLOCK-----
`;
const file = new Blob([e.currentTarget.files[0]], {
type: 'application/octet-stream'
})
const fileName = e.currentTarget.files[0].name;
const fileReader = new FileReader();

fileReader.readAsArrayBuffer(file, 'UTF-8');
fileReader.onload = async (data) => {
const arrayFile = new Uint8Array(data.target.result);
const encrypt = await openpgp.encrypt({
message: openpgp.message.fromBinary(arrayFile),
publicKeys: (await openpgp.key.readArmored(key)).keys,
armor: false
});
const encrypted = encrypt.message.packets.write();

downloadBlob(encrypted, `${fileName}.gpg`, 'application/octet-stream')
}
}

上面两个用于下载二进制文件的函数是从 StackOverFlow 扒过来的