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

Posted Yuan_sr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了密码技术应用--RSA文件签名验签相关的知识,希望对你有一定的参考价值。

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

以上是关于密码技术应用--RSA文件签名验签的主要内容,如果未能解决你的问题,请参考以下文章

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

RSA后台签名前台验签的应用(前台采用jsrsasign库)

RSA加密/解密和签名/验签过程理解

Java实现RSA 加密解密签名验签的工具类复制粘贴直接用

iOS小技能:RSA签名验签加密解密的原理

iOS小技能:RSA签名验签加密解密的原理