| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package util
- import (
- "bytes"
- "crypto/des"
- "encoding/hex"
- "fmt"
- )
- // Go DES ECB加密
- func EncryptDES_ECB(data []byte, key string) string {
- keyByte := []byte(key)
- block, err := des.NewCipher(keyByte)
- if err != nil {
- panic(err)
- }
- bs := block.BlockSize()
- //对明文数据进行补码
- data = PKCS5Padding(data, bs)
- if len(data)%bs != 0 {
- panic("Need a multiple of the blocksize")
- }
- out := make([]byte, len(data))
- dst := out
- for len(data) > 0 {
- //对明文按照blocksize进行分块加密
- //必要时可以使用go关键字进行并行加密
- block.Encrypt(dst, data[:bs])
- data = data[bs:]
- dst = dst[bs:]
- }
- return fmt.Sprintf("%X", out)
- }
- func DecryptDES_ECB(src, key string) (string, error) {
- data, err := hex.DecodeString(src)
- if err != nil {
- return "", err
- }
- keyByte := []byte(key)
- block, err := des.NewCipher(keyByte)
- if err != nil {
- return "", err
- }
- bs := block.BlockSize()
- if len(data)%bs != 0 {
- panic("crypto/cipher: input not full blocks")
- }
- out := make([]byte, len(data))
- dst := out
- for len(data) > 0 {
- block.Decrypt(dst, data[:bs])
- data = data[bs:]
- dst = dst[bs:]
- }
- out = PKCS5UnPadding(out)
- return string(out), nil
- }
- // *********************************************
- //明文补码算法
- 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)]
- }
|