Prechádzať zdrojové kódy

新增des加解密方法

maxiaoshan 2 rokov pred
rodič
commit
ce5e7860cd
2 zmenil súbory, kde vykonal 293 pridanie a 0 odobranie
  1. 3 0
      src/analysiscode/server.go
  2. 290 0
      src/spiderutil/des.go

+ 3 - 0
src/analysiscode/server.go

@@ -84,6 +84,9 @@ func getCodeByFree(path, stype, head, cookie string) (code string, respheader ht
 	}
 	for times := 1; times <= 6; times++ { //重试三次
 		if times > 4 { //重试第4次开始,使用代理ip
+			if stype == "-1" {
+				return
+			}
 			proxyIp := spiderutil.GetProxyAddr(spiderutil.Config.ProxyAddr, spiderutil.Config.ProxyAuthor) //获取代理地址
 			util.Debug("proxy:", proxyIp)
 			client.SetProxyURL(proxyIp) //设置代理IP

+ 290 - 0
src/spiderutil/des.go

@@ -0,0 +1,290 @@
+package spiderutil
+
+import (
+	"bytes"
+	"crypto/cipher"
+	"crypto/des"
+	qu "qfw/util"
+)
+
+//func main() {
+//	key := []byte("Ctpsp@88") //43 74 70 73 70 40 38 38
+//	b, _ := base64.StdEncoding.DecodeString("L0j+JvbeVM0svSpjIwXdE7yTu78wiEsz+auatLDOTf5uhER4DzxoH6TEyg7KG3uTysRUj5ORN3SESOkGU1YwM8ddEuuoTg5uPsqQ9/SuNds=")
+//	//src := []byte("9EocVgdsKSSlNJzdI9yjbVFb6b3MXOE4686Bk1wI1VBURmh+FoxCdA==")
+//	str := DesECBDecrypter(b, key)
+//	fmt.Println("2", string(str))
+//	return
+//	// ECB 加密
+//	cipher := DesECBEncrypt([]byte("0e299199eb2a46b3a0bc7b8191abdf17"), key)
+//	// 转base64
+//	bs64 := base64.StdEncoding.EncodeToString(cipher)
+//	fmt.Println("1", bs64, len(bs64))
+//
+//	//// 转回byte
+//	//bt, err := base64.StdEncoding.DecodeString(bs64)
+//	//if err != nil {
+//	//	fmt.Println("base64转换失败")
+//	//}
+//	//// ECB 解密
+//	//str := DesECBDecrypter(bt, key)
+//	//fmt.Println("2", string(str))
+//	//result := base64.StdEncoding.EncodeToString(str)
+//	//fmt.Println(string(result))
+//}
+
+//---------------DES ECB加密--------------------
+// data: 明文数据
+// key: 密钥字符串
+// 返回密文数据
+func DesECBEncrypt(data, key []byte) []byte {
+	//NewCipher创建一个新的加密块
+	block, err := des.NewCipher(key)
+	if err != nil {
+		return nil
+	}
+
+	bs := block.BlockSize()
+	// pkcs5填充
+	qu.Debug(data)
+	data = pkcs5Padding(data, bs)
+	qu.Debug(data)
+	if len(data)%bs != 0 {
+		return nil
+	}
+
+	out := make([]byte, len(data))
+	dst := out
+	for len(data) > 0 {
+		//Encrypt加密第一个块,将其结果保存到dst
+		block.Encrypt(dst, data[:bs])
+		data = data[bs:]
+		dst = dst[bs:]
+	}
+	return out
+}
+
+//---------------DES ECB解密--------------------
+// data: 密文数据
+// key: 密钥字符串
+// 返回明文数据
+func DesECBDecrypter(data, key []byte) []byte {
+	//NewCipher创建一个新的加密块
+	block, err := des.NewCipher(key)
+	if err != nil {
+		return nil
+	}
+
+	bs := block.BlockSize()
+	if len(data)%bs != 0 {
+		return nil
+	}
+
+	out := make([]byte, len(data))
+	dst := out
+	for len(data) > 0 {
+		//Encrypt加密第一个块,将其结果保存到dst
+		block.Decrypt(dst, data[:bs])
+		data = data[bs:]
+		dst = dst[bs:]
+	}
+
+	// pkcs5填充
+	out = pkcs5UnPadding(out)
+
+	return out
+}
+
+//---------------DES CBC加密--------------------
+// data: 明文数据
+// key: 密钥字符串
+// iv:iv向量
+// 返回密文数据
+func DesCBCEncrypt(data, key, iv []byte) []byte {
+	block, err := des.NewCipher(key)
+	if err != nil {
+		return nil
+	}
+
+	// pkcs5填充
+	data = pkcs5Padding(data, block.BlockSize())
+	cryptText := make([]byte, len(data))
+
+	blockMode := cipher.NewCBCEncrypter(block, iv)
+	blockMode.CryptBlocks(cryptText, data)
+	return cryptText
+}
+
+//---------------DES CBC解密--------------------
+// data: 密文数据
+// key: 密钥字符串
+// iv:iv向量
+// 返回明文数据
+func DesCBCDecrypter(data, key, iv []byte) []byte {
+	block, err := des.NewCipher(key)
+	if err != nil {
+		return nil
+	}
+
+	blockMode := cipher.NewCBCDecrypter(block, iv)
+	cryptText := make([]byte, len(data))
+	blockMode.CryptBlocks(cryptText, data)
+	// pkcs5填充
+	cryptText = pkcs5UnPadding(cryptText)
+
+	return cryptText
+}
+
+//---------------DES CTR加密--------------------
+// data: 明文数据
+// key: 密钥字符串
+// iv:iv向量
+// 返回密文数据
+func DesCTREncrypt(data, key, iv []byte) []byte {
+	block, err := des.NewCipher(key)
+	if err != nil {
+		return nil
+	}
+
+	// pkcs5填充
+	data = pkcs5Padding(data, block.BlockSize())
+	cryptText := make([]byte, len(data))
+
+	blockMode := cipher.NewCTR(block, iv)
+	blockMode.XORKeyStream(cryptText, data)
+	return cryptText
+}
+
+//---------------DES CTR解密--------------------
+// data: 密文数据
+// key: 密钥字符串
+// iv:iv向量
+// 返回明文数据
+func DesCTRDecrypter(data, key, iv []byte) []byte {
+	block, err := des.NewCipher(key)
+	if err != nil {
+		return nil
+	}
+
+	blockMode := cipher.NewCTR(block, iv)
+	cryptText := make([]byte, len(data))
+	blockMode.XORKeyStream(cryptText, data)
+
+	// pkcs5填充
+	cryptText = pkcs5UnPadding(cryptText)
+
+	return cryptText
+}
+
+//---------------DES OFB加密--------------------
+// data: 明文数据
+// key: 密钥字符串
+// iv:iv向量
+// 返回密文数据
+func DesOFBEncrypt(data, key, iv []byte) []byte {
+	block, err := des.NewCipher(key)
+	if err != nil {
+		return nil
+	}
+
+	// pkcs5填充
+	data = pkcs5Padding(data, block.BlockSize())
+	cryptText := make([]byte, len(data))
+
+	blockMode := cipher.NewOFB(block, iv)
+	blockMode.XORKeyStream(cryptText, data)
+	return cryptText
+}
+
+//---------------DES OFB解密--------------------
+// data: 密文数据
+// key: 密钥字符串
+// iv:iv向量
+// 返回明文数据
+func DesOFBDecrypter(data, key, iv []byte) []byte {
+	block, err := des.NewCipher(key)
+	if err != nil {
+		return nil
+	}
+
+	blockMode := cipher.NewOFB(block, iv)
+	cryptText := make([]byte, len(data))
+	blockMode.XORKeyStream(cryptText, data)
+
+	// pkcs5填充
+	cryptText = pkcs5UnPadding(cryptText)
+
+	return cryptText
+}
+
+//---------------DES CFB加密--------------------
+// data: 明文数据
+// key: 密钥字符串
+// iv:iv向量
+// 返回密文数据
+func DesCFBEncrypt(data, key, iv []byte) []byte {
+	block, err := des.NewCipher(key)
+	if err != nil {
+		return nil
+	}
+
+	// pkcs5填充
+	data = pkcs5Padding(data, block.BlockSize())
+	cryptText := make([]byte, len(data))
+
+	blockMode := cipher.NewCFBDecrypter(block, iv)
+	blockMode.XORKeyStream(cryptText, data)
+	return cryptText
+}
+
+//---------------DES CFB解密--------------------
+// data: 密文数据
+// key: 密钥字符串
+// iv:iv向量
+// 返回明文数据
+func DesCFBDecrypter(data, key, iv []byte) []byte {
+	block, err := des.NewCipher(key)
+	if err != nil {
+		return nil
+	}
+
+	blockMode := cipher.NewCFBEncrypter(block, iv)
+	cryptText := make([]byte, len(data))
+	blockMode.XORKeyStream(cryptText, data)
+
+	// pkcs5填充
+	cryptText = pkcs5UnPadding(cryptText)
+
+	return cryptText
+}
+
+//zero补码算法
+func zeroPadding(ciphertext []byte, blockSize int) []byte {
+	padding := blockSize - len(ciphertext)%blockSize
+	padtext := bytes.Repeat([]byte{0}, padding)
+	return append(ciphertext, padtext...)
+}
+
+//zero减码算法
+func zeroUnPadding(origData []byte) []byte {
+	return bytes.TrimFunc(origData,
+		func(r rune) bool {
+			return r == rune(0)
+		})
+}
+
+//pkcs5补码算法
+func pkcs5Padding(ciphertext []byte, blockSize int) []byte {
+	padding := blockSize - len(ciphertext)%blockSize
+	qu.Debug(blockSize, len(ciphertext), len(ciphertext)%blockSize, padding)
+	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
+	qu.Debug(byte(padding), []byte{byte(padding)})
+	qu.Debug(padtext)
+	return append(ciphertext, padtext...)
+}
+
+//pkcs5减码算法
+func pkcs5UnPadding(origData []byte) []byte {
+	length := len(origData)
+	unpadding := int(origData[length-1])
+	return origData[:(length - unpadding)]
+}