des3.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package utils
  2. import (
  3. "crypto/cipher"
  4. "crypto/des"
  5. "encoding/base64"
  6. )
  7. func DesBase64Decrypt(crypted []byte, desKey string) []byte {
  8. result, _ := base64.StdEncoding.DecodeString(string(crypted))
  9. remain := len(result) % 8
  10. if remain > 0 {
  11. mod := 8 - remain
  12. for i := 0; i < mod; i++ {
  13. result = append(result, 0)
  14. }
  15. }
  16. origData, err := TripleDesDecrypt(result, []byte(desKey))
  17. if err != nil {
  18. panic(any(err))
  19. }
  20. return origData
  21. }
  22. func TripleDesDecrypt(crypted, key []byte) ([]byte, error) {
  23. block, err := des.NewTripleDESCipher(key)
  24. if err != nil {
  25. return nil, err
  26. }
  27. blockMode := cipher.NewCBCDecrypter(block, key[:8])
  28. origData := make([]byte, len(crypted))
  29. // origData := crypted
  30. blockMode.CryptBlocks(origData, crypted)
  31. origData = PKCS5UnPadding(origData)
  32. // origData = ZeroUnPadding(origData)
  33. return origData, nil
  34. }
  35. func PKCS5UnPadding(origData []byte) []byte {
  36. length := len(origData)
  37. // 去掉最后一个字节 unpadding 次
  38. unpadding := int(origData[length-1])
  39. return origData[:(length - unpadding)]
  40. }