package utils

import (
	"bytes"
	"crypto/cipher"
	"crypto/des"
	"encoding/base64"
)

//利用秘钥通过DES算法实现明文的加密
//利用秘钥通过DES算法实现密文的解密

//在加密和解密之前，首先需要补码和去码的操作

// PKCS5Padding 补码
func DESPKCS5Padding(orgData []byte, blockSize int) []byte {
	//abc55555
	padding := blockSize - len(orgData)%8
	padtxt := bytes.Repeat([]byte{byte(padding)}, padding)
	return append(orgData, padtxt...)

}

// PKCS5UnPadding 去码
func DESPKCS5UnPadding(cipherTxt []byte) []byte {
	length := len(cipherTxt)
	unpadding := int(cipherTxt[length-1])
	return cipherTxt[:length-unpadding]
	//cipherTxt[:4]

}

// DesEncrypt DES加密，加密会用到补码
func DesEncrypt(orig []byte, key []byte) []byte {
	//首先检验秘钥是否合法
	//DES加密算法，秘钥的长度必须为8bit block.BlockSize() = 8;
	block, _ := des.NewCipher(key)
	//补码
	origData := DESPKCS5Padding(orig, block.BlockSize())
	//设置加密方式
	blockMode := cipher.NewCBCEncrypter(block, key)
	//加密处理
	crypted := make([]byte, len(origData)) //存放加密后的密文
	blockMode.CryptBlocks(crypted, origData)
	return crypted
}

// DesDecrypt DES解密，解密要用到去码
func DesDecrypt(cipherTxt []byte, key []byte) []byte {
	//校验key的有效性
	block, _ := des.NewCipher(key)
	//设置解码方式
	blockMode := cipher.NewCBCDecrypter(block, key)
	//创建缓冲，存放解密后的数据
	orgData := make([]byte, len(cipherTxt))
	//开始解密
	blockMode.CryptBlocks(orgData, cipherTxt)
	//去掉编码
	orgData = DESPKCS5UnPadding(orgData)
	return orgData
}

// GetEncryptDes 进行des加密
func GetEncryptDes(s string) string {
	return base64.StdEncoding.EncodeToString(DesEncrypt([]byte(s), []byte("dbcma123")))

	// 通过base64处理秘文 打印成string
	// base64.StdEncoding.EncodeToString(cipherTxt)
}

// ToDesDecrypt des对称解密
func ToDesDecrypt(cipherTxt string) string {

	decodeString, err := base64.StdEncoding.DecodeString(cipherTxt)
	if err != nil {
	}

	return string(DesDecrypt(decodeString, []byte("dbcma123")))
}
