记录一下对一些稍大文件进行 SM2 签名验签的实现,这里只列出了外围代码,其余不波及的代码或者有任何疑难能够查看我之前写的明码技术专题博客
/*
函数名:sm2Sign
sm2 签名算法实现对文件的签名
参 数:filePathIn , 待签名文件
priKey , 签名私钥文件
返回值:签名后文件名
错误信息
创立工夫及创建者:2021-06-17 Yuan_sr
*/
func sm2Sign (filePathIn, priKey string) (string, error){
//1. 关上磁盘的私钥文件
file, err := os.Open(priKey)
if err != nil {return "", err}
defer file.Close()
//2. 将私钥文件中的内容读出
fileInfo, err := file.Stat()
if err != nil {return "", err}
buf := make([]byte, fileInfo.Size())
_, err = file.Read(buf)
if err != nil {return "", err}
//3. 将 pem 格局私钥文件解码并反序列化
privateKeyFromPem, err := gmx509.ReadPrivateKeyFromPem(buf, nil)
if err != nil {return "", err}
//4. 创立一个哈希对象
hash := sm3.New()
inFile, err := os.Open(filePathIn)
if err != nil {return "", err}
defer inFile.Close()
for {n, err := inFile.Read(buf)
if err == io.EOF{break}
if err != nil && err != io.EOF {return "", err}
_, err = hash.Write(buf[:n])
if err != nil {return "", err}
}
hashed := hash.Sum(nil)
//5. 签名
signText, err := privateKeyFromPem.Sign(rand.Reader, hashed, nil)
if err != nil {return "", err}
outFile, err := os.Create(signFileName)
if err != nil {return "", err}
defer outFile.Close()
outFile.Write(signText)
return signFileName, nil
}
/*
函数名:sm2Verify
sm2 验签算法实现对文件的验签
参 数:encFile , 密文文件
signFile , 签名文件
pubKey , 验签公钥
返回值:验签后果
错误信息
创立工夫及创建者:2021-06-17 Yuan_sr
*/
func sm2Verify(encFile, signFile, pubKey string) (bool, error) {
//1. 关上磁盘公钥文件
file, err := os.Open(pubKey)
if err != nil {return false, err}
defer file.Close()
fileInfo, err := file.Stat()
if err != nil {return false, err}
buf := make([]byte, fileInfo.Size())
_, err = file.Read(buf)
if err != nil {return false, err}
//2. 将 pem 格局公钥解码并反序列化
publicKeyFromPem, err := gmx509.ReadPublicKeyFromPem(buf)
if err != nil {return false, err}
//3. 进行哈西运算
hash := sm3.New()
inFile, err := os.Open(dvOutPath + encFile)
if err != nil {return false, err}
defer inFile.Close()
for {n, err := inFile.Read(buf)
if err == io.EOF{break}
if err != nil && err != io.EOF {return false, err}
_, err = hash.Write(buf[:n])
if err != nil {return false, err}
}
hashed := hash.Sum(nil)
//4. 读取承受到的签名值
sr, err := os.Open(dvOutPath + signFile)
if err != nil {return false, err}
defer sr.Close()
srInfo, err := sr.Stat()
if err != nil {return false, err}
srBuf := make([]byte, srInfo.Size())
_, err = sr.Read(srBuf)
if err != nil {return false, err}
//5. 签名认证
verify := publicKeyFromPem.Verify(hashed, srBuf)
return verify, nil
}