我正在尝试使用自定义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堆栈中的人们的建议,当然不是我的链接,请参阅此处的链接,并注意说明。这些东西很难通过反复试验来解决。