Files
Sillyv2/core/node_ crypto.go
T
cdle 1cf4c35e0f x
2023-07-01 22:47:35 +08:00

132 lines
3.1 KiB
Go

package core
import (
"crypto/hmac"
"crypto/md5"
"crypto/sha1"
"crypto/sha256"
"crypto/sha512"
"encoding/base64"
"fmt"
"hash"
)
type Crypto struct{}
type Hmac struct {
Algorithm string
hash hash.Hash
}
func (h *Hmac) Digest(class string) string {
value := h.hash.Sum(nil)
switch class {
case "hex":
return fmt.Sprintf("%x", value)
case "base64":
return base64.StdEncoding.EncodeToString(value)
}
return ""
}
func (h *Hmac) Update(data string) {
h.hash.Write([]byte(data))
}
func (c *Crypto) CreateHmac(algorithm, key string) *Hmac {
var hashFunc func() hash.Hash
switch algorithm {
case "md5":
hashFunc = md5.New
case "sha1":
hashFunc = sha1.New
case "sha256":
hashFunc = sha256.New
case "sha512":
hashFunc = sha512.New
default:
return nil
}
return &Hmac{
hash: hmac.New(hashFunc, []byte(key)),
Algorithm: algorithm,
}
}
// func (c *Crypto) CreateCipheriv(algorithm, key, data string) *Hmac {
// switch algorithm {
// case "aes-256-cbc":
// block, err := aes.NewCipher([]byte(key))
// if err != nil {
// return "", err
// }
// ciphertext := make([]byte, aes.BlockSize+len(data))
// iv := ciphertext[:aes.BlockSize]
// if _, err := io.ReadFull(rand.Reader, iv); err != nil {
// return "", err
// }
// stream := cipher.NewCFBEncrypter(block, iv)
// stream.XORKeyStream(ciphertext[aes.BlockSize:], []byte(data))
// return base64.StdEncoding.EncodeToString(ciphertext), nil
// }
// }
// type Cipher struct{}
// func (c *Cipher) AesEncrypt(key, data string) (string, error) {
// block, err := aes.NewCipher([]byte(key))
// if err != nil {
// return "", err
// }
// ciphertext := make([]byte, aes.BlockSize+len(data))
// iv := ciphertext[:aes.BlockSize]
// if _, err := io.ReadFull(rand.Reader, iv); err != nil {
// return "", err
// }
// stream := cipher.NewCFBEncrypter(block, iv)
// stream.XORKeyStream(ciphertext[aes.BlockSize:], []byte(data))
// return base64.StdEncoding.EncodeToString(ciphertext), nil
// }
// func (c *Cipher) AesDecrypt(key, ciphertext string) (string, error) {
// block, err := aes.NewCipher([]byte(key))
// if err != nil {
// return "", err
// }
// data, err := base64.StdEncoding.DecodeString(ciphertext)
// if err != nil {
// return "", err
// }
// if len(data) < aes.BlockSize {
// return "", fmt.Errorf("ciphertext too short")
// }
// iv := data[:aes.BlockSize]
// data = data[aes.BlockSize:]
// stream := cipher.NewCFBDecrypter(block, iv)
// stream.XORKeyStream(data, data)
// return string(data), nil
// }
// func (c *Cipher) Rc4Encrypt(key, data string) (string, error) {
// cipher, err := rc4.NewCipher([]byte(key))
// if err != nil {
// return "", err
// }
// ciphertext := make([]byte, len(data))
// cipher.XORKeyStream(ciphertext, []byte(data))
// return base64.StdEncoding.EncodeToString(ciphertext), nil
// }
// func (c *Cipher) Rc4Decrypt(key, ciphertext string) (string, error) {
// cipher, err := rc4.NewCipher([]byte(key))
// if err != nil {
// return "", err
// }
// data, err := base64.StdEncoding.DecodeString(ciphertext)
// if err != nil {
// return "", err
// }
// cipher.XORKeyStream(data, data)
// return string(data), nil
// }