go实现DSA签名算法【3-签名过程和验证过程】

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

接上文:

go实现DSA签名算法【2-密钥生成】

go实现DSA签名算法【1-准备阶段】

签名过程

1、输入明文

可以自定义输入消息 go var n,num,M string fmt.Println("请输入姓名") //输入姓名 fmt.Scanf("%s",&n) fmt.Println("请输入学号") //输入学号 fmt.Scanf("%s",&num) //字符串拼接 M=n+num //使用md5加密,调用DSA文件夹中的MD5函数。 e:=DSA.Md5(M) fmt.Println("明文",M) fmt.Println("密文",e) 为了查看md5的准确性,使用加密网站工具查看是否为一样

image.png

2、生成随机数k

使用math/rand包(和私钥x一样) k

go rand.Seed(time.Now().UnixNano()) k :=big.NewInt( int64(rand.Intn(5000))) //在0~4999内随机 fmt.Println("随机数k:",k)

3、生成参数r

go //使用幂运算 r1:=g.Exp(g,k,nil) //对p取余 r2:=r1.Mod(r1,p) //对q取余 r:=r2.Mod(r2,q) //打印 fmt.Println("r:",r)

4、生成s

  s = ( k^(-1) (H(m) + xr)) mod q go //将密文e转换为十进制的int64类型 hm1, _ := strconv.ParseInt(e, 10, 64) //将int64转换为big.NewInt hm:=big.NewInt(hm1) //打印 fmt.Printf("hm:%x\n",hm) //k的负一次方 s1:=k.Exp(k,big.NewInt(-1),nil) //加法 s2:=hm.Add(hm,x.Mul(x,r)) //乘法 s3:=s1.Mul(s1,s2) //取余 s:=s3.Mod(s3,q) 签名结果是( m, r, s )。

验证过程

```go /* * w = s^(-1)mod q / //幂运算 w1:=s.Exp(s,big.NewInt(-1),nil) //取余 w:=w1.Mod(w1,q) / * u1 = ( H( m ) * w ) mod q / //乘法 u11:=hm.Mul(hm,w) //取余 u1:=u11.Mod(u11,q) / *  u2 = ( r * w ) mod q */ //乘法 u22:=hm.Mul(r,w) //取余 u2:=u22.Mod(u22,q)

/* * v = (( g^u1 * y^u2 ) mod p ) mod q */ v1:=g.Exp(g,u1,nil) v2:=y.Exp(y,u2,nil) v3:=v1.Mul(v1,v2) v4:=v3.Mod(v3,p) v:=v4.Mod(v4,q)

if v==r{ fmt.Println("验证成功v:",v) }else{ fmt.Println("验证失败v:",v,"r",r) } ``` 看一下我的文件夹路径

image.png

若需要代码可加微信:Y943711797

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值