Golang十六进制编码

Jam*_*meo 0 hex go

我正在尝试重新创建一个我用python编写的PKCS#5 Padding算法.

我正在努力重建的主线就是这个

return data + (chr(pad_count) * pad_count).encode('utf-8')
Run Code Online (Sandbox Code Playgroud)

它基本上重复pad_count(一个1到16之间的整数),作为char,在1到16次之间.我在Go中获得类似的结果时遇到了麻烦.

例如,pad_count为11将返回字符串

\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b
Run Code Online (Sandbox Code Playgroud)

我得到的关闭是这样的:

b := make([]byte, 2)
binary.LittleEndian.PutUint16(b, uint16(padCount))
fmt.Println("Pad: ", padCount, "Hex: ", hex.EncodeToString(b))
Run Code Online (Sandbox Code Playgroud)

将返回:

Pad: 11 Hex: 0b00
Run Code Online (Sandbox Code Playgroud)

这非常接近,显然我可以使用子串,并添加\ x自己,但是有更好的方法来解决这个问题吗?此外,如果我子串,我觉得不能保证所有组合都适用.

nem*_*emo 7

正如James Henstridge已经提到过你想要的格式(\x0b...)不是必需的,而是python表示不可打印的字符.你自己看:

>>> chr(3)
'\x03'
Run Code Online (Sandbox Code Playgroud)

您需要做的是在RFC2898中定义:

[...]填充字符串PS8-(||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.
Run Code Online (Sandbox Code Playgroud)

这意味着你不需要uint16但是uint8(因为八位字节只有8位),你也不需要像python那样格式化你的字节.所以你唯一要做的就是使用bytes.Repeat:

bytes.Repeat(paddingChar, paddingCount)
Run Code Online (Sandbox Code Playgroud)