乐趣区

关于golang:密码技术应用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
}
退出移动版