记录一下对一些稍大文件进行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
}