永不落伍 发表于 2018-9-21 06:59:14

golang 3des/ecb/cbc/pkcs5 加解密

// DES、3DES加解密示例,用于生产环境请修改代码使之健壮  package main
  import (
  "bytes"
  "crypto/cipher"
  "crypto/des"
  "encoding/base64"
  "errors"
  "fmt"
  )
  func main() {
  test3Des()
  }
  func test3Des() {
  key, err := base64.StdEncoding.DecodeString("b93e24738d364ad38047a97d6a8ad63c")
  result, err := TripleDesECBEncrypt([]byte("一直都在poiuy123"), key)
  if err != nil {
  panic(err)
  }
  fmt.Println(base64.StdEncoding.EncodeToString(result))
  origData, err := TripleDesECBDecrypt(result, key)
  if err != nil {
  panic(err)
  }
  fmt.Println(string(origData))
  }
  // 3DES加密
  func TripleDesCBCEncrypt(origData, key []byte) ([]byte, error) {
  block, err := des.NewTripleDESCipher(key)
  if err != nil {
  return nil, err
  }
  origData = PKCS5Padding(origData, block.BlockSize())
  // origData = ZeroPadding(origData, block.BlockSize())
  blockMode := cipher.NewCBCEncrypter(block, key[:8])
  crypted := make([]byte, len(origData))
  blockMode.CryptBlocks(crypted, origData)
  return crypted, nil
  }
  // 3DES解密
  func TripleDesCBCDecrypt(crypted, key []byte) ([]byte, error) {
  block, err := des.NewTripleDESCipher(key)
  if err != nil {
  return nil, err
  }
  blockMode := cipher.NewCBCDecrypter(block, key[:8])
  origData := make([]byte, len(crypted))
  // origData := crypted
  blockMode.CryptBlocks(origData, crypted)
  origData = PKCS5UnPadding(origData)
  // origData = ZeroUnPadding(origData)
  return origData, 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 次
  unpadding := int(origData)
  return origData[:(length - unpadding)]
  }
  func TripleDesECBEncrypt(origData, key []byte) ([]byte, error) {
  block, err := des.NewTripleDESCipher(key)
  if err != nil {
  return nil, err
  }
  bs := block.BlockSize()
  origData = PKCS5Padding(origData, bs)
  if len(origData)%bs != 0 {
  return nil, errors.New("Need a multiple of the blocksize")
  }
  out := make([]byte, len(origData))
  dst := out
  for len(origData) > 0 {
  block.Encrypt(dst, origData[:bs])
  origData = origData
  dst = dst
  }
  return out, nil
  }
  func TripleDesECBDecrypt(crypted, key []byte) ([]byte, error) {
  block, err := des.NewTripleDESCipher(key)
  if err != nil {
  return nil, err
  }
  bs := block.BlockSize()
  if len(crypted)%bs != 0 {
  return nil, errors.New("crypto/cipher: input not full blocks")
  }
  out := make([]byte, len(crypted))
  dst := out
  for len(crypted) > 0 {
  block.Decrypt(dst, crypted[:bs])
  crypted = crypted
  dst = dst
  }
  out = PKCS5UnPadding(out)
  return out, nil
  }

页: [1]
查看完整版本: golang 3des/ecb/cbc/pkcs5 加解密