Go語(yǔ)言使用橢圓曲線進(jìn)行數(shù)字簽名

package main

import (
    "crypto/ecdsa"
    "crypto/elliptic"
    "crypto/rand"
    "crypto/sha1"
    "crypto/x509"
    "encoding/pem"
    "fmt"
    "math/big"
    "os"
)

func main() {
    GenerateEccKey()
    src := []byte("橢圓曲線進(jìn)行數(shù)字簽名")
    rText,sText := EccSignature(src,"eccPrivate.pem")
    bl := EccVerify(src,rText,sText,"eccPublic.pem")
    fmt.Println(bl)
}

// 生成密鑰對(duì)
func GenerateEccKey() {
    // --------私鑰寫入磁盤--------
    // 1 使用ecdsa生成密鑰對(duì)
    privateKey,err := ecdsa.GenerateKey(elliptic.P521(),rand.Reader)
    if err != nil {
        panic(err)
    }
    // 2 使用x509將私鑰進(jìn)行序列化
    derText,err := x509.MarshalECPrivateKey(privateKey)
    if err != nil {
        panic(err)
    }
    // 3 將序列化后的字符串放入pem.Block結(jié)構(gòu)體中
    block := pem.Block{
        Type:"ecdsa private key",
        Bytes:derText,
    }
    // 4 使用pem編碼
    file,err := os.Create("eccPrivate.pem")
    if err != nil {
        panic(err)
    }
    pem.Encode(file,&block)
    file.Close()

    // --------公鑰寫入磁盤--------
    // 1 從私鑰中獲取公鑰
    publicKey := privateKey.PublicKey
    // 2 x509序列化公鑰
    derText,err = x509.MarshalPKIXPublicKey(&publicKey)
    if err != nil {
        panic(err)
    }
    // 3 將序列化后的字符串放入pem.Block 中
    block = pem.Block{
        Type:"ecdsa public key",
        Bytes:derText,
    }
    // 4 使用pem編碼
    file,err = os.Create("eccPublic.pem")
    if err != nil {
        panic(err)
    }
    pem.Encode(file,&block)
    file.Close()
}

// ecdsa 簽名
func EccSignature(plainText []byte,privName string) (rText,sText []byte) {
    // 1 打開私鑰將內(nèi)容讀取出來(lái)
    file,err := os.Open(privName)
    if err != nil {
        panic(err)
    }
    fileInfo,err := file.Stat()
    if err != nil {
        panic(err)
    }
    buf := make([]byte,fileInfo.Size())
    file.Read(buf)
    file.Close()
    // 2 pem解碼
    block,_ := pem.Decode(buf)
    // 3 x509解析
    privateKey,err := x509.ParseECPrivateKey(block.Bytes)
    if err != nil {
        panic(err)
    }
    // 4 對(duì)原始數(shù)據(jù)進(jìn)行hash運(yùn)算得到散列值
    hashText := sha1.Sum(plainText)
    // 5 進(jìn)行數(shù)據(jù)簽名
    r,s,err := ecdsa.Sign(rand.Reader,privateKey,hashText[:])
    if err != nil {
        panic(err)
    }
    // 6 對(duì)r贾惦,s內(nèi)存中的數(shù)據(jù)進(jìn)行格式化
    rText,err = r.MarshalText()
    if err != nil {
        panic(err)
    }
    sText,err = s.MarshalText()
    if err != nil {
        panic(err)
    }
    return
}

// ecdsa簽名認(rèn)證
func EccVerify(plainText,rText,sText []byte,pubFile string) bool {
    // 1 打開公鑰文件逝薪,將內(nèi)容讀取出來(lái)
    file,err := os.Open(pubFile)
    if err != nil {
        panic(err)
    }
    fileInfo,err := file.Stat()
    if err != nil {
        panic(err)
    }
    buf := make([]byte,fileInfo.Size())
    file.Read(buf)
    file.Close()
    // 2 pem解碼
    block,_ := pem.Decode(buf)
    // 3 x509解析
    pubInterface,err := x509.ParsePKIXPublicKey(block.Bytes)
    if err != nil {
        panic(err)
    }
    // 4 類型斷言獲取公鑰
    publicKey := pubInterface.(*ecdsa.PublicKey)
    // 5 對(duì)原始數(shù)據(jù)進(jìn)行hash運(yùn)算得到散列值
    hashText := sha1.Sum(plainText)
    // 6 簽名認(rèn)證
    // 將rText,sText 轉(zhuǎn)換成 int
    var r,s big.Int
    r.UnmarshalText(rText)
    s.UnmarshalText(sText)
    bl := ecdsa.Verify(publicKey,hashText[:],&r,&s)
    return bl
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妆丘,一起剝皮案震驚了整個(gè)濱河市底洗,隨后出現(xiàn)的幾起案子表窘,更是在濱河造成了極大的恐慌苛秕,老刑警劉巖颖杏,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姜凄,死亡現(xiàn)場(chǎng)離奇詭異政溃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)态秧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門董虱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人屿聋,你說(shuō)我怎么就攤上這事空扎。” “怎么了润讥?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵转锈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我楚殿,道長(zhǎng)撮慨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任脆粥,我火速辦了婚禮砌溺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘变隔。我一直安慰自己规伐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布匣缘。 她就那樣靜靜地躺著猖闪,像睡著了一般鲜棠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上培慌,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天豁陆,我揣著相機(jī)與錄音,去河邊找鬼吵护。 笑死盒音,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的馅而。 我是一名探鬼主播祥诽,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瓮恭!你這毒婦竟也來(lái)了原押?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤偎血,失蹤者是張志新(化名)和其女友劉穎诸衔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颇玷,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笨农,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帖渠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谒亦。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖空郊,靈堂內(nèi)的尸體忽然破棺而出份招,到底是詐尸還是另有隱情,我是刑警寧澤狞甚,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布锁摔,位于F島的核電站,受9級(jí)特大地震影響哼审,放射性物質(zhì)發(fā)生泄漏谐腰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一涩盾、第九天 我趴在偏房一處隱蔽的房頂上張望十气。 院中可真熱鬧,春花似錦春霍、人聲如沸砸西。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芹枷。三九已至竟闪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杖狼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工妖爷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝶涩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓絮识,卻偏偏與公主長(zhǎng)得像绿聘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子次舌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容