OpenPGP.JS 生成与字符串内容分离的签名

OpenPGP.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
const openpgp = require('openpgp');


const key = `
-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: GnuPG v1

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
WezNJNjBW3Yajw==
=59+P
-----END PGP PRIVATE KEY BLOCK-----
`;

const passphrase = 'chen7-7';

(async () => {
const { keys: [privateKey] } = await openpgp.key.readArmored(key);

await privateKey.decrypt(passphrase);

const { signature: detachedSignature } = await openpgp.sign({
message: openpgp.cleartext.fromText('叔叔我啊,真的生气了!'),
privateKeys: [privateKey],
detached: true
});

console.log(detachedSignature);
})();