golang DES + ECB + pkcs5 + base64加密解密
package main
import (
"bytes"
"crypto/des"
"crypto/sha1"
"encoding/base64"
"errors"
"fmt"
"log"
)
func SHA1(data []byte) []byte {
h := sha1.New()
h.Write(data)
return h.Sum(nil)
}
func getSha1PrngKey(keyword string) (key []byte) {
data := []byte(keyword)
hashs := SHA1(SHA1(data))
key = hashs[0:8]
return key
}
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
fmt.Println(padding)
fmt.Println(len(ciphertext))
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 DesEncrypt(src, key []byte) ([]byte, error) {
block, err := des.NewCipher(key)
if err != nil {
return nil, err
}
bs := block.BlockSize()
src = PKCS5Padding(src, bs)
if len(src)%bs != 0 {
return nil, errors.New("Need a multiple of the blocksize")
}
out := make([]byte, len(src))
dst := out
for len(src) > 0 {
block.Encrypt(dst, src[:bs])
src = src[bs:]
dst = dst[bs:]
}
return out, nil
}
func DesDecrypt(src, key []byte) ([]byte, error) {
block, err := des.NewCipher(key)
if err != nil {
return nil, err
}
out := make([]byte, len(src))
dst := out
bs := block.BlockSize()
if len(src)%bs != 0 {
return nil, errors.New("crypto/cipher: input not full blocks")
}
for len(src) > 0 {
block.Decrypt(dst, src[:bs])
src = src[bs:]
dst = dst[bs:]
}
out = PKCS5UnPadding(out)
return out, nil
}
func main() {
origtext := []byte("{\"ID\":\"bf33772c4c867b02051481ba2357e695\",\"B040021\":\"1020004\",\"B040022\":\"12345678901@51iwifi.com\",\"220040B\":\"12345678901@51iwifi.com\",\"B040005\":\"\",\"B050004\":\"\",\"B050009\":\"\",\"F020001\":\"2054847098\",\"H010003\":\"02\",\"B020007\":\"\",\"C050001\":\"\",\"F030002\":\"Test_201505261cdc8352-acad-4427-b79f-dfd8d7b037fc\",\"F030008\":\"\",\"F030009\":\"\",\"H010014\":\"1456298115\",\"E020007\":\"\",\"C040002\":\"AAAAAAAAAAAA\",\"G020013\":\"\",\"G020014\":\"TEST-TEST-JB4L-TEST-1.M6000\",\"B020001\":\"01\",\"F030013\":\"\",\"F030014\":\"\",\"F010008\":\"330100\",\"B050012\":\"1456298115\",\"B050014\":\"1456298115\",\"B050016\":\"139\",\"H010034\":\"\",\"B050018\":\"1\",\"B050020\":\"1\",\"F020006\":\"5120\",\"F020007\":\"6143\",\"H010036\":\"330100\",\"F030011\":\"BB-BB-BB-BB-BB-BB\"}")
erytext, err := DesEncrypt(origtext, getSha1PrngKey("123456"))
if err != nil {
log.Fatal(err)
}
fmt.Println(base64.StdEncoding.EncodeToString(erytext))
s, _ := DesDecrypt(erytext, getSha1PrngKey("123456"))
fmt.Println(string(s))
}
- 代码解释
- key经过sha1两次求hash值
- pkcs5明文填充