Files
monibuca/plugin/crypto/pkg/method/xor.go
2024-12-31 14:18:07 +08:00

101 lines
2.5 KiB
Go
Executable File

package method
import (
"crypto/subtle"
"encoding/base64"
"errors"
)
// SimpleXorCryptor 加密一次
type SimpleXorCryptor struct {
key []byte
}
func newSimpleXor(cfg Key) (ICryptor, error) {
var cryptor *SimpleXorCryptor
if cfg.Key == "" {
return nil, errors.New("xor cryptor config no key")
} else {
cryptor = &SimpleXorCryptor{key: []byte(cfg.Key)}
}
return cryptor, nil
}
// simpleXorEncryptDecrypt 对给定的字节数组进行 XOR 加密和解密
// key 是用于加密和解密的密钥
func simpleXorEncryptDecrypt(data []byte, key []byte) []byte {
dataLen := len(data)
result := make([]byte, dataLen)
keyLen := len(key)
for i := 0; i < dataLen; i += keyLen {
end := i + keyLen
if end > dataLen {
end = dataLen
}
subtle.XORBytes(result[i:end], data[i:end], key[:end-i])
}
return result
}
func (c *SimpleXorCryptor) Encrypt(origin []byte) ([]byte, error) {
return simpleXorEncryptDecrypt(origin, c.key), nil
}
func (c *SimpleXorCryptor) Decrypt(encrypted []byte) ([]byte, error) {
return simpleXorEncryptDecrypt(encrypted, c.key), nil
}
func (c *SimpleXorCryptor) GetKey() string {
return base64.RawStdEncoding.EncodeToString(c.key)
}
// 复杂的XOR加密器 加密两次
type ComplexXorCryptor struct {
key []byte
iv []byte
}
func newComplexXor(cfg Key) (ICryptor, error) {
var cryptor *ComplexXorCryptor
if cfg.Key == "" {
return nil, errors.New("xor cryptor config no key")
} else {
cryptor = &ComplexXorCryptor{key: []byte(cfg.Key), iv: []byte(cfg.Iv)}
}
return cryptor, nil
}
// complexXorEncryptDecrypt 对给定的字节数组进行 XOR 加密和解密
func complexXorEncryptDecrypt(arrayBuffer, key, iv []byte) []byte {
// Assuming the key and iv have been provided and are not nil
if key == nil || iv == nil {
panic("key and iv must not be nil")
}
result := make([]byte, len(arrayBuffer))
keyLen := len(key)
ivLen := len(iv)
for i := 0; i < len(result); i++ {
result[i] = arrayBuffer[i] ^ (key[i%keyLen] ^ iv[i%ivLen])
}
return result
}
func (c *ComplexXorCryptor) Encrypt(origin []byte) ([]byte, error) {
return complexXorEncryptDecrypt(origin, c.key, c.iv), nil
}
func (c *ComplexXorCryptor) Decrypt(encrypted []byte) ([]byte, error) {
return complexXorEncryptDecrypt(encrypted, c.key, c.iv), nil
}
func (c *ComplexXorCryptor) GetKey() string {
return base64.RawStdEncoding.EncodeToString(c.key) + "." + base64.RawStdEncoding.EncodeToString(c.iv)
}
func init() {
RegisterCryptor("xor_s", newSimpleXor)
RegisterCryptor("xor_c", newComplexXor)
}