Encryption 使用sjcl.js描述aes gcm的正确方法是什么?

Encryption 使用sjcl.js描述aes gcm的正确方法是什么?,encryption,cryptography,aes,aes-gcm,sjcl,Encryption,Cryptography,Aes,Aes Gcm,Sjcl,我正在尝试使用aes算法(gcm模式)中的sjcl.js加密库解密密码内容。这是我的代码: //加密数据和密钥 let key=“8mUzwnewfaBFKiGW/rO5Xw=” 让密文="2.这个词的意思是一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一

我正在尝试使用aes算法(gcm模式)中的sjcl.js加密库解密密码内容。这是我的代码:

//加密数据和密钥
let key=“8mUzwnewfaBFKiGW/rO5Xw=”
让密文="2.这个词的意思是一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个单词,一个/+s4ittsXiDlKV66xHzTlKOcOBsVUEofzOQpN/ZUTKTG9KG1ZBSHDHP6BTM/c/5PEHHHJMX4GNZJFXVX/pVxzFG/EQYSVGJ2F8DXKGFDJN7WD/QYJDAAJYSW5Dul7Woo7YXSSAWOBXNCEDJI+SWCPRDMTGMTGQEPYEOQ03/7HYQBME6M4IFBW2BSJGSHTNVVOIP8WEGKY5JI+P7JUE20VPOMJ5VQEEGV+NRQ99O66MBK9/s1+/+GILL7P80SQUA=”
//标签、数据、iv长度(位)
常量GCM_标签长度=16*8
常量GCM_和长度=16*8
常量GCM\u当前长度=12*8
让bkey=sjcl.codec.base64.toBits(key)
让bdata=sjcl.codec.base64.toBits(密文)
let cipher=new sjcl.cipher.aes(bkey)
设aad=sjcl.bitArray.bitSlice(bdata,0,GCM_aad_长度)
设iv=sjcl.bitArray.bitSlice(aad,GCM当前长度*-1)
让tag=sjcl.bitArray.bitSlice(bdata,GCM_tag_LENGTH*-1)
让data=sjcl.bitArray.bitSlice(bdata,GCM_AAD_长度,GCM_标记长度*-1)
让decryptedContent=“”
让decbits=sjcl.mode.gcm.decrypt(密码、数据、iv、aad、标签)
decryptedContent=sjcl.codec.utf8String.fromBits(decbits)
console.log('decryptedContent',decryptedContent)//空
key
cipherText
已经用python(aes gcm,128位密钥)进行了加密。有人知道如何解密吗?有没有其他替代sjcl.js的文档?谢谢

注意:我已经用NodeJS Crypto lib对其进行了解密,但Crypto lib与浏览器不兼容。浏览它会产生一个沉重的脚本,因此我正在寻找与broswer兼容的轻量级javascript lib。这是我与NodeJS的代码:

函数解密(密钥、内容){
返回新承诺((解决、拒绝)=>{
让keyBuffer=新缓冲区(键'base64')
常量AES_KEY_SIZE=keyBuffer.length*8
常量GCM_标签长度=16
常数GCM_和长度=16
常量GCM\u当前长度=12
让contentBuffer=新缓冲区(内容“base64”)
设aad=contentBuffer.slice(0,GCM\u aad\u长度)
设iv=平均切片(GCM当前长度*-1)
let tag=contentBuffer.slice(GCM_tag_LENGTH*-1)
设cipherText=contentBuffer.slice(GCM_AAD_长度,GCM_标记长度*-1)
让decryptedContent=“”
试一试{
let decipher=crypto.createDecipheriv(`aes-${aes\u KEY\u SIZE}-gcm`,keyBuffer,iv)
破译程序setAAD(aad)
解密.setAuthTag(标记)
decryptedContent=decipher.update(密文、'binary'、'utf8')+decipher.final('utf8'))
返回解析(decryptedContent)
}捕获(e){
拒绝(如消息| | e)
}
})}

最后,我找到了原因,你说得对。尝试从解密内容中提取标签,但我已经提取了标签,这就是问题所在。替换了行:

let data=sjcl.bitArray.bitSlice(bdata,GCM\u AAD\u LENGTH,GCM\u TAG\u LENGTH*-1)
这一行:

let data=sjcl.bitArray.bitSlice(bdata,GCM\u AAD\u长度)
并解决了问题。这是最终(工作)版本:

let key=“[base64 key]”
let cipherText=“[base64加密数据]”
常量GCM_标签长度=16*8
常量GCM_和长度=16*8
常量GCM\u当前长度=12*8
让bkey=sjcl.codec.base64.toBits(key)
让bdata=sjcl.codec.base64.toBits(密文)
let cipher=new sjcl.cipher.aes(bkey)
设aad=sjcl.bitArray.bitSlice(bdata,0,GCM_aad_长度)
设iv=sjcl.bitArray.bitSlice(aad,GCM当前长度*-1)
让tag=sjcl.bitArray.bitSlice(bdata,GCM_tag_LENGTH*-1)
让数据=sjcl.bitArray.bitSlice(bdata、GCM_和长度)
让decryptedContent=“”
让decbits=sjcl.mode.gcm.decrypt(密码、数据、iv、aad、gcm_标记长度)
decryptedContent=sjcl.codec.utf8String.fromBits(decbits)
console.log('decryptedContent',decryptedContent)

很好?它运行了吗?GCM数据是如何加密的?我们不知道标签大小等是否正确,我们没有得到任何错误描述。请注意,通常IV不是AAD数据的一部分,因为它已经是身份验证标签计算的一部分。嗨,Maarten,IV,AAD,tag等还可以。我已经为add添加了工作节点JS版本传统信息。您是否检查了试图运行的代码中的iv、aad、tag等值?调试crypto通常会了解函数的二进制输入参数。如果这些参数正常,那么结果也应该正常。