使用 OpenPGP.JS 和 PGP 密钥对来加密常见二进制数据

官方的文档虽然没有给出使用 PGP 密钥对加密普通二进制数据,但实际上这个库是可以做到的

encrypt.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
const fs = require('fs');
const openpgp = require('openpgp');
const publicKey = `
-----BEGIN PGP PUBLIC KEY BLOCK-----

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
QrMVlvN/M1x2KYGBnSnyjivh35/eL0R8Irau
=pm+Y
-----END PGP PUBLIC KEY BLOCK-----
`;
const file = new Uint8Array(fs.readFileSync('demo.txt'));

(async () => {
const encrypt = await openpgp.encrypt({
message: openpgp.message.fromBinary(file),
publicKeys: (await openpgp.key.readArmored(publicKey)).keys,
armor: false
});

const encrypted = encrypt.message.packets.write();
fs.writeFileSync('enctyped.txt.gpg', encrypted);
})();