利用Golang实现异或加密文件

2020-07-05 08:10:30


加密

通过读取文件的每个字节数据与密钥字符串的每个字节进行循环异或计算,最后再拼接写入文件实现加密。

解密

对已加密的文件使用相同密钥重复加密过程即为解密过程

实现代码:

//XOREncrypt 定义异或加密结构体
type XOREncrypt struct {
	//加密密钥
	key string
}

//SetKey 设置加密字符串
func (x *XOREncrypt) SetKey(key string) {
	x.key = key
}

//GetKey 获取加密字符串
func (x *XOREncrypt) GetKey() string {
	return x.key
}

//New 通过加密密钥实例化一个对象
func New(key string) *XOREncrypt {
	return &XOREncrypt{
		key: key,
	}
}

//Encrypt 具体加密逻辑
func (x *XOREncrypt) Encrypt(rd io.Reader, wr io.Writer, buf []byte) error {
	//密钥字符串转为字节切片
	secureKey := []byte(x.key)

	maxLen := len(secureKey)
	//当前密钥计算到第几个字节的索引 主要用于密钥的循环计算
	curIndex := 0
	var block []byte
	if buf == nil {
		block = make([]byte, 4096)
	} else {
		block = buf
	}
	var tmp byte
	for {
		n, err := rd.Read(block)
		if err != nil && err != io.EOF {
			return err
		}
		if 0 == n || err == io.EOF {
			break
		}
		for i := 0; i < n; i++ {
			tmp = block[i]
			//对读取的内容进行异或计算
			block[i] = tmp ^ secureKey[curIndex]
			curIndex++
			//对密钥索引重新记录
			curIndex = curIndex % maxLen
		}
		//写入到文件
		wr.Write(block[:n])
	}
	return nil
}

Github代码:https://github.com/LWLLR/xorencrypt