132 lines
3.1 KiB
Go
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
|
|
// }
|