func ReadBytes(path string) ([]byte, error) {
公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出杞縣免費做網(wǎng)站回饋大家。
f, err := os.Open(path)
if err != nil {
return nil, err
}
defer f.Close()
return ioutil.ReadAll(f)
}
func RSAEncrypt(data []byte) ([]byte, error) {
publicKey, err := ReadBytes(`public.pem`)
if err != nil {
return nil, err
}
block, _ := pem.Decode(publicKey)
if block == nil {
return nil, errors.New("public key error")
}
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return nil, err
}
return rsa.EncryptPKCS1v15(rand.Reader, pubInterface.(*rsa.PublicKey), data)
}
func RSADecrypt(data []byte) ([]byte, error) {
privateKey, err := ReadBytes(`private.pem`)
if err != nil {
return nil, err
}
block, _ := pem.Decode(privateKey)
if block == nil {
return nil, errors.New("private key error")
}
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
return rsa.DecryptPKCS1v15(rand.Reader, priv, data)
}
其中public.pem是公鑰文件,private.pem是私鑰文件。
對稱加密有非常好的安全性,其加解密計算的性能也較高,但其有兩個重要缺點:
在如今開放的信息社會,秘鑰的管理愈加困難,非公開的秘鑰機(jī)制雖然破解較難,但還是有遭到攻擊的可能性,由于對稱加密需要加解密雙方共同握有私鑰,所有生成秘鑰的一方必須分發(fā)給另一方才能進(jìn)行安全通行,這就難免秘鑰在網(wǎng)絡(luò)中傳輸,網(wǎng)絡(luò)是不可靠的,其有可能被攔截或篡改。于是就產(chǎn)生了公開秘鑰體制,即服務(wù)方根據(jù)特定算法產(chǎn)生一對鑰匙串,自己持有私鑰小心保存,而公鑰公開分發(fā),在通信中,由公鑰加密進(jìn)行網(wǎng)絡(luò)傳輸,而傳輸?shù)男畔⒅荒苡伤借€解密,這就解決了秘鑰分發(fā)的問。公開秘鑰體制就是非對稱加密,非對稱加密一般有兩種用途:
如今的非對稱加密比較可靠的有RSA算法和ECC算法(橢圓曲線算法),RSA的受眾最多,但近年來隨著比特幣、區(qū)塊鏈的興起,ECC加密算法也越來越受到青睞。下面我們先介紹一下RSA加密算法的使用,ECC我們下一講展開。
公鑰密碼體系都是要基于一個困難問題來保證其安全性的,RSA是基于大數(shù)分解,將一個即使是計算機(jī)也無能為力的數(shù)學(xué)問題作為安全壁壘是現(xiàn)代密碼學(xué)的實現(xiàn)原理。講述這類數(shù)學(xué)問題需要龐雜的數(shù)論基礎(chǔ),此相關(guān)部分在此不再展開,感興趣的請出門右拐搜索歐幾里得證明、歐拉函數(shù)等數(shù)論部分知識。
Go標(biāo)準(zhǔn)庫中crypto/rsa包實現(xiàn)了RSA加解密算法,并通過crypto/x509包實現(xiàn)私鑰序列化為ASN.1的DER編碼字符串的方法,我們還使用編解碼包encoding/pem(實現(xiàn)了PEM數(shù)據(jù)編碼,該格式源自保密增強(qiáng)郵件協(xié)議,目前PEM編碼主要用于TLS密鑰和證書。)將公私鑰數(shù)據(jù)編碼為pem格式的證書文件。
使用以上加解密方法:
橢圓曲線密碼學(xué)(英語:Elliptic curve cryptography,縮寫為 ECC),一種建立公開密鑰加密的算法,基于橢圓曲線數(shù)學(xué)。橢圓曲線在密碼學(xué)中的使用是在1985年由Neal Koblitz和Victor Miller分別獨立提出的。
ECC的主要優(yōu)勢是在某些情況下它比其他的方法使用更小的密鑰——比如RSA加密算法——提供相當(dāng)?shù)幕蚋叩燃壍陌踩?/p>
橢圓曲線密碼學(xué)的許多形式有稍微的不同,所有的都依賴于被廣泛承認(rèn)的解決橢圓曲線離散對數(shù)問題的 困難性上。與傳統(tǒng)的基于大質(zhì)數(shù)因子分解困難性的加密方法不同,ECC通過橢圓曲線方程式的性質(zhì)產(chǎn)生密鑰。
ECC 164位的密鑰產(chǎn)生的一個安全級相當(dāng)于RSA 1024位密鑰提供的保密強(qiáng)度,而且計算量較小,處理速度 更快,存儲空間和傳輸帶寬占用較少。目前我國 居民二代身份證 正在使用 256 位的橢圓曲線密碼,虛擬 貨幣 比特幣 也選擇ECC作為加密算法。
具體算法詳解參考:
國密即國家密碼局認(rèn)定的國產(chǎn)密碼算法。主要有SM1,SM2,SM3,SM4。密鑰長度和分組長度均為128位。
SM1 為對稱加密。其加密強(qiáng)度與AES相當(dāng)。該算法不公開,調(diào)用該算法時,需要通過加密芯片的接口進(jìn)行調(diào)用。
SM2為非對稱加密,基于ECC。該算法已公開。由于該算法基于ECC,故其簽名速度與秘鑰生成速度都快于RSA。ECC 256位(SM2采用的就是ECC 256位的一種)安全強(qiáng)度比RSA 2048位高,但運算速度快于RSA。
國家密碼管理局公布的公鑰算法,其加密強(qiáng)度為256位
SM3 消息摘要。可以用MD5作為對比理解。該算法已公開。校驗結(jié)果為256位。
SM4 無線局域網(wǎng)標(biāo)準(zhǔn)的分組數(shù)據(jù)算法。對稱加密,密鑰長度和分組長度均為128位。
由于SM1、SM4加解密的分組大小為128bit,故對消息進(jìn)行加解密時,若消息長度過長,需要進(jìn)行分組,要消息長度不足,則要進(jìn)行填充。
分組密碼算法(DES和SM4)、將明文數(shù)據(jù)按固定長度進(jìn)行分組,然后在同一密鑰控制下逐組進(jìn)行加密,
公鑰密碼算法(RSA和SM2)、公開加密算法本身和公開公鑰,保存私鑰
摘要算法(SM3 md5) 這個都比較熟悉,用于數(shù)字簽名,消息認(rèn)證,數(shù)據(jù)完整性,但是sm3安全度比md5高
總得來說國密算法的安全度比較高,2010年12月推出,也是國家安全戰(zhàn)略,現(xiàn)在銀行都要要求國際算法改造,要把國際算法都給去掉
C 語言實現(xiàn)
Go 語言
Java 語言
Go語言實現(xiàn),調(diào)用 gmsm
RSA是目前使用最為廣泛的公鑰密碼算法,公鑰加密也稱為非對稱加密,與對稱加密的最大區(qū)別在于加密與解密使用不同的密鑰。
在RSA中,明文、密文和密鑰都是數(shù)字,假設(shè)公鑰用二元組(E,N)來表示,私鑰用(D,N)來表示,其中E、D、N都是數(shù)字,那么加解密過程可表示如下:
可見,在RSA中,不論加密還是解密,都可歸結(jié)為求x的y次冪對m取余問題。
生成RSA密鑰可分成以下4步:
首先準(zhǔn)備兩個很大的質(zhì)數(shù)p和q,那么N = p * q。
L = lcm(p-1, q-1)
由于存在恒等式gcd(a,b) * lcm(a,b) = a * b,求lcm可轉(zhuǎn)換為求gcd,而求gcd可通過歐幾里德算法在對數(shù)時間內(nèi)算出。
E是一個比1大、比L小的數(shù),且滿足E與L互質(zhì),即有:gcd(E,L)=1, 1 E L。gcd(E,L)=1是為了保證后面要求的數(shù)字D一定存在。
可不斷地生成[2,L-1]之間的隨機(jī)數(shù)作為E的候選數(shù),檢查是否滿足條件,直到找出符合要求的E為止。
至此,E和N都已求出,那么公鑰(E,N)也就得到了。
數(shù)D是由數(shù)E計算得到的,D、E和L之間滿足關(guān)系:E * D mod L = 1, 1 D L。
只要D滿足上述條件,那么通過E與N加密的內(nèi)容,就可通過D和N進(jìn)行解密。
求D也可采用類似求E的方法,不斷產(chǎn)生隨機(jī)數(shù)去試,直到找出滿足條件的D為止,這樣私鑰(D,N)也準(zhǔn)備好了。
為方面說明,這里用較小的數(shù)計算。先準(zhǔn)備兩個質(zhì)數(shù),例如,p=17, q=19,那么N=17*19=323,L=lcd(16,18)=144。
滿足gcd(E,L)=1的數(shù)很多,例如5,7,11,13,25等,這里取E=5。
滿足E*D mod L = 1的數(shù)也很多,這里取D=29。
到這里,公私鑰都有了,公鑰為(5,323),私鑰為(29,323),公鑰可任意公開,私鑰則保密。
明文必須是小于N的數(shù),因為加密運算中要求mod N。假設(shè)明文是123,用公鑰(5,323)對其加密:
再用私鑰(29,323)對密文225進(jìn)行解密:
解出的明文與原始明文一致。
當(dāng)前題目:go語言rsa公鑰加密 rsa加密算法
分享網(wǎng)址:http://www.chinadenli.net/article18/doogggp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站制作、網(wǎng)站改版、網(wǎng)站設(shè)計、面包屑導(dǎo)航、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)