【发布时间】:2022-01-16 03:54:06
【问题描述】:
我们有一个使用加密的 Expo React Native 项目。我们当前的加密基于 SubtleCrypto / Web API [window.subtle.crypto],使用 AES-GCM 128,现在我们需要使用一个在所有平台 [Web、iOS 和 Android] 上普遍可用的库,来自我之前的问题,我们找到了支持 GCM 模式的 SJCL,我们可以完全替换所有基于 Web 的代码,但挑战是我们需要确保所有当前加密的数据也在这个新库中解密,我们必须做到所以:
window.crypto.subtle.encrypt [AES-GCM 128] => (a) ---> SJCL.mode.gcm.decrypt(a)
一旦我们能够成功地做到这一点,我们就可以完全替换库并获得通用平台支持以及向后兼容性。
这意味着我们不能改变处理加密的方式,因为这是要求,我们完全按照下面的代码对其进行加密。
我收到了 Neneil94 的 a very good lead here,但我仍然面临编码/格式方面的问题;这是当前代码:
function arrayBufferToString(buffer){
var str = "";
for (var iii = 0; iii < buffer.byteLength; iii++){
str += String.fromCharCode(buffer[iii]);
}
return str;
}
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 text = "This is an encrypted message";
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)
{
console.log({kkey}); //{kkey: 'eKM_Cen2Z-jhedM284cltA'}
let bkey = sjcl.codec.utf8String.toBits(kkey);
console.log({bkey}); //{bkey: Array(6)}
let cipher = new sjcl.cipher.aes(bkey);
//let bdata = sjcl.codec.base64.toBits(encryptedObject); //gives error of a.replace
let bdata = arrayBufferToString(encryptedObject);
let ivvv = new Uint8Array(12);
let ivv = Buffer.from(ivvv).toString('base64');
let ive = sjcl.codec.base64.toBits(ivv);
// decrypt
let decbits = sjcl.mode.gcm.decrypt(cipher, bdata, ive);
// convert into utf8string
decryptedData = sjcl.codec.utf8String.fromBits(decbits);
});
});
}
我得到的错误是:
损坏:gcm:标签不匹配
我不确定上面链接的 Neneil 代码中的 aesKey 究竟是什么,它是 CryptoKey 对象还是从 JsonWebKey 生成的 22 个字符?对于“encryptedObject”,我如何将其转换为 BitArray。对于 IV,我只是提供 Encrypt 正在做的事情,但我也不确定..
不过,任何见解都会很有帮助,感谢您的宝贵时间!
【问题讨论】:
标签: javascript react-native cryptography expo aes