gpt4 book ai didi

javascript - window.crypto.subtle.encrypt 用于 AES-CBC 的填充是什么

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:40:12 26 4
gpt4 key购买 nike

我目前在 Javascript 中使用 window.crypto.subtle.encrypt 中的网络加密 API。我的问题是,这默认使用什么填充?我已经搜索了一段时间,但找不到任何答案。

最佳答案

Subtle.encrypt 似乎正在实现 WebCrypto。尽管 encrypt() 的文档或例如 CBC 模式Mozilla 不显示填充。引用的 NIST 规范也没有。

幸运的是,引用的 WebCrypto API 确实指示填充 where the CBC mode is specified :

When operating in CBC mode, messages that are not exact multiples of the AES block size (16 bytes) can be padded under a variety of padding schemes. In the Web Crypto API, the only padding mode that is supported is that of PKCS#7, as described by Section 10.3, step 2, of [RFC2315].

如果点击链接,您会发现 PKCS#7 是加密消息语法或 CMS 的规范。但是,只指定了一种填充模式。这种模式没有比 PKCS#7 填充更具体的名称(ECB 和 CBC 的填充算法非常简单,因此通常没有特定名称)。


简单来说,对于AES等 block 大小为128位的密码,它会增加1到16个字节。字节值与填充的字节数相同,因此您可以通过删除最后一个字节指示的字节数来取消填充。因此,填充总是被应用,即使明文的最后部分是完整的(在这种情况下应用了 16 个字节的填充)。

所以你会有

10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 // empty, zero byte message
PT 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F // PT means plaintext byte
PT PT 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E // byte values in hexadecimals
...

PT PT PT PT PT PT PT PT PT PT PT PT PT PT PT 01 // 15-byte message
// 16-byte message, one full block of padding added
PT PT PT PT PT PT PT PT PT PT PT PT PT PT PT PT 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
...
...

请注意,padding 不应该用于验证明文的正确性,padding oracle 攻击(改用 GCM 等经过身份验证的模式!),padding 值可能不会全部被验证(最后一个字节包含足够的信息以unpad),最后你应该使用一个实现来验证填充字节是否在指定的范围内。

另请注意,AES 的 PKCS#7 填充有时会错误地(或懒惰地)referred to as PKCS#5 padding ,例如在 Java JCA 中。

关于javascript - window.crypto.subtle.encrypt 用于 AES-CBC 的填充是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54746103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com