DSA
DSA 是專業(yè)用于數(shù)字簽名和驗(yàn)簽观游,并且只有這個作用, 不能用于加密和解密稽屏。
在安全性上奖慌,DSA和RSA差不多抛虫,但是速度比RSA快很多。
DSA簽名和驗(yàn)簽
func main() {
//設(shè)置私鑰使用的參數(shù)
var param dsa.Parameters
dsa.GenerateParameters(¶m, rand.Reader, dsa.L1024N160)
//創(chuàng)建私鑰
var pri dsa.PrivateKey
pri.Parameters = param
dsa.GenerateKey(&pri, rand.Reader)
//生成公鑰
pub := pri.PublicKey
//簽名
message := []byte("hello")
r,s,_ := dsa.Sign(rand.Reader, &pri, message)
//驗(yàn)證
if dsa.Verify(&pub, message, r, s){
fmt.Println("驗(yàn)簽成功")
}
}
ECC
橢圓曲線加密算法简僧,即:Elliptic Curve Cryptography建椰,簡稱ECC,是基于橢圓曲線數(shù)學(xué)理論實(shí)現(xiàn)的一種非對稱加密算法岛马。相比RSA棉姐,ECC優(yōu)勢是可以使用更短的密鑰屠列,來實(shí)現(xiàn)與RSA相當(dāng)或更高的安全。
橢圓曲線在密碼學(xué)中的使用伞矩,是1985年由Neal Koblitz和Victor Miller分別獨(dú)立提出的笛洛。
比特幣就是用ECC來做簽名和驗(yàn)簽。
優(yōu)點(diǎn)
- 安全性高乃坤。160位ECC加密安全性相當(dāng)于1024位RSA加密苛让,210位ECC加密安全性相當(dāng)于2048位RSA加密。
- 計算量小,處理速度快,在私鑰的處理速度上(解密和簽名),ECC遠(yuǎn)比RSA侥袜、DSA快得多
- 存儲空間占用小,ECC的密鑰尺寸和系統(tǒng)參數(shù)與RSA蝌诡、DSA相比要小得多, 所以占用的存儲進(jìn)空間小得多
- 帶寬要求低使得ECC具有廣泛得應(yīng)用前景
橢圓曲線
一般情況下,橢圓曲線可用下列方程式來表示枫吧,其中a,b,c,d為系數(shù)。
E:y2=ax3+ bx2+cx+d
例如宇色,當(dāng)a=1,b=0,c=-2,d=4時,所得到的橢圓曲線為:
E:y2=x3-2x+4
該橢圓曲線E的圖像如圖X-1所示,可以看出根本就不是橢圓形镀层。
ECC簽名和驗(yàn)簽
func main() {
message := []byte("hello")
//設(shè)置生成的私鑰為256位
privatekey,_ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
//創(chuàng)建公鑰
publicKey := privatekey.PublicKey
//hash散列明文
digest := sha256.Sum256(message)
//用私鑰簽名
r,s,_:= ecdsa.Sign(rand.Reader,privatekey, digest[:])
//設(shè)置私鑰的參數(shù)類型
param := privatekey.Curve.Params()
//獲取私鑰的長度(字節(jié))
curveOrderBytes:=param.P.BitLen()/8
//獲得簽名返回的字節(jié)
rByte,sByte := r.Bytes(), s.Bytes()
//創(chuàng)建數(shù)組合并字節(jié)
signature := make([]byte,curveOrderBytes*2)
copy(signature[:len(rByte)], rByte)
copy(signature[len(sByte):], sByte)
//現(xiàn)在signature中就存放了完整的簽名的結(jié)果
//驗(yàn)簽
digest = sha256.Sum256(message)
//獲得公鑰的字節(jié)長度
curveOrderBytes= publicKey.Curve.Params().P.BitLen()/8
//創(chuàng)建大整數(shù)類型保存rbyte,sbyte
r,s = new(big.Int),new(big.Int)
r.SetBytes(signature[:curveOrderBytes])
s.SetBytes(signature[curveOrderBytes:])
//開始認(rèn)證
e:=ecdsa.Verify(&publicKey,digest[:],r,s)
if e== true {
fmt.Println("驗(yàn)簽成功")
}
}