持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
接上文:
签名过程
1、输入明文
可以自定义输入消息
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的准确性,使用加密网站工具查看是否为一样
2、生成随机数k
使用math/rand包(和私钥x一样) k<q
rand.Seed(time.Now().UnixNano())
k :=big.NewInt( int64(rand.Intn(5000))) //在0~4999内随机
fmt.Println("随机数k:",k)
3、生成参数r
//使用幂运算
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
//将密文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 )。
验证过程
/*
* 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)
}
看一下我的文件夹路径
若需要代码可加微信:Y943711797