这基于NewCFBEncrypter /
NewCFBDecrypter示例,并且似乎可以满足您的要求:
编辑:基于Kluyg关于IV创建的评论,我修改了示例代码,以使用 推荐的从密文创建IV的
方法,与链接示例从密文创建IV的方法相同。(在生产代码中,每次应单独生成IV。感谢RoundSparrowhilltx]指出了这一点。
我认为您遇到的问题是由于密钥长度无效,但是我不确定100%。
package mainimport ( "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/base64" "errors" "fmt" "io" "log")func main() { key := []byte("a very very very very secret key") // 32 bytes plaintext := []byte("some really really really long plaintext") fmt.Printf("%sn", plaintext) ciphertext, err := encrypt(key, plaintext) if err != nil { log.Fatal(err) } fmt.Printf("%0xn", ciphertext) result, err := decrypt(key, ciphertext) if err != nil { log.Fatal(err) } fmt.Printf("%sn", result)}// See alternate IV creation from ciphertext below//var iv = []byte{35, 46, 57, 24, 85, 35, 24, 74, 87, 35, 88, 98, 66, 32, 14, 05}func encrypt(key, text []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } b := base64.StdEncoding.EnpreToString(text) ciphertext := make([]byte, aes.BlockSize+len(b)) iv := ciphertext[:aes.BlockSize] if _, err := io.ReadFull(rand.Reader, iv); err != nil { return nil, err } cfb := cipher.NewCFBEncrypter(block, iv) cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(b)) return ciphertext, nil}func decrypt(key, text []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } if len(text) < aes.BlockSize { return nil, errors.New("ciphertext too short") } iv := text[:aes.BlockSize] text = text[aes.BlockSize:] cfb := cipher.NewCFBDecrypter(block, iv) cfb.XORKeyStream(text, text) data, err := base64.StdEncoding.DepreString(string(text)) if err != nil { return nil, err } return data, nil}产生:
一些真的真的很长的纯文本
54618bd6bb10612a7b590c53192df214501e01b685540b012581a0ed9ff3ddaa1f4177cc6186b501fb8cce0c2eb764daff475aab724d4d33e614d7d89cf556d8512fd920018c090f
一些真的真的很长的纯文本
操场
希望这有助于查明问题。



