记录一下对一些稍大文件进行RSA签名验签的实现,这里只列出了外围代码,其余不波及的代码或者有任何疑难能够查看我之前写的明码技术专题博客
/*函数名: rsaSign rsa 签名算法实现对文件的签名参 数: filePathIn , 待签名文件 priKey , 签名私钥文件返回值: 签名后文件名 错误信息创立工夫及创建者: 2021-06-15 Yuan_sr*/func rsaSign (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对数据解码,失去pem.Block构造体变量 block, _ := pem.Decode(buf) //4.x509将数据解析成私钥构造体失去私钥 privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) if err != nil { return "", err } //5.创立一个哈希对象 hash := sha256.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) signText, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed) if err != nil { return "", err } outFile, err := os.Create(signFileName) if err != nil { return "", err } defer outFile.Close() outFile.Write(signText) return signFileName, nil}/*函数名: rsaVerify rsa 验签算法实现对文件的验签参 数: encFile , 密文文件 signFile , 签名文件 pubKey , 验签公钥返回值: 验签后果 错误信息创立工夫及创建者: 2021-06-15 Yuan_sr*/func rsaVerify(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解码失去pem.block构造体变量 block, _ := pem.Decode(buf) //3.应用x509对pem.block中的变量进行解析失去一个公钥接口 pubKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes) if err != nil { return false, err } //4.进行类型断言失去公钥构造体 publicKey := pubKeyInterface.(*rsa.PublicKey) //5.进行哈西运算 hash := sha256.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) //6.读取承受到的签名值 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 } //7.签名认证 err = rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hashed, srBuf) if err != nil { return false, err } return true, nil}