我正在尝试从仅浏览器的 window.subtle.crypto 迁移到 CryptoJS,因此它在使用 Expo 的所有平台上普遍可用。
本质上:window.subtle.encrypt({name: AES-GCM}) -> CryptoJS.AES.decrypt
对于已加密的现有数据,CryptoJS 应该能够使用 window.subtle.generateKey 中的 AES 生成的密钥对其进行解密,因此 window.subtle.encrypt 的方法无法更改,其操作如下所述
我想解密window.subtle.encrypt
CryptoJS 的加密CryptoJS.AES.decrypt
所以为此,我编写了这个测试代码:
const text = "This is an encrypted message";
const generateKey = async () => {
const key = await window.crypto.subtle.generateKey({ name: "AES-GCM", length: 128 }, true, ["encrypt", "decrypt"]);
const key_exported = await window.crypto.subtle.exportKey("jwk", key);
return key_exported.k;
}
const printCurrent = async () => {
let kkey = await generateKey();
await window.crypto.subtle.importKey(
"jwk",
{
k: kkey,
alg: "A128GCM",
ext: true,
key_ops: ["encrypt", "decrypt"],
kty: "oct",
},
{ name: "AES-GCM", length: 128 },
false,
["encrypt", "decrypt"]
).then(function(key){
window.crypto.subtle.encrypt({ name: "AES-GCM", iv: new Uint8Array(12) }, key, new TextEncoder().encode(JSON.stringify(text))).then( function(encryptedObject){
const cryptojs = CryptoJS.AES.decrypt(encryptedObject,key,{iv: new Uint8Array(12));
console.log("cryptojs: ", cryptojs.toString(CryptoJS.enc.Utf8));
});
} );
}
printCurrent();
我已经看到 CryptoJS 只接受 WordArray,并且来自微妙加密的加密对象 ['encryptedObject'] 的输出是 ArrayBuffer [46 大小],我尝试通过将 ArrayBuffer 转换为 WordArrayCryptoJS.lib.WordArray.create(encryptedObject)
但仍然没有运气。
任何帮助或指导表示赞赏,非常感谢!