https://blog.csdn.net/wangjavafans/article/details/79962832
简单golang的rsa实现
RSA分为以下几步
- 生成公私钥
- 加密
- 解密
生产公私钥
公钥{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
禁止转载,谢谢!