0

我正在尝试从仅浏览器的 window.subtle.crypto 迁移到 CryptoJS,因此它在使用 Expo 的所有平台上普遍可用。

本质上:window.subtle.encrypt({name: AES-GCM}) -> CryptoJS.AES.decrypt

对于已加密的现有数据,CryptoJS 应该能够使用 window.subtle.generateKey 中的 AES 生成的密钥对其进行解密,因此 window.subtle.encrypt 的方法无法更改,其操作如下所述

我想解密window.subtle.encryptCryptoJS 的加密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)但仍然没有运气。

任何帮助或指导表示赞赏,非常感谢!

4

0 回答 0