Javascript 在WebCrypto中使用AES-CBC时,为什么错误的密钥会导致操作错误,而错误的密文或IV不会导致操作错误?

Javascript 在WebCrypto中使用AES-CBC时,为什么错误的密钥会导致操作错误,而错误的密文或IV不会导致操作错误?,javascript,cryptography,aes,webcrypto-api,Javascript,Cryptography,Aes,Webcrypto Api,据我所知,使用正确大小的错误密钥对AES-CBC进行解密只会产生一些垃圾。CBC没有任何类型的MAC,因此您实际上只能查看解密结果并自行决定这是否是您想要的明文 然而,当使用解密时,错误的密钥将导致操作错误,但错误的密文不会,错误的IV也不会。我本以为这三种情况都会有类似的行为 实现如何可能知道密钥是错误的,而不知道任何其他输入?除了尺寸以外,钥匙是否必须具有特定的结构?在这种情况下,密钥空间将小于密钥的广告位长度,不是吗 异步函数simpleCryptoTest{ //全零明文、密钥和IV 常

据我所知,使用正确大小的错误密钥对AES-CBC进行解密只会产生一些垃圾。CBC没有任何类型的MAC,因此您实际上只能查看解密结果并自行决定这是否是您想要的明文

然而,当使用解密时,错误的密钥将导致操作错误,但错误的密文不会,错误的IV也不会。我本以为这三种情况都会有类似的行为

实现如何可能知道密钥是错误的,而不知道任何其他输入?除了尺寸以外,钥匙是否必须具有特定的结构?在这种情况下,密钥空间将小于密钥的广告位长度,不是吗

异步函数simpleCryptoTest{ //全零明文、密钥和IV 常数iv=新阵列缓冲16 const key=new ArrayBuffer32 常量明文=新数组缓冲64 常量算法={name:'AES-CBC'}; const correctCryptoKey=wait crypto.minute.importKey'raw',key,algorithm,false,['encrypt','decrypt'] const ciphertext=await crypto.minute.encrypt{…算法,iv:iv},correctCryptoKey,明文 console.log密文,密文 const decryptedCorrect=crypto.division.decrypt{…算法,iv:iv},correctCryptoKey,密文 常量错误密文=新Uint8Arrayciphertext 错误的密文[0]=~密文[0]//翻转第一个字节就足够了 const decryptedErrorCiphertext=crypto.minute.decrypt{…算法,iv:iv},correctCryptoKey,ErrorCiphertext 常量错误IV=新Uint8Arrayiv 错误IV[0]=1//我们知道正确的IV都是零 const decryptedErrorIV=crypto.minute.decrypt{…算法,iv:ErrorIV},correctCryptoKey,密文 const errowkey=new Uint8Arraykey 错误键[0]=~键[0] const decryptedErrorKey=crypto.minute.importKey'raw',ErrorKey,algorithm,false,['decrypt']。ThenErrorCryptoKey=>{ 返回crypto.division.decrypt{…算法,iv:iv},错误的加密密钥,密文 } const results=wait Promise.allsetted[decryptedCorrect,DecryptedErrorCiphertext,DecryptedErrorIV,DecryptedErrorKey] console.Log已使用正确的密钥解密,结果[0] console.Log已用损坏的密文解密,结果[1] console.log已用损坏的IV解密,结果[2] console.log“用错误的密钥解密”,结果[3] } 简单加密 /* 用正确的密钥解密→ {状态:已完成,值:ArrayBuffer64} 用损坏的密文解密→ {状态:已完成,值:ArrayBuffer64} 用损坏的IV解密→ {状态:已完成,值:ArrayBuffer64} 用错误的密钥解密→ {状态:已拒绝,原因:DomeException}//e.name=='OperationError' */ 请注意,我知道CBC没有身份验证,我知道GCM存在。我需要CBC,因为我正在实现的是的一个变体,在并没有适当的加密审查的情况下,我肯定不打算在生产中推出。谢谢:-


另外,我在Firefox 77.0.1和Chromium 83.0.4103.97 Linux上测试了这一点。

没有MAC,但有填充。我对WebCrypto不是很熟悉,但很可能您在加密算法规范中使用了PKCS7填充-无论是显式的还是默认的。添加到纯文本末尾的填充字节的值为k。。。k、 其中k是所需的填充字节数,1