RSA算法golang实现lite版本

https://blog.csdn.net/wangjavafans/article/details/79962832

简单golang的rsa实现


RSA分为以下几步

  • 生成公私钥
  • 加密
  • 解密

cmd-markdown-logo


生产公私钥

公钥{e,n}用来加密使用,私钥{d,n}用来解密使用。

1. 生成一个质数

golang自带随机生成质数的一些工具方法。

<span style="color:#000000"><code class="language-go"><span style="color:#000088">func</span> NewPrime(c <span style="color:#4f4f4f">int</span>) *big.Int {
    p1, err := rand.Prime(rand.Reader,c)
    <span style="color:#000088">if</span> err != <span style="color:#009900">nil</span> {
        fmt.Println(<span style="color:#009900">"error:"</span>, err)
        <span style="color:#000088">return</span> <span style="color:#009900">nil</span>
    }
    <span style="color:#000088">return</span> p1

}</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2. 计算N,N是两个随机质数的乘积

 

N=P1∗P2N=P1∗P2

 

3. 计算E,E是一个奇数,不同与φ(N)的公因数(K为随机数)

 

DE=1modNDE=1modN

DE=K∗φ(N)+1DE=K∗φ(N)+1

E=(K∗φ(N)+1)/DE=(K∗φ(N)+1)/D

所以需满足

0=(K∗φ(N)+1)modE0=(K∗φ(N)+1)modE

 

<span style="color:#000000"><code class="language-go"><span style="color:#000088">func</span> RandExponent(q *big.Int,k <span style="color:#4f4f4f">int</span>,c <span style="color:#4f4f4f">int64</span>) *big.Int{
    c =<span style="color:#006666"> 1</span>
    b := <span style="color:#4f4f4f">make</span>([]<span style="color:#4f4f4f">byte</span>, c)
    rand.Read(b)
    e := <span style="color:#4f4f4f">new</span>(big.Int).SetBytes(b)
    r := <span style="color:#4f4f4f">new</span>(big.Int).GCD(<span style="color:#009900">nil</span>, <span style="color:#009900">nil</span>, e, q)
    t := time.Now();
    <span style="color:#000088">for</span> <span style="color:#009900">true</span> {
        <span style="color:#000088">if</span> r.Int64() ==<span style="color:#006666"> 1</span> && e.Int64() !=<span style="color:#006666"> 1</span>{
            mod :=  <span style="color:#4f4f4f">new</span>(big.Int).SetBytes(q.Bytes())
            mod.Mul(mod,big.NewInt(<span style="color:#4f4f4f">int64</span>(k)) )
            mod.Add(mod,big.NewInt(<span style="color:#006666">(1</span>)))
            mod.Mod(mod,e)
            <span style="color:#000088">if</span> mod.Int64() ==<span style="color:#006666"> 0</span> {
                fmt.Printf(<span style="color:#009900">"e = %v  speed %v \n"</span>,e,time.Now().Sub(t))
                <span style="color:#000088">return</span> e
            }
        }
        b = <span style="color:#4f4f4f">make</span>([]<span style="color:#4f4f4f">byte</span>, c)
        rand.Read(b)
        e = <span style="color:#4f4f4f">new</span>(big.Int).SetBytes(b)
        r = <span style="color:#4f4f4f">new</span>(big.Int).GCD(<span style="color:#009900">nil</span>, <span style="color:#009900">nil</span>, e, q)

    }
    <span style="color:#000088">return</span> <span style="color:#009900">nil</span>
}</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

4. 计算D,E计算出来再算D很简单了

 

D=(K∗φ(N)+1)/ED=(K∗φ(N)+1)/E

 

<span style="color:#000000"><code class="language-go"> d := big.NewInt<span style="color:#006666">(1</span>).Mul(k,q) <span style="color:#880000">//q为φ(N)</span>
 d.Add(d,big.NewInt<span style="color:#006666">(1</span>))
 d.Div(d,e)</code></span>
  • 1
  • 2
  • 3

由上面4步,公私钥生成完成

加密

 

c=mEmodNc=mEmodN

 

<span style="color:#000000"><code class="language-go"> c := big.NewInt<span style="color:#006666">(0</span>).SetBytes([]<span style="color:#4f4f4f">byte</span>(m))
 BigPow(c,e)
 c.Mod(c,n)</code></span>
  • 1
  • 2
  • 3

解密

 

m=cDmodNm=cDmodN

 

<span style="color:#000000"><code class="language-go">s := big.NewInt<span style="color:#006666">(0</span>).SetBytes(c.Bytes())
BigPow(s,d)
s.Mod(s,n)</code></span>
  • 1
  • 2
  • 3

github地址:https://github.com/davewang/go-rsa-lite.git 


禁止转载,谢谢!

猜你喜欢

转载自blog.csdn.net/love_hot_girl/article/details/81164871