密码技术应用--RSA文件签名验签

18 篇文章 6 订阅

记录一下对一些稍大文件进行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
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值