go語言中橢圓曲線密碼編譯演算法的使用

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

橢圓曲線密碼編譯演算法,使用golang的實現!
最近在看一些關於比特幣的東西,裡邊有個橢圓曲線密碼編譯演算法,查了下,感覺很不錯!

與經典的RSA,DSA等公開金鑰密碼體制相比,橢圓密碼體制有以下優點:
1.安全性高:有研究表示160位的橢圓密鑰與1024位的RSA密鑰安全性相同。
2.處理速度快:在私密金鑰的加密解密速度上,ecc演算法比RSA、DSA速度更快。
3.儲存空間佔用小。
4.頻寬要求低.

橢圓曲線密碼體制是目前已知的公開金鑰體制中,對每位元所提供加密強度最高的一種體制。解橢圓曲線上的離散對數問題的最好演算法是Pollard rho方法,其時間複雜度為,是完全指數階的。其中n為等式(2)中m的二進位表示的位元。當n=234, 約為2117,需要1.6x1023 MIPS 年的時間。而我們熟知的RSA所利用的是大整數分解的困難問題,目前對於一般情況下的因數分解的最好演算法的時間複雜度是子指數階的,當n=2048時,需要2x1020MIPS年的時間。也就是說當RSA的密鑰使用2048位時,ECC的密鑰使用234位所獲得的安全強度還高出許多。它們之間的密鑰長度卻相差達9倍,當ECC的密鑰更大時它們之間差距將更大。更ECC密鑰短的優點是非常明顯的,隨加密強度的提高,密鑰長度變化不大。

第六屆國際密碼學會議對應用於公開金鑰密碼系統的密碼編譯演算法推薦了兩種:基於大整數因子分解問題(IFP)的RSA演算法和基於橢圓曲線上離散對數計算問題(ECDLP)的ECC演算法。RSA演算法的特點之一是數學原理簡單、在工程應用中比較易於實現,但它的單位安全強度相對較低。目前用國際上公認的對於RSA演算法最有效攻擊方法--一般數域篩(NFS)方法去破譯和攻擊RSA演算法,它的破譯或求解難度是亞指數級的。ECC演算法的數學理論非常深奧和複雜,在工程應用中比較難於實現,但它的單位安全強度相對較高。用國際上公認的對於ECC演算法最有效攻擊方法--Pollard rho方法去破譯和攻擊ECC演算法,它的破譯或求解難度基本上是指數級的。正是由於RSA演算法和ECC演算法這一明顯不同,使得ECC演算法的單位安全強度高於RSA演算法,也就是說,要達到同樣的安全強度,ECC演算法所需的密鑰長度遠比RSA演算法低(見表1和圖1)。這就有效地解決了為了提高安全強度必須增加密鑰長度所帶來的工程實現難度的問題.

下面附帶的代碼,原本是用於網站使用者密碼的加密和校正的,當然也可以用於其他地方!

import (    "bytes"    "compress/gzip"    "crypto/ecdsa"    "crypto/elliptic"    "encoding/hex"    "errors"    "fmt"    "math/big"    "strings"    "github.com/astaxie/beego"    "github.com/astaxie/beego/config")var (    runMode  string    cfg      config.Configer //全域設定檔    randKey  string    randSign string    prk      *ecdsa.PrivateKey    puk      ecdsa.PublicKey    curve    elliptic.Curve)func init() {    var err error    cfg, err = config.NewConfig("ini", "conf/app.conf")    if err != nil {        return    }    randSign = cfg.String("RandSign")    if len(randSign) == 0 {        return    }    randKey = cfg.String("randKey")    if len(randKey) == 0 {        return    }    beego.Trace("Rand Key =", randKey)    beego.Trace("Rand Sign =", randSign)    //根據rand長度,使用相應的加密橢圓參數    length := len([]byte(randKey))    if length < 224/8 {        beego.Error("The length of Rand Key is too small, Crypt init failed, Please reset it again !")        return    }    if length >= 521/8+8 {        beego.Notice("Rand length =", length, "Using 521 level !")        curve = elliptic.P521()    } else if length >= 384/8+8 {        beego.Notice("Rand length =", length, "Using 384 level !")        curve = elliptic.P384()    } else if length >= 256/8+8 {        beego.Notice("Rand length =", length, "Using 256 level !")        curve = elliptic.P256()    } else if length >= 224/8+8 {        beego.Notice("Rand length =", length, "Using 244 level !")        curve = elliptic.P224()    }    //建立密匙對    prk, err = ecdsa.GenerateKey(curve, strings.NewReader(randKey))    if err != nil {        beego.Error("Crypt init fail,", err, " need = ", curve.Params().BitSize)        return    }    puk = prk.PublicKey}//Encrypt 對Text進行加密,返回加密後的位元組流func Sign(text string) (string, error) {    r, s, err := ecdsa.Sign(strings.NewReader(randSign), prk, []byte(text))    if err != nil {        return "", err    }    rt, err := r.MarshalText()    if err != nil {        return "", err    }    st, err := s.MarshalText()    if err != nil {        return "", err    }    var b bytes.Buffer    w := gzip.NewWriter(&b)    defer w.Close()    _, err = w.Write([]byte(string(rt) + "+" + string(st)))    if err != nil {        return "", err    }    w.Flush()    return hex.EncodeToString(b.Bytes()), nil}//解密func getSign(text, byterun []byte) (rint, sint big.Int, err error) {    r, err := gzip.NewReader(bytes.NewBuffer(byterun))    if err != nil {        err = errors.New("decode error," + err.Error())        return    }    defer r.Close()    buf := make([]byte, 1024)    count, err := r.Read(buf)    if err != nil {        fmt.Println("decode =", err)        err = errors.New("decode read error," + err.Error())        return    }    rs := strings.Split(string(buf[:count]), "+")    if len(rs) != 2 {        err = errors.New("decode fail")        return    }    err = rint.UnmarshalText([]byte(rs[0]))    if err != nil {        err = errors.New("decrypt rint fail, " + err.Error())        return    }    err = sint.UnmarshalText([]byte(rs[1]))    if err != nil {        err = errors.New("decrypt sint fail, " + err.Error())        return    }    return}//Verify 對密文和明文進行匹配校正func Verify(text, passwd string) (bool, error) {    byterun, err := hex.DecodeString(passwd)    if err != nil {        return false, err    }    rint, sint, err := getSign([]byte(text), byterun)    if err != nil {        return false, err    }    result := ecdsa.Verify(&puk, []byte(text), &rint, &sint)    return result, nil}

原文轉載自:https://www.urecv.com/archives/135

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.