keccak算法java实现_ecc算法的代码实现
ecc算法的代码实现
什么是ecc算法
如果你能够坚持看完上⾯的博客,并且能够看懂⾥⾯的内容,我⼗分佩服,因为我实在是没看下去。不过或多或少了解了⼀些基本的概念⽐如椭圆曲线函数并不是说真的就是⼀个函数来⽣成椭圆上的两个点这么简单,函数的⼏何形状也并不真的是⼀个椭圆。(真的就看懂了这么点东西..)所以有机会还是希望多多阅读⼀下⼤神的博客。
有关与go语⾔的ecc包
在go语⾔中crypto/elliptic包是声明椭圆曲线模型的包
注意:对于go语⾔⾃带的ECC函数来说,数字越⼤对应的ECC的公私钥的长度就越长,对应的加密等级就越⾼,当然也就越安全,那么对应的执⾏效率也就会相对降低。
crypto/ecdsa包则是go中⽤于椭圆曲线数字签名的包。
具体实现流程
⼀、⽣成公私钥
⽣成密钥-->将⽣成的私钥进⾏x509序列化为ASN.1标准的DER⼆进制编码--> 构建pem.Block数据块-->pem编码【公钥同理】
⼆、ecdsa私钥⽣成数字签名
读取本地私钥pem⽂件-->pem解析pem数据块-->x509解析der字符串,获得私钥-->计算hash-->ecdsa签名
三、ecdsa签名验证
代码实现
package main
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"crypto/sha256"
"crypto/x509"
"encoding/pem"
"fmt"
"math/big"
"os"
)
// 初始化创建ecc密钥
func generateECDSAKey() {
/
/ ⽣成ecc算法的密钥
privateKey, err := ecdsa.GenerateKey(elliptic.P521(), rand.Reader) if err != nil {
panic(err)
}
// 将私钥本地化,使⽤x509进⾏序列化
java源代码加密privateDerBytes, err := x509.MarshalECPrivateKey(privateKey)
if err != nil {
panic(err)
}
// 再将它转换成pem的格式编码
privatePemBlock := pem.Block{
Type: "Ecc PrivateKey", // 简介使⽤算法类型rsa/ecc
Bytes: privateDerBytes,
}
// 在本地创建pem⽂件
privateFile, err := os.Create("ECDSAPrivateKey.pem")
if err != nil {
}
defer privateFile.Close()
// 进⾏pem编码
err = pem.Encode(privateFile, &privatePemBlock)
if err != nil {
panic(err)
}
// 公钥同理
publicKey := privateKey.PublicKey
publicDerBytes, err := x509.MarshalPKIXPublicKey(&publicKey)
if err != nil {
panic(err)
}
publicPemBlock := pem.Block{
Type: "Ecc PublicKey",
Bytes: publicDerBytes,
}
publicFile, err := os.Create("ECDSAPublicKey.pem")
if err != nil {
panic(err)
}
defer publicFile.Close()
pem.Encode(publicFile, &publicPemBlock)
}
// 私钥签名
func privateKeySignature(data []byte, privateKeyPemFileName string) (rText, sText []byte) { // 读取私钥
privateFile, err := os.Open(privateKeyPemFileName)
if err != nil {
panic(err)
}
defer privateFile.Close()
// 读取⽂件源信息
buffer := make([]byte, fileInfo.Size())
privateFile.Read(buffer)
// pem解码
block, _ := pem.Decode(buffer)
// x509 DER解码
privateKey, err := x509.ParseECPrivateKey(block.Bytes)
if err != nil {
panic(err)
}
// 进⾏签名
r, s, err := ecdsa.Sign(rand.Reader, privateKey, getHash(data))
// 将big的数据转换成[]byte
rText, _ = r.MarshalText()
sText, _ = s.MarshalText()
return
}
// 获取哈希
func getHash(data []byte) []byte {
hash256 := sha256.New()
hash256.Write(data)
return hash256.Sum(nil)
}
// 公钥验证
func publicKeyVerify(data, rText, sText []byte, publicKeyPemFileName string) bool { // 读取公钥
publicFile, err := os.Open(publicKeyPemFileName)
if err != nil {
panic(err)
}
defer publicFile.Close()
buffer := make([]byte, fileInfo.Size())
publicFile.Read(buffer)
block, _ := pem.Decode(buffer)
publicKeyType, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
panic(err)
}
// 获取到publicKey的类型,要进⾏断⾔判断rsa/ecc
publicKey := publicKeyType.(*ecdsa.PublicKey)
// 对[]byte签名数据转换成big数据
var r, s big.Int
r.UnmarshalJSON(rText)
s.UnmarshalJSON(sText)
if !ecdsa.Verify(publicKey, getHash(data), &r, &s) {
return false
} else {
return true
}
}
func main() {
data := []byte("我向某⽤户转账10元")
generateECDSAKey()
rText, sText := privateKeySignature(data, "ECDSAPrivateKey.pem")
fmt.Println(publicKeyVerify(data, rText, sText, "ECDSAPublicKey.pem"))
}
使⽤以太坊的ecc加密算法实现
以太坊的crypto模块
该模块分为两个部分⼀个是实现sha3,⼀个是实现secp256k1(这也是⽐特币中使⽤的签名算法). 需要说明的是secp256k1有两种实现⽅式,⼀种是依赖libsecp256k1,需要cgo,另外⼀种是依赖github/btcsuite/btcd,这是⼀个使⽤go语⾔实现的⽐特币的客户端.
sha3模块
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论