加密算法
实验目的
- 理解非对称加密算法
- 理解椭圆曲线算法ECC
- 实现比特币上的椭圆曲线secp256k1算法
ECC算法流程
ECC算法中,陷门函数是定义在有限域上的二元三次曲线y^2^=x^3^+ax+b上的点所组成的阿贝尔群。
公钥:点Q
私钥:大数k
ECC算法是有限域Fp满足公式:Q=kP。
签名过程:
取一个新的随机数k,令$k*G\equiv R\ mod \ N$
计算S:
- 返回签名:signature(s,r)
签名的数字为(s,r)
验签过程:
- 计算u,v
- 计算uG+vP
- 判断(uG+vp).x是否和r模N同余,如果是,则签名成功
实验内容
ECC签名
func (ecc *MyECC) Sign(msg []byte, secKey *big.Int) (*Signature, error) {
k,err :=newRand()
if(err!=nil){
return nil,err
}
R := Multi(G,k)
r:=R.X
r=r.Mod(r,N)
z:=crypto.Keccak256(msg)
z_i := new(big.Int).SetBytes(z)
s:=new(big.Int).Mul(new(big.Int).Add(z_i,new(big.Int).Mul(r,secKey)),Inv(k,N))
s=s.Mod(s,N)
sig:=&Signature{s,r}
return sig,nil
}
ECC验签
func (ecc *MyECC) VerifySignature(msg []byte, signature *Signature, pubkey *Point) bool {
s:=signature.s
r:=signature.r
z:=crypto.Keccak256(msg)
z_i := new(big.Int).SetBytes(z)
s_inv:=Inv(s,N)
s_inv=s_inv.Mod(s_inv,N)
u:=new(big.Int).Mul(z_i,s_inv)
u=u.Mod(u,N)
v:=new(big.Int).Mul(r,s_inv)
v=v.Mod(v,N)
ans:=Add(Multi(G,u),Multi(pubkey,v)).X
ans=ans.Mod(ans,N)
return ans.Cmp(r)==0
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 SN1987A!
评论