encryption - 在 golang 中向 byte slice 添加填充的正确方法?

标签 encryption go block-cipher

我试图在 go 中加密一些数据,但它几乎不是正确的 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                                         
}                                                    

最佳答案

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

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

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

关于encryption - 在 golang 中向 byte slice 添加填充的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39280574/

相关文章:

javascript - 在离线播放器中保护 SCORM 内容

json - golang 结构仅从 json 中部分解码

loops - 是什么导致空的 Go for 循环锁定程序?

go - 如何在 Go 中解析 RSA 公钥?

android - Android中从一个应用程序向另一个应用程序发送数据时的加密

Java 加密 AES 函数

java - 在哪里可以找到 CTR 或 GCM 分组密码模式的 Java/Kotlin 实现?

objective-c - Objective-C 中的 AES128/CBC/PKCS7padding?

javascript - 前端或后端加密?

php - PHP 中的动态 Paypal 支付按钮?