2

我正在尝试加密一些数据,但它几乎从来都不是正确的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                                         
}                                                    
4

2 回答 2

1

查看Package cipher似乎您可能必须自己添加填充,请参阅PKCS#7 padding

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

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

于 2016-09-01T20:58:57.433 回答
0

这是我的解决方案

// 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
}
于 2016-09-01T21:23:30.593 回答