Different Results in Go and Pycrypto when using AES-CFB

前端 未结 5 1149
遇见更好的自我
遇见更好的自我 2021-01-02 05:33

I am adding a go application to an already existing python codebase. I\'ve been having trouble dealing with encryption between the languages. This is using go 1.2.1 and Pyth

5条回答
  •  清歌不尽
    2021-01-02 06:05

    If anyone is looking for Go implementation of CFB mode with segment size = 8 you can use this:

    import "crypto/cipher"
    
    // CFB stream with 8 bit segment size
    // See http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
    type 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
    }
    

提交回复
热议问题