密码技术应用--RSA文件签名验签
【密码技术应用--RSA文件签名验签】记录一下对一些稍大文件进行RSA签名验签的实现,这里只列出了核心代码,其他不涉及的代码或者有任何疑问可以查看我之前写的密码技术专题博客
/*
函数名:rsaSign
rsa 签名算法实现对文件的签名
参 数:
filePathIn ,待签名文件
priKey ,签名私钥文件
返回值:
签名后文件名
错误信息
创建时间及创建者:
2021-06-15Yuan_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-15Yuan_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
}
推荐阅读
- 8、Flask构建弹幕微电影网站-搭建后台页面-密码修改、主页控制面板
- “终南秘境”——《终南山密码》
- crontab无法查看,原来是密码过期了
- 实现财富自由、让钱来找你的密码……
- “不可能任务”背后,有关键人物串起的惊天大阴谋。|“不可能任务”背后,有关键人物串起的惊天大阴谋。|《清明上河图密码3》
- 带着觉知生活,人生才开始变得有深度|带着觉知生活,人生才开始变得有深度 快乐密码空间
- linux服务器间建立免密码登录
- 寒假社会实践|寒假社会实践|探寻双墩密码,传承创新文化
- 生命密码426
- 斯坦福大学密码学公开课——分组加密的应用(一次性密钥)