在golang中添加填充到字节切片的正确方法?

时间:2016-09-01 20:43:50

标签: encryption go block-cipher

我试图加密一些数据,但它几乎没有正确的cipher.BlockSize

是否有"内置"添加填充的方法或我应该使用函数手动添加它?

这是我现在的解决方案:

// encrypt() encrypts the message, but sometimes the 
// message isn't the proper length, so we add padding.
func encrypt(msg []byte, key []byte) []byte {        
  cipher, err := aes.NewCipher(key)                  
  if err != nil {                                    
    log.Fatal(err)                                   
  }                                                  

  if len(msg) < cipher.BlockSize() {                 
    var endLength = cipher.BlockSize() - len(msg)    
    ending := make([]byte, endLength, endLength)     
    msg = append(msg[:], ending[:]...)               
    cipher.Encrypt(msg, msg)                         
  } else {                                           
    var endLength = len(msg) % cipher.BlockSize()    
    ending := make([]byte, endLength, endLength)     
    msg = append(msg[:], ending[:]...)               
    cipher.Encrypt(msg, msg)                         
  }                                                  
  return msg                                         
}                                                    

2 个答案:

答案 0 :(得分:2)

查看Package cipher,您可能需要自己添加填充,请参阅PKCS#7 padding

基本上添加所需的填充字节,每个字节的值是添加的填充字节数。

请注意,您需要一致地添加填充,这意味着如果要加密的数据是块大小的精确倍数,则必须添加整个填充块,因为如果填充具有填充,则无法从数据中获知是否添加,尝试超越智能是一个常见的错误。考虑最后一个字节是否为0x00,是填充还是数据?

答案 1 :(得分:1)

这是我的解决方案

// padOrTrim returns (size) bytes from input (bb)
// Short bb gets zeros prefixed, Long bb gets left/MSB bits trimmed
func padOrTrim(bb []byte, size int) []byte {
    l := len(bb)
    if l == size {
        return bb
    }
    if l > size {
        return bb[l-size:]
    }
    tmp := make([]byte, size)
    copy(tmp[size-l:], bb)
    return tmp
}