提交 ab4f3c83c598c0e7b47cd87fb4995f70db230fc0

作者 chenang
0 个父辈

socialwork-sdk

  1 +package common
  2 +
  3 +import (
  4 + "bytes"
  5 + "crypto/aes"
  6 + "crypto/cipher"
  7 + "encoding/base64"
  8 +)
  9 +
  10 +func Aes_CBC_Decrypt(crypted []byte, key, iv []byte) ([]byte, error) {
  11 + block, err := aes.NewCipher(key)
  12 + if err != nil {
  13 + return nil, err
  14 + }
  15 + blockMode := cipher.NewCBCDecrypter(block, iv)
  16 + origData := make([]byte, len(crypted))
  17 + blockMode.CryptBlocks(origData, crypted)
  18 + origData = unpadding(origData)
  19 + return origData, nil
  20 +}
  21 +
  22 +func unpadding(cipherText []byte) []byte {
  23 + end := cipherText[len(cipherText)-1]
  24 + cipherText = cipherText[:len(cipherText)-int(end)]
  25 +
  26 + return cipherText
  27 +}
  28 +
  29 +func Aes_CBC_Encrypt(data []byte, key, iv []byte) (string, error) {
  30 + block, err := aes.NewCipher(key)
  31 + if err != nil {
  32 + return "", err
  33 + }
  34 + origData := padding([]byte(data), block.BlockSize())
  35 + println("block ", block.BlockSize())
  36 + println("block2 ", len(iv))
  37 + blockMode := cipher.NewCBCEncrypter(block, iv)
  38 + crypted := make([]byte, len(origData))
  39 + blockMode.CryptBlocks(crypted, origData)
  40 + return base64.StdEncoding.EncodeToString(crypted), nil
  41 +}
  42 +
  43 +func padding(plainText []byte, blockSize int) []byte {
  44 + n := blockSize - len(plainText)%blockSize
  45 + temp := bytes.Repeat([]byte{byte(n)}, n)
  46 + plainText = append(plainText, temp...)
  47 +
  48 + return plainText
  49 +}
... ...
  1 +package common
  2 +
  3 +import (
  4 + "crypto"
  5 + "crypto/md5"
  6 + "crypto/rand"
  7 + "crypto/rsa"
  8 + "crypto/x509"
  9 + "encoding/base64"
  10 + "encoding/pem"
  11 +)
  12 +
  13 +func RsaSignWithMd5Hex(data string, prvKey string) (string, error) {
  14 + block, _ := pem.Decode([]byte(prvKey))
  15 + privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes)
  16 + if err != nil {
  17 + privateKey, err = x509.ParsePKCS1PrivateKey(block.Bytes)
  18 + if err != nil {
  19 + return "", err
  20 + }
  21 + }
  22 + md5 := md5.New()
  23 + md5.Write([]byte(data))
  24 + hash := md5.Sum(nil)
  25 + signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey.(*rsa.PrivateKey), crypto.MD5, hash[:])
  26 + if err != nil {
  27 + return "", err
  28 + }
  29 + out := base64.StdEncoding.EncodeToString(signature)
  30 + return out, nil
  31 +}
... ...
  1 +package socialwork_sdk
  2 +
  3 +import (
  4 + "encoding/json"
  5 + "log"
  6 + "socialwork-sdk/common"
  7 +)
  8 +
  9 +type OrderClient struct {
  10 + Key string `json:"key"`
  11 + IV string `json:"iv"`
  12 + PublicKey string `json:"public_key"`
  13 + CustomerPrivateKey string `json:"customer_private_key"`
  14 +}
  15 +
  16 +func NewOrderClient(key, iv, customerPrivateKey, publicKey string) *OrderClient {
  17 + return &OrderClient{
  18 + Key: key,
  19 + IV: iv,
  20 + PublicKey: publicKey,
  21 + CustomerPrivateKey: customerPrivateKey,
  22 + }
  23 +}
  24 +
  25 +func (o *OrderClient) EncryptAndSign(res interface{}) (string, string, error) {
  26 + bs, _ := json.Marshal(res)
  27 + cipherText, err := common.Aes_CBC_Encrypt(bs, []byte(o.Key), []byte(o.IV))
  28 + if err != nil {
  29 + log.Printf("Aes_CBC_Encrypt.failed.err=%v\n", err)
  30 + return "", "", err
  31 + }
  32 +
  33 + sign, err := common.RsaSignWithMd5Hex(cipherText, o.CustomerPrivateKey)
  34 + if err != nil {
  35 + log.Printf("RsaSignWithMd5Hex.failed.err=%v\n", err)
  36 + return "", "", err
  37 + }
  38 + return cipherText, sign, nil
  39 +}
  40 +
  41 +func (o *OrderClient) PrintVersion() string {
  42 + return "1.0"
  43 +}
... ...
注册登录 后发表评论