使用 SubtleCrypto 生成一个长度为 16 字节的随机对称密钥,代码示例如下:
window.crypto.subtle.generateKey(
{
name: 'AES-GCM',
length: 128,
},
true,
['encrypt', 'decrypt']
)
.then((key) => {
// 获取密钥值
window.crypto.subtle.exportKey('raw', key)
.then((keyValue) => {
console.log(keyValue);
});
})
.catch((e) => {
console.error(e);
});
使用 SJCL 库加密明文,代码示例如下:
// 生成随机的 IV
const iv = sjcl.random.randomWords(3);
// 将明文转为比特数组,并加密
const plaintextBits = sjcl.codec.utf8String.toBits('Hello World');
const encryptedBits = sjcl.mode.gcm.encrypt(
new sjcl.cipher.aes(keyValue),
plaintextBits,
iv
);
// 将加密后的比特数组转为 Base64 编码
const encryptedBase64 = sjcl.codec.base64.fromBits(encryptedBits);
console.log(encryptedBase64);
将密钥和加密后的密文传输给接收方,并确保密钥不被泄露。
接收方使用 SJCL 库将密文进行解密,并验证密钥是否正确,代码示例如下:
// 将 Base64 编码的密文转为比特数组
const encryptedBits = sjcl.codec.base64.toBits(encryptedBase64);
// 从接收到的数据中获取密钥值
const receivedKeyValue = ... // 省略从接收到的