golang实现RSA 私钥加密

package main


import (
        "crypto/rsa"
        "crypto/x509"
        "encoding/pem"
        "fmt"
        "io/ioutil"
        "math/big"
        "os/exec"
)


func PrivateEncrypt(priv *rsa.PrivateKey, data []byte) (enc []byte, err error) {


        k := (priv.N.BitLen() + 7) / 8
        tLen := len(data)
        em := make([]byte, k)
        em[1] = 1
        for i := 2; i < k-tLen-1; i++ {
                em[i] = 0xff
        }
        copy(em[k-tLen:k], data)
        c := new(big.Int).SetBytes(em)
        if c.Cmp(priv.N) > 0 {
                err = nil
                return
        }
        var m *big.Int
        var ir *big.Int
        if priv.Precomputed.Dp == nil {
                m = new(big.Int).Exp(c, priv.D, priv.N)
        } else {
                // We have the precalculated values needed for the CRT.
                m = new(big.Int).Exp(c, priv.Precomputed.Dp, priv.Primes[0])
                m2 := new(big.Int).Exp(c, priv.Precomputed.Dq, priv.Primes[1])
                m.Sub(m, m2)
                if m.Sign() < 0 {
                        m.Add(m, priv.Primes[0])
                }
                m.Mul(m, priv.Precomputed.Qinv)
                m.Mod(m, priv.Primes[0])
                m.Mul(m, priv.Primes[1])
                m.Add(m, m2)


                for i, values := range priv.Precomputed.CRTValues {
                        prime := priv.Primes[2+i]
                        m2.Exp(c, values.Exp, prime)
                        m2.Sub(m2, m)
                        m2.Mul(m2, values.Coeff)
                        m2.Mod(m2, prime)
                        if m2.Sign() < 0 {
                                m2.Add(m2, prime)
                        }
                        m2.Mul(m2, values.R)
                        m.Add(m, m2)
                }
        }


        if ir != nil {
                // Unblind.
                m.Mul(m, ir)
                m.Mod(m, priv.N)
        }
        enc = m.Bytes()
        return
}


func main() {
        // o is output from openssl
        o, _ := exec.Command("openssl", "rsautl", "-sign", "-inkey", "t.key", "-in", "in.txt").Output()


        // t.key is private keyfile
        // in.txt is what to encode
        kt, _ := ioutil.ReadFile("t.key")
        e, _ := ioutil.ReadFile("in.txt")
        block, _ := pem.Decode(kt)
        privkey, _ := x509.ParsePKCS1PrivateKey(block.Bytes)
        encData, _ := PrivateEncrypt(privkey, e)
        fmt.Println(encData)
        fmt.Println(o)
        fmt.Println(string(o) == string(encData))
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值