我正在尝试重新创建一个我用python编写的PKCS#5 Padding算法。
我正在努力重建的主线是这个
return data + (chr(pad_count) * pad_count).encode('utf-8')
基本上重复pad_count(1到16之间的整数),作为char,在1到16次之间。我在Go中获得类似的结果时遇到了麻烦。
例如,pad_count为11将返回字符串
\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b
我的关系是:
b := make([]byte, 2)
binary.LittleEndian.PutUint16(b, uint16(padCount))
fmt.Println("Pad: ", padCount, "Hex: ", hex.EncodeToString(b))
将返回:
Pad: 11 Hex: 0b00
这非常接近,显然我可以使用子字符串,并添加\ x自己,但有更好的方法来解决这个问题吗?此外,如果我子串,我觉得不能保证所有组合都适用。
答案 0 :(得分:7)
正如James Henstridge已经提到的那样,您想要的格式(\x0b...
)不是必需的,而是python表示不可打印的字符。亲眼看看:
>>> chr(3)
'\x03'
您需要做的事情在RFC2898中定义:
[...]填充字符串
PS
由8-(||M|| mod 8)
个八位字节组成 每个都有值8-(||M|| mod 8)
。填充字符串PS
将 满足以下陈述之一:PS = 01, if ||M|| mod 8 = 7 ; PS = 02 02, if ||M|| mod 8 = 6 ; ... PS = 08 08 08 08 08 08 08 08, if ||M|| mod 8 = 0.
这意味着你不需要uint16但是uint8(因为八位字节只有8位),你也不需要像python那样格式化你的字节。所以你唯一要做的就是使用bytes.Repeat
:
bytes.Repeat(paddingChar, paddingCount)
答案 1 :(得分:0)
func pad(input []byte, pad_count int) []byte {
out := make([]byte, len(input) + int(pad_count))
copy(out, input)
for i := 0; i < pad_count; i++ {
out[len(input) + i] = byte(pad_count)
}
return out
}