当前位置:网站首页>Golang des-cbc
Golang des-cbc
2022-07-01 11:53:00 【卖烤冷面的郭师傅】
Golang des-cbc
package descrypt
import (
"bytes"
"crypto/cipher"
"crypto/des"
"crypto/md5"
"encoding/base64"
"encoding/hex"
"fmt"
"net/url"
"strconv"
"strings"
"time"
)
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 HexToByte(hex string) []byte {
length := len(hex) / 2
slice := make([]byte, length)
rs := []rune(hex)
for i := 0; i < length; i++ {
s := string(rs[i*2 : i*2+2])
value, _ := strconv.ParseInt(s, 16, 10)
slice[i] = byte(value & 0xFF)
}
return slice
}
func DesEncryptHash(key string, src string) string {
m := md5.New()
m.Write([]byte(src))
data := string(HexToByte(hex.EncodeToString(m.Sum(nil)))) + src
return DesEncrypt(key, []byte(data))
}
func DesEncrypt(key string, data []byte) string {
keyByte := HexToByte(key[:16])
iv := HexToByte(key[16:])
block, err := des.NewCipher(keyByte)
if err != nil {
panic(err)
}
data = PKCS5Padding(data, block.BlockSize())
mode := cipher.NewCBCEncrypter(block, iv)
out := make([]byte, len(data))
mode.CryptBlocks(out, data)
encoded := base64.StdEncoding.EncodeToString(out)
return encoded
}
func DesDecryptHash(key string, src string) string {
dec := DesDecrypt(key, src)
res := dec[16:]
m := md5.New()
m.Write([]byte(res))
mm := hex.EncodeToString(m.Sum(nil))
h := hex.EncodeToString([]byte(dec[:16]))
if mm != h {
return ""
}
return res
}
func DesDecrypt(key, src string) string {
keyByte := HexToByte(key[:16])
iv := HexToByte(key[16:])
enc, _ := base64.StdEncoding.DecodeString(src)
block, err := des.NewCipher(keyByte)
if err != nil {
panic(err)
}
mode := cipher.NewCBCDecrypter(block, iv)
plaintext := make([]byte, len(enc))
mode.CryptBlocks(plaintext, enc)
plaintext = PKCS5UnPadding(plaintext)
return string(plaintext)
}
边栏推荐
- Question: what professional qualities should test engineers have?
- solo 可以通过 IPV6 访问吗?
- 图的理论基础
- 对于mvvm和mvc的理解
- redis中value/hush
- Cann operator: using iterators to efficiently realize tensor data cutting and blocking processing
- Openinstall: wechat applet jump to H5 configuration service domain name tutorial
- Extended tree (I) - concept and C implementation
- IPlImage的width和widthStep
- Botu V15 add GSD file
猜你喜欢

Redis configuration environment variables

CAD如何设置标注小数位

Why must we move from Devops to bizdevops?

Matrix of numpy

MQ prevent message loss and repeated consumption

About keil compiler, "file has been changed outside the editor, reload?" Solutions for

Computer graduation project asp Net attendance management system vs developing SQLSERVER database web structure c programming computer web page source code project

C summary of knowledge points 1

S7-1500plc simulation

Comment Cao définit la décimale de dimension
随机推荐
redis中value/hush
JS日期格式化转换方法
Matrix of numpy
Brief explanation of the working principle, usage scenarios and importance of fingerprint browser
C summary of knowledge points 1
妙啊!MarkBERT
华为HMS Core携手超图为三维GIS注入新动能
Compile and debug net6 source code
Prepare for the Blue Bridge Cup Day10__ PWM control light brightness
Value/sortedset in redis
Istio, ebpf and rsocket Broker: in depth study of service grid
Activity workflow engine
Redis' attack tactics
Theoretical basis of graph
Test case writing specification in unittest framework and how to run test cases
Istio、eBPF 和 RSocket Broker:深入研究服务网格
Value/set in redis
Jd.com renewed its cooperation with Tencent: issuing class A shares to Tencent with a maximum value of US $220million
Cann operator: using iterators to efficiently realize tensor data cutting and blocking processing
[Maui] add click events for label, image and other controls