解决方案是手动实施CFB8,因为内置实施默认为CFB128。
由kostya创建并由IlmariKaronen修复的实现。
如果有人正在寻找分段大小= 8的Go实现CFB模式,则可以使用以下方法:
import "crypto/cipher"// CFB stream with 8 bit segment size// See http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdftype cfb8 struct { b cipher.Block blockSize int in []byte out []byte decrypt bool}func (x *cfb8) XORKeyStream(dst, src []byte) { for i := range src { x.b.Encrypt(x.out, x.in) copy(x.in[:x.blockSize-1], x.in[1:]) if x.decrypt { x.in[x.blockSize-1] = src[i] } dst[i] = src[i] ^ x.out[0] if !x.decrypt { x.in[x.blockSize-1] = dst[i] } }}// NewCFB8Encrypter returns a Stream which encrypts with cipher feedback mode// (segment size = 8), using the given Block. The iv must be the same length as// the Block's block size.func newCFB8Encrypter(block cipher.Block, iv []byte) cipher.Stream { return newCFB8(block, iv, false)}// NewCFB8Decrypter returns a Stream which decrypts with cipher feedback mode// (segment size = 8), using the given Block. The iv must be the same length as// the Block's block size.func newCFB8Decrypter(block cipher.Block, iv []byte) cipher.Stream { return newCFB8(block, iv, true)}func newCFB8(block cipher.Block, iv []byte, decrypt bool) cipher.Stream { blockSize := block.BlockSize() if len(iv) != blockSize { // stack trace will indicate whether it was de or encryption panic("cipher.newCFB: IV length must equal block size") } x := &cfb8{ b: block, blockSize: blockSize, out: make([]byte, blockSize), in: make([]byte, blockSize), decrypt: decrypt, } copy(x.in, iv) return x}


