在JavaScript中,可以使用 Web Crypto API 来加密数据,使用已有的 ECC 公钥和 Base64 编码的密钥。以下是一个示例,演示如何进行此操作:
示例代码
- 将 Base64 编码的公钥转换为
CryptoKey
对象。 - 使用该公钥加密数据。
下面是具体的步骤:
async function importEccPublicKey(base64PublicKey) {
// 将Base64编码的字符串转换为字节数组
const binaryDerString = window.atob(base64PublicKey);
const binaryDer = new Uint8Array(binaryDerString.length);
for (let i = 0; i < binaryDerString.length; i++) {
binaryDer[i] = binaryDerString.charCodeAt(i);
}
// 导入公钥
return await crypto.subtle.importKey(
"spki", // Key format: Subject Public Key Info (SPKI)
binaryDer,
{ name: "ECDSA", namedCurve: "P-256" }, // 使用适合你密钥曲线(如 P-256)
true, // 是否可以导出
["encrypt"] // 用于加密
);
}
async function encryptData(publicKey, data) {
const encodedData = new TextEncoder().encode(data);
// 加密数据
const ciphertext = await crypto.subtle.encrypt(
{
name: "ECDH", // 使用椭圆曲线 Diffie-Hellman 算法或根据需求选择算法
public: publicKey
},
publicKey,
encodedData
);
return ciphertext;
}
// 示例用法:
(async () => {
const base64PublicKey = "YOUR_BASE64_PUBLIC_KEY"; // 替换成你的Base64公钥字符串
const dataToEncrypt = "Hello, World!";
try {
const publicKey = await importEccPublicKey(base64PublicKey);
const encryptedData = await encryptData(publicKey, dataToEncrypt);
console.log("Encrypted Data:", new Uint8Array(encryptedData));
// 如果需要,你可以将encryptedData转为base64格式再输出:
const encryptedBase64 = btoa(String.fromCharCode(...new Uint8Array(encryptedData)));
console.log("Encrypted Data in Base64:", encryptedBase64);
} catch (error) {
console.error("Error:", error);
}
})();
注意事项
- 安全性:确保在安全环境中使用此代码,以避免敏感信息泄露。
- ECC 曲线:确保替换
namedCurve
为与您的公钥匹配的曲线,例如P-256
,P-384
或P-521
。 - 浏览器兼容性:Web Crypto API 在现代浏览器中受支持,但请检查其兼容性以确保在目标平台上可用。
- 错误处理:实际应用中,务必加入适当的错误处理逻辑。
以上代码仅作为参考,可能需根据具体情况做调整。
内容由零声教学AI助手提供,问题来源于学员提问