Files
go-mc/net/CFB8/cfb8.go
JunDao 0d436609ce init
2019-05-01 15:22:42 +08:00

55 lines
949 B
Go

//From https://play.golang.org/p/LTbId4b6M2
package CFB8
import "crypto/cipher"
type CFB8 struct {
c cipher.Block
blockSize int
iv, tmp []byte
de bool
}
func NewCFB8Decrypt(c cipher.Block, iv []byte) *CFB8 {
cp := make([]byte, len(iv))
copy(cp, iv)
return &CFB8{
c: c,
blockSize: c.BlockSize(),
iv: cp,
tmp: make([]byte, c.BlockSize()),
de: true,
}
}
func NewCFB8Encrypt(c cipher.Block, iv []byte) *CFB8 {
cp := make([]byte, len(iv))
copy(cp, iv)
return &CFB8{
c: c,
blockSize: c.BlockSize(),
iv: cp,
tmp: make([]byte, c.BlockSize()),
de: false,
}
}
func (cf *CFB8) XORKeyStream(dst, src []byte) {
for i := 0; i < len(src); i++ {
val := src[i]
copy(cf.tmp, cf.iv)
cf.c.Encrypt(cf.iv, cf.iv)
val = val ^ cf.iv[0]
copy(cf.iv, cf.tmp[1:])
if cf.de {
cf.iv[15] = src[i]
} else {
cf.iv[15] = val
}
dst[i] = val
}
}