123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- package util
- import (
- "bytes"
- "crypto/aes"
- "crypto/cipher"
- "crypto/md5"
- "encoding/base64"
- "encoding/hex"
- "encoding/json"
- "errors"
- "fmt"
- "icloudapp.cn/tools/entity"
- "math/rand"
- "os"
- "strings"
- "time"
- )
- func Getwd() string {
- path, err := os.Getwd()
- if err != nil {
- return ""
- }
- return path
- }
- func RandNum(n int32) int32 {
- r := rand.New(rand.NewSource(time.Now().UnixNano()))
- return r.Int31n(n)
- }
- func RandomStr(length int) string {
- letterBytes := "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
- b := make([]byte, length)
- letterLen := int32(len(letterBytes))
- for i := range b {
- b[i] = letterBytes[RandNum(letterLen)]
- }
- return string(b)
- }
- func RandomNumberStr(length int) string {
- numberBytes := "0123456789"
- letterLen := int32(len(numberBytes))
- b := make([]byte, length)
- for i := range b {
- b[i] = numberBytes[RandNum(letterLen)]
- }
- return string(b)
- }
- func Sign(str string, salt string) string {
- if len(salt) == 0 {
- salt = "K4de3"
- }
- var bt bytes.Buffer
- bt.WriteString(str)
- bt.WriteString("-")
- bt.WriteString(salt)
- crypt := md5.Sum(bt.Bytes())
- return fmt.Sprintf("%x", crypt)
- }
- func EncryptWidthTime(str string, expired int64, key string) (string, error) {
- currentTimestamp := time.Now().Unix()
- arr := entity.EncryptData{Str: str, Expired: currentTimestamp + expired}
- data, err := json.Marshal(arr)
- if err != nil {
- return "", err
- }
- return Encrypt(string(data), key), nil
- }
- func DecryptWithTime(str string, key string) (string, error) {
- decode := Decrypt(str, key)
- var data entity.EncryptData
- if err := json.Unmarshal([]byte(decode), &data); err != nil {
- return "", err
- }
- currentTimestamp := time.Now().Unix()
- if currentTimestamp >= data.Expired {
- return "", errors.New("加密串已过期")
- }
- return data.Str, nil
- }
- func Encrypt(str string, key string) string {
- keyByte := []byte(key)
- keyByte = pkcs5Padding(keyByte, 16)
- block, err := aes.NewCipher(keyByte)
- if err != nil {
- fmt.Println(err.Error())
- }
- blockSize := block.BlockSize()
- origData := pkcs5Padding([]byte(str), blockSize)
- blockMode := cipher.NewCBCEncrypter(block, keyByte[:blockSize])
- encrypted := make([]byte, len(origData))
- blockMode.CryptBlocks(encrypted, origData)
- return hex.EncodeToString(encrypted)
- }
- func Decrypt(str string, key string) string {
- hexDecode, _ := hex.DecodeString(str)
- str = string(hexDecode)
- keyByte := []byte(key)
- keyByte = pkcs5Padding(keyByte, 16)
- block, err := aes.NewCipher(keyByte)
- if err != nil {
- fmt.Println(err.Error())
- }
- blockSize := block.BlockSize()
- blockMode := cipher.NewCBCDecrypter(block, keyByte[:blockSize])
- decrypted := make([]byte, len(hexDecode))
- blockMode.CryptBlocks(decrypted, hexDecode)
- fmt.Println("decrypted", string(decrypted))
- decrypted = pkcs5UnPadding(decrypted)
- return string(decrypted)
- }
- func pkcs5Padding(ciphertext []byte, blockSize int) []byte {
- padding := blockSize - len(ciphertext)%blockSize
- padText := bytes.Repeat([]byte{byte(padding)}, padding)
- return append(ciphertext, padText...)
- }
- func pkcs5UnPadding(origData []byte) []byte {
- length := len(origData)
- unPadding := int(origData[length-1])
- return origData[:(length - unPadding)]
- }
- func GenerateKey(key []byte) (genKey []byte) {
- genKey = make([]byte, 16)
- copy(genKey, key)
- for i := 16; i < len(key); {
- for j := 0; j < 16 && i < len(key); j, i = j+1, i+1 {
- genKey[j] ^= key[i]
- }
- }
- return genKey
- }
- func NewError(args ...string) error {
- var buffer strings.Builder
- for i, v := range args {
- if i > 0 {
- buffer.WriteString(" : \t")
- }
- buffer.WriteString(v)
- }
- return errors.New(buffer.String())
- }
- func TransparentPNG() []byte {
- str := "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAANQTFRFAAAAp3o92gAAAAF0Uk5TAEDm2GYAAAAKSURBVHicY2AAAAACAAFIr6RxAAAAAElFTkSuQmCC"
- trans, _ := base64.StdEncoding.DecodeString(str)
- return trans
- }
- func CutString(str string, start, end int) string {
- if end <= 0 {
- return ""
- }
- strRune := []rune(str)
- strLen := len(strRune)
- if strLen <= start {
- return ""
- }
- if strLen < end {
- end = strLen
- }
- return string(strRune[start:end])
- }
|