Golang加密密文在开始时具有AS的填充



我正在尝试使用自定义iv进行加密,但它会导致phertext带有padding of As,例如

AAAAAAAAAAAAAAAAAAAAACbglBtdgH3ajX1jgkOaVAsFYyDxRRI=

我遵循https://gist.github.com/manishtpatel/8222606的示例实现,并进行了一些更改。跑步和测试https://play.golang.org/p/2rs6zbwbnf

我的代码在
https://play.golang.org/p/qlx_cu0vpq

这是参考的加密函数

func Encrypt(key []byte, text string) string {
    // key := []byte(keyText)
    plaintext := []byte(text)
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }
    // The IV needs to be unique, but not secure. Therefore it's common to
    // include it at the beginning of the ciphertext.
    ciphertext := make([]byte, aes.BlockSize+len(plaintext))
    iv := commonIV
    stream := cipher.NewCFBEncrypter(block, iv)
    stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)
    // convert to base64
    return base64.URLEncoding.EncodeToString(ciphertext)
}

请参阅Golang AES加密的此示例,如果您不需要使用AES CFB,则可以专门使用AES CFB,只需交换加密功能并改用GCM即可。 tl; dr- copy&从此链接而不是堆栈溢出粘贴加密代码。

https://github.com/gtank/cryptopasta/blob/master/encrypt.go

如果您只是在学习,请观看关联的谈话并阅读链接的代码,如果您实际上是对此进行了加密,请使用链接的代码。

  • Go Crypto上的视频
  • 用审查的加密货币示例回购

ps我不是专家,但是您的IV每次都应该是随机的吗?要修复上面的代码,您需要使用以下内容复制IV/Nonce。

复制(ciphertext [:aes.blocksize],iv [:])

这个想法是唯一的随机nonce是在Ciphertext的开始,并且用于解密(因此不应该存在),这停止了它在同一clearText上产生相同的输出。请注意,固定时的代码如何每次产生相同的输出 - 这很不好。

但是,请勿使用Crypto堆栈中的人们的建议,当然不是我的链接,请参阅此处的链接,并注意说明。这些东西很难通过反复试验来解决。

最新更新