123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- package encrypt
- import (
- "crypto/aes"
- "crypto/cipher"
- "crypto/md5"
- "encoding/base64"
- "encoding/hex"
- "math/rand"
- "strings"
- "time"
- )
- var random *rand.Rand
- var interPwd = "24a1d6ff39d8"
- func init() {
- random = rand.New(rand.NewSource(time.Now().UnixNano()))
- }
- //func PKCS7UnPadding(origData []byte) []byte {
- // length := len(origData)
- // unpadding := int(origData[length-1])
- // return origData[:(length - unpadding)]
- //}
- //
- //func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
- // padding := blockSize - len(ciphertext)%blockSize
- // padtext := bytes.Repeat([]byte{byte(padding)}, padding)
- // return append(ciphertext, padtext...)
- //}
- func AesEncryptTS(origData, key []byte, iv []byte) ([]byte, error) {
- block, err := aes.NewCipher(key)
- if err != nil {
- return nil, err
- }
- blockSize := block.BlockSize()
- origData = PKCS7Padding(origData, blockSize)
- blockMode := cipher.NewCBCEncrypter(block, iv[:blockSize])
- crypted := make([]byte, len(origData))
- blockMode.CryptBlocks(crypted, origData)
- return crypted, nil
- }
- //aes cbc pkcs7
- func AesEncrypt(origData, key []byte) ([]byte, error) {
- block, err := aes.NewCipher(key)
- if err != nil {
- return nil, err
- }
- blockSize := block.BlockSize()
- origData = PKCS7Padding(origData, blockSize)
- blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
- crypted := make([]byte, len(origData))
- blockMode.CryptBlocks(crypted, origData)
- return crypted, nil
- }
- func AesECBPKCS5Encrypt(origData, key []byte) ([]byte, error) {
- block, err := aes.NewCipher(key)
- if err != nil {
- return nil, err
- }
- blockMode := NewECBEncrypter(block)
- origData = PKCS5Padding(origData, block.BlockSize())
- crypted := make([]byte, len(origData))
- blockMode.CryptBlocks(crypted, origData)
- return crypted, nil
- }
- func AesDecryptTS(crypted, key []byte, iv []byte) ([]byte, error) {
- block, err := aes.NewCipher(key)
- if err != nil {
- return nil, err
- }
- blockSize := block.BlockSize()
- blockMode := cipher.NewCBCDecrypter(block, iv[:blockSize])
- origData := make([]byte, len(crypted))
- blockMode.CryptBlocks(origData, crypted)
- origData = PKCS7UnPadding(origData)
- return origData, nil
- }
- func AesDecryptPKCS5(crypted, key []byte, iv []byte) ([]byte, error) {
- block, err := aes.NewCipher(key)
- if err != nil {
- return nil, err
- }
- //blockSize := block.BlockSize()
- blockMode := cipher.NewCBCDecrypter(block, iv)
- origData := make([]byte, len(crypted))
- blockMode.CryptBlocks(origData, crypted)
- origData = PKCS5UnPadding(origData)
- return origData, nil
- }
- func AesDecrypt(crypted, key []byte) ([]byte, error) {
- block, err := aes.NewCipher(key)
- if err != nil {
- return nil, err
- }
- blockSize := block.BlockSize()
- blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
- origData := make([]byte, len(crypted))
- blockMode.CryptBlocks(origData, crypted)
- origData = PKCS7UnPadding(origData)
- return origData, nil
- }
- func AesECBPKCS5Decrypt(crypted, key []byte) ([]byte, error) {
- block, err := aes.NewCipher(key)
- if err != nil {
- return nil, err
- }
- //blockSize := block.BlockSize()
- blockMode := NewECBDecrypter(block)
- origData := make([]byte, len(crypted))
- blockMode.CryptBlocks(origData, crypted)
- origData = PKCS5UnPadding(origData)
- return origData, nil
- }
- func RandSeq(n int) string {
- letters := []rune("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
- b := make([]rune, n)
- for i := range b {
- b[i] = letters[rand.Intn(len(letters))]
- }
- return string(b)
- }
- func EncryptKey(oriKey []byte) (string, error) {
- txtStream := base64.StdEncoding.EncodeToString(oriKey)
- return encData(txtStream, interPwd)
- }
- func EncryptKeySimple(oriKey []byte) (string, error) {
- oriKey = []byte(string(oriKey) + "123456")
- txtStream := base64.StdEncoding.EncodeToString(oriKey)
- return txtStream, nil
- }
- func encData(txtStream string, secretKey string) (string, error) {
- password := secretKey
- lockstream := "GHI9+JKLxyz012MNOPYbcRSTUVW8/ABCw3DEZaFXefghijklm7=nopqrsdQtuv456"
- //随机找一个数字,并从密锁串中找到一个密锁值
- lockLen := len(lockstream)
- lockCount := random.Int31n(int32(lockLen))
- randomLock := string([]rune(lockstream)[lockCount])
- password = getMD5Hash(password + randomLock)
- txtStream = base64.StdEncoding.EncodeToString([]byte(txtStream))
- tmpStream := ""
- j := 0
- k := 0
- for i := 0; i < len(txtStream); i++ {
- if k == len(password) {
- k = 0
- }
- findChar := string([]rune(txtStream)[i])
- j = (strings.Index(lockstream, findChar) + int(lockCount) + int(password[k])) % lockLen
- tmpStream += string([]rune(lockstream)[j])
- k++
- }
- return tmpStream + randomLock, nil
- }
- func getMD5Hash(text string) string {
- hash := md5.Sum([]byte(text))
- return hex.EncodeToString(hash[:])
- }
|