概述
参考文档
https://wenku.baidu.com/view/903df10e3269a45177232f60ddccda38376be1d9.html
安装
go get github.com/tjfoc/gmsm
代码
package sm4
import (
"encoding/hex"
"fmt"
"github.com/pkg/errors"
"github.com/tjfoc/gmsm/sm4"
)
// utvtSm4Mac
/**
*
@Description: 银联联机UtvtSm4Mac算法
*
@param mab 需要加密的内容
*
@param key 密码
*
@return secretText 加密后的内容
*
@return err
*/
func utvtSm4Mac(mab string, key []byte) (secretText string, err error) {
// 创建一个Sm4Cipher
c, err := sm4.NewCipher(key)
if err != nil {
return
}
// SM4算法的MAB,按每16个字节做异或(不管信息中的字符格式),如果最后不满16个字节,则添加“0X00”。
l := len(mab) % 16
mabByte := []byte(mab)
for i := 0; i < 16-l; i++ {
mabByte = append(mabByte, 0x00)
}
resultBlock := make([]byte, 16, 16)
for i := 0; i < len(mabByte)/16-1; i++ {
var byteXorErr error
if i == 0 {
resultBlock, byteXorErr = byteXor(mabByte[:16], mabByte[16:32])
} else {
resultBlock, byteXorErr = byteXor(mabByte[i*16:i*16+16], resultBlock)
}
if byteXorErr != nil {
err = byteXorErr
return
}
}
// 将异或运算后的最后16个字节(RESULT BLOCK)转换成32 个HEXDECIMAL
resultBlockStr := hex.EncodeToString(resultBlock)
resultBlockByte := []byte(resultBlockStr)
// 取前16个字节用SM4加密
encBlock1 := make([]byte, 16)
c.Encrypt(encBlock1, resultBlockByte[:16])
// 将加密后的结果与后16个字节异或
tempBlock, byteXorErr := byteXor(encBlock1, resultBlockByte[16:])
if byteXorErr != nil {
err = byteXorErr
return
}
// 用异或的结果TEMP BLOCK 再进行一次SM4密钥算法运算。
encBlock2 := make([]byte, 16)
c.Encrypt(encBlock2, tempBlock)
// 将运算后的结果(ENC BLOCK2)转换成32 个HEXDECIMAL
// 取前8个字节作为硬件序列号加密数据
//encResult := hex.EncodeToString(encBlock2)
secretText = fmt.Sprintf("%X", encBlock2)[:8]
return
}
最后
以上就是孤独草丛为你收集整理的银联联机UTVTSM4MAC算法的Go语言实现的全部内容,希望文章能够帮你解决银联联机UTVTSM4MAC算法的Go语言实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复