赞
踩
package main import ( "bytes" "encoding/base64" "encoding/hex" "fmt" "github.com/tjfoc/gmsm/sm3" "github.com/tjfoc/gmsm/sm4" "strings" ) // PKCSPadd填充算法 func PKCS7Padding(ciphertext []byte, blockSize int) []byte { fmt.Printf("PKCS7Padding blockSize[%d]\n", blockSize) fmt.Printf("PKCS7Padding len(ciphertext)[%d]\n", len(ciphertext)) padding := blockSize - len(ciphertext)%blockSize fmt.Printf("PKCS7Padding len(ciphertext) blockSize[%d]\n", len(ciphertext)%blockSize) padText := bytes.Repeat([]byte{byte(padding)}, padding) fmt.Println(padText) return append(ciphertext, padText...) } func PKCS7UnPadding(origData []byte) []byte { length := len(origData) fmt.Println(origData) fmt.Printf("PKCSUnPadding origData len %d\n", len(origData)) unPadding := int(origData[length-1]) fmt.Printf("PKCSUnPadding origData unPadding %d\n", unPadding) return origData[:(length - unPadding)] } func SM3main() { data := "test" h := sm3.New() h.Write([]byte(data)) sum := h.Sum(nil) fmt.Printf("digest value is: %x\n", sum) } // 金融sm4加密ECB模式不填充,注意被加密数据必须为16个字节 func SM4ECBEncrypt(originalBytes, key []byte) ([]byte, error) { block, err := sm4.NewCipher(key) if err != nil { panic(err) } fmt.Println("SM44ECBEncrypt block.BlockSize") //originalBytes = PKCS7Padding(originalBytes, block.BlockSize()) if len(originalBytes) != 16 { fmt.Println("长度不是16") panic(err) return nil, err } cipherArr := make([]byte, len(originalBytes)) block.Encrypt(cipherArr, originalBytes) return cipherArr, nil } // 金融sm4解密ECB模式不填充,注意被加密数据必须为16个字节 func SM4ECBDecrypt(originalBytes, key []byte) ([]byte, error) { block, err := sm4.NewCipher(key) if err != nil { panic(err) } if len(originalBytes) != 16 { fmt.Println("长度不是16") panic(err) return nil, err } cipherArr := make([]byte, len(originalBytes)) fmt.Println("SM44ECBDecrypt start") fmt.Println(originalBytes) block.Decrypt(cipherArr, originalBytes) //cipherArr = PKCS7UnPadding(cipherArr) fmt.Println("SM44ECBDecrypt end") return cipherArr, nil } func SM4ECBBase64Encrypt(originalText string, key []byte) (string, error) { block, err := sm4.NewCipher(key) if err != nil { panic(err) } fmt.Println("SM44ECBBase64Encrypt originalText") fmt.Println("SM44ECBBase64Encrypt block.BlockSize") originalBytes := []byte(originalText) originalBytes = PKCS7Padding(originalBytes, block.BlockSize()) fmt.Println(originalBytes) cipherArr := make([]byte, 0) cArr := make([]byte, 16) j := 0 for i := 0; i < len(originalBytes)/16; i++ { original := originalBytes[j : j+16] block.Encrypt(cArr, original) cipherArr = append(cipherArr, cArr...) j = j + 16 } fmt.Println("+++++++++++++++++++++++++++++++++++++") fmt.Println(cipherArr) base64Str := base64.StdEncoding.EncodeToString(cipherArr) return base64Str, nil } func SM4ECBBase64Decrypt(cipherText string, key []byte) (string, error) { cInArr, _ := base64.StdEncoding.DecodeString(cipherText) block, err := sm4.NewCipher(key) if err != nil { panic(err) } fmt.Println("SM44ECBBase64Encrypt block.BlockSize") cipherArr := make([]byte, 0) cArr := make([]byte, 16) j := 0 for i := 0; i < len(cInArr)/16; i++ { original := cInArr[j : j+16] block.Decrypt(cArr, original) cipherArr = append(cipherArr, cArr...) j = j + 16 } fmt.Println("+++++++++++++++++++++++++++++++++++++") fmt.Println(cipherArr) originalText := string(PKCS7UnPadding(cipherArr)) return originalText, nil } func SM4Main() { key, err := hex.DecodeString("11111111111111112222222222222222") fmt.Println(key) if err != nil { fmt.Println("key DecodeString err") panic(err) return } fmt.Println("===========================") arrStr, _ := hex.DecodeString("3343434324242424ABCDEF1234567890") resultArr, _ := SM4ECBEncrypt(arrStr, key) fmt.Println("SM4ECBEncrypt resultArr:") fmt.Println(resultArr) fmt.Println(strings.ToUpper(hex.EncodeToString(resultArr))) orgArr, _ := SM4ECBDecrypt(resultArr, key) fmt.Println("SM4ECBDecrypt resultArr:") fmt.Println(orgArr) fmt.Println(strings.ToUpper(hex.EncodeToString(orgArr))) fmt.Println("base64 sm4++++++++++++++++++++++++++") jsonStr := "{\"appId\":\"04\",\"appOrderNo\":\"0420230306000025358496\",\"appTranDt\":\"20230306162829\",\"balance\":\"010000001576280200000000000003000000000000040000000000000500000000000006000000000000070000000000000800000000000009000000000000\",\"bankDate\":\"20230306\",\"cardNo\":\"2168890040224279\",\"merchantId\":\"906110135120001\",\"merchantName\":\"T35120065\",\"respCode\":\"1001\",\"respMsg\":\"ss\",\"rrn\":\"306516354661\",\"terminalId\":\"35120065\"\",\"tranNo\":\"22422449523030616282802441875\",\"tranSn\":\"C0002023030616345701135111\",\"txnType\":\"CAP\",\"version\":\"1.0.0\"}" //jsonStr := "ewdewfecgvrtevgrgrcercfrcrfe454gg43t5g45" fmt.Println(jsonStr) resultStr, _ := SM4ECBBase64Encrypt(jsonStr, key) fmt.Println(resultStr) originalText, _ := SM4ECBBase64Decrypt(resultStr, key) fmt.Println(originalText) } func main() { //SM3main() SM4Main() }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。