分享
golang[37]-blockchain-验证数据签名
jonson_jackson · · 1670 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
验证数据签名
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package main
import (
"crypto/ecdsa"
"crypto/rand"
"crypto/sha256"
"crypto/elliptic"
"log"
"fmt"
"math/big"
)
//生成私钥和公钥,生成的私钥为结构体ecdsa.PrivateKey的指针
//type PrivateKey struct {
// PublicKey
// D *big.Int
//}
func newKeyPair3() (ecdsa.PrivateKey, []byte) {
//生成secp256k1椭圆曲线
curve := elliptic.P256()
//产生的是一个结构体指针,结构体类型为ecdsa.PrivateKey
private, err := ecdsa.GenerateKey(curve, rand.Reader)
if err != nil {
log.Panic(err)
}
//x坐标与y坐标拼接在一起,生成公钥
pubKey := append(private.PublicKey.X.Bytes(), private.PublicKey.Y.Bytes()...)
return *private, pubKey
}
func main(){
//生成公钥要私钥
privKey,pubkey := newKeyPair3()
//生成某一串信息的哈希值,需要签名的数据
hash := sha256.Sum256([]byte("跟着jonson老师实战区块链\n"))
//根据私钥和信息的哈希值生成数字签名的r和s,r和s拼接在一起就是数字签名,在这里省略了拼接的步骤,欲查看,请看3.数字签名
r, s, _ := ecdsa.Sign(rand.Reader, &privKey, hash[:])
//fmt.Printf("%v\n", *r)
//fmt.Printf("%v\n", *s)
////生成secp256k1椭圆曲线
curve := elliptic.P256()
//公钥的长度
keyLen := len(pubkey)
//前一半为x轴坐标,后一半为y轴坐标
x := big.Int{}
y := big.Int{}
x.SetBytes(pubkey[:(keyLen / 2)])
y.SetBytes(pubkey[(keyLen / 2):])
//rawPubKey为生成PublicKey结构体,作为下面ecdsa.Verify的参数
//type PublicKey struct {
// elliptic.Curve
// X, Y * big.Int }
//公钥
rawPubKey := ecdsa.PublicKey{curve, &x, &y}
//根据交易哈希、公钥、数字签名验证成功。ecdsa.Verify func Verify(pub *PublicKey, hash []byte, r *big.Int, s *big.Int) bool
if ecdsa.Verify(&rawPubKey, hash[:], r, s) == false {
fmt.Printf("%s\n", "验证失败")
}else{
fmt.Printf("%s\n", "验证成功")
}
//用其他的信息哈希——证明验证失败
hash2 := sha256.Sum256([]byte("我要给你200愿\n"))
if ecdsa.Verify(&rawPubKey, hash2[:], r, s) == false {
fmt.Printf("%s\n", "验证失败")
}else{
fmt.Printf("%s\n", "验证成功")
}
}
本文链接: https://dreamerjonson.com/2018/12/07/golang-37-blockchain-verifysign/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!
image.png
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信1670 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
验证数据签名
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package main
import (
"crypto/ecdsa"
"crypto/rand"
"crypto/sha256"
"crypto/elliptic"
"log"
"fmt"
"math/big"
)
//生成私钥和公钥,生成的私钥为结构体ecdsa.PrivateKey的指针
//type PrivateKey struct {
// PublicKey
// D *big.Int
//}
func newKeyPair3() (ecdsa.PrivateKey, []byte) {
//生成secp256k1椭圆曲线
curve := elliptic.P256()
//产生的是一个结构体指针,结构体类型为ecdsa.PrivateKey
private, err := ecdsa.GenerateKey(curve, rand.Reader)
if err != nil {
log.Panic(err)
}
//x坐标与y坐标拼接在一起,生成公钥
pubKey := append(private.PublicKey.X.Bytes(), private.PublicKey.Y.Bytes()...)
return *private, pubKey
}
func main(){
//生成公钥要私钥
privKey,pubkey := newKeyPair3()
//生成某一串信息的哈希值,需要签名的数据
hash := sha256.Sum256([]byte("跟着jonson老师实战区块链\n"))
//根据私钥和信息的哈希值生成数字签名的r和s,r和s拼接在一起就是数字签名,在这里省略了拼接的步骤,欲查看,请看3.数字签名
r, s, _ := ecdsa.Sign(rand.Reader, &privKey, hash[:])
//fmt.Printf("%v\n", *r)
//fmt.Printf("%v\n", *s)
////生成secp256k1椭圆曲线
curve := elliptic.P256()
//公钥的长度
keyLen := len(pubkey)
//前一半为x轴坐标,后一半为y轴坐标
x := big.Int{}
y := big.Int{}
x.SetBytes(pubkey[:(keyLen / 2)])
y.SetBytes(pubkey[(keyLen / 2):])
//rawPubKey为生成PublicKey结构体,作为下面ecdsa.Verify的参数
//type PublicKey struct {
// elliptic.Curve
// X, Y * big.Int }
//公钥
rawPubKey := ecdsa.PublicKey{curve, &x, &y}
//根据交易哈希、公钥、数字签名验证成功。ecdsa.Verify func Verify(pub *PublicKey, hash []byte, r *big.Int, s *big.Int) bool
if ecdsa.Verify(&rawPubKey, hash[:], r, s) == false {
fmt.Printf("%s\n", "验证失败")
}else{
fmt.Printf("%s\n", "验证成功")
}
//用其他的信息哈希——证明验证失败
hash2 := sha256.Sum256([]byte("我要给你200愿\n"))
if ecdsa.Verify(&rawPubKey, hash2[:], r, s) == false {
fmt.Printf("%s\n", "验证失败")
}else{
fmt.Printf("%s\n", "验证成功")
}
}
本文链接: https://dreamerjonson.com/2018/12/07/golang-37-blockchain-verifysign/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!
image.png