我当前正在使用Java window.crypto.subtle.encrypt
中的网络加密API。我的问题是,默认情况下会使用什么填充?我已经搜索了一段时间,但找不到任何答案。
答案 0 :(得分:4)
Subtle.encrypt
似乎正在实现WebCrypto。尽管encrypt()
的文档或CBC模式例如Mozilla不显示填充。引用的NIST规范也没有。
幸运的是,引用的WebCrypto API 确实指示填充where the CBC mode is specified:
在CBC模式下操作时,可以使用多种填充方案填充不是AES块大小(16字节)精确倍数的消息。在Web Crypto API中,唯一受支持的填充模式是PKCS#7的填充模式,如[RFC2315]的第10.3节第2步所述。
如果您单击链接,则会发现PKCS#7是加密消息语法或CMS的规范。但是,仅指定了一种填充模式。此模式没有比PKCS#7填充更具体的名称(用于ECB和CBC的填充算法非常简单,因此通常没有特定名称)。
简单地说,它为AES之类的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
...
...
请注意,不应使用填充来验证明文的正确性,即使用填充oracle攻击(改为使用GCM之类的经过身份验证的模式!),可能无法完全验证填充值(最后一个字节包含的信息足以取消填充),最后您应该使用一种可验证填充字节是否在指定范围内的实现。
还要注意,例如在Java JCA中,AES的PKCS#7填充有时会错误地(或懒惰地)referred to as PKCS#5 padding。