1 回答
TA贡献1942条经验 获得超3个赞
以下问题导致不同的结果:
Blowfish具有 8 字节的块大小和4 到 56 字节之间的可变密钥大小。在 PHP 中,Blowfish 存在一个错误,它将较短的键填充为 16 个字节,值为 0。从 7.1.8 版开始,有一个标志可以防止这种情况:OPENSSL_DONT_ZERO_PAD_KEY. 如果额外设置了此标志 ( OPENSSL_RAW_DATA | OPENSSL_DONT_ZERO_PAD_KEY),则以下输出结果(在所需环境中):
253 145 220 198 224 78 40 124
61 82 97 183 42 220 119 173 26 156 153 20 152 139 105 237
这里有一个可以设置标志的在线PHP环境。
Go 中定义的填充是零填充,而在 PHP 代码中 PKCS7 填充由 openssl 使用(默认情况下)。对于 PKCS7,需要进行以下更改(不加注释,使用相同的名称):
func pad(pt []byte) []byte {
modulus := len(pt) % blowfish.BlockSize
padlen := blowfish.BlockSize - modulus
for i := 0; i < padlen; i++ {
pt = append(pt, byte(padlen))
}
return pt
}
通过此更改,Go - 代码给出了相同的结果:
[253 145 220 198 224 78 40 124]
[61 82 97 183 42 220 119 173 26 156 153 20 152 139 105 237 0]
末尾的 0 是由于密文缓冲区过大造成的。在 Go 代码中,输出缓冲区的长度是用明文长度加上块大小(Blowfish 为 8 字节)计算的,这确保有足够的空间用于填充,因为最大填充是一个块。对于较短的填充,缓冲区太大,例如在当前情况下,明文的长度为 9 个字节,这导致缓冲区为 17 个字节。密文的长度为 16 个字节,最后是 0。如果需要,可以将确切需要的缓冲区大小确定为明文长度加上填充长度(后者的确定类似于函数padlen中的pad内容)。
- 1 回答
- 0 关注
- 214 浏览
添加回答
举报