|
@@ -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)]
|
|
|
+}
|